From a6ad380cf0ec51561b4cc58fae98e5c68d28d325 Mon Sep 17 00:00:00 2001 From: Simon Josefsson Date: Mon, 7 Oct 2002 00:11:22 +0000 Subject: [PATCH] Initial release, version 0.0.0. --- AUTHORS | 1 + COPYING | 340 + COPYING.DOC | 355 + COPYING.LIB | 510 + ChangeLog | 9 + Makefile.am | 24 + NEWS | 12 + README | 50 + THANKS | 3 + argp/Makefile.am | 39 + argp/Versions | 14 + argp/acinclude.m4 | 14 + argp/aclocal.m4 | 957 ++ argp/argp-ba.c | 26 + argp/argp-eexst.c | 32 + argp/argp-fmtstream.c | 475 + argp/argp-fmtstream.h | 322 + argp/argp-fs-xinl.c | 41 + argp/argp-help.c | 1876 +++ argp/argp-namefrob.h | 96 + argp/argp-parse.c | 1293 ++ argp/argp-pv.c | 25 + argp/argp-pvh.c | 32 + argp/argp-test.c | 259 + argp/argp-xinl.c | 42 + argp/argp.h | 594 + argp/config.h.in | 133 + argp/configure | 5696 ++++++++ argp/configure.ac | 74 + argp/depcomp | 436 + argp/install-sh | 251 + argp/libargp.m4 | 159 + argp/mempcpy.c | 18 + argp/missing | 336 + argp/mkinstalldirs | 40 + argp/strchrnul.c | 21 + argp/strndup.c | 31 + autogen.sh | 27 + configure.ac | 238 + doc/Makefile.am | 145 + doc/fdl.texi | 403 + doc/gdoc | 747 + doc/gpl.texi | 394 + doc/gsasl-callback-authentication.texi | 20 + doc/gsasl-callback-authorization.texi | 20 + doc/gsasl-callback-client-service.texi | 39 + doc/gsasl-callback-cram-md5.texi | 17 + doc/gsasl-callback-digest-md5.texi | 18 + doc/gsasl-callback-gssapi.texi | 39 + doc/gsasl-callback-passcode.texi | 18 + doc/gsasl-callback-password.texi | 20 + doc/gsasl-callback-retrieve.texi | 25 + doc/gsasl-callback-securid.texi | 35 + doc/gsasl-callback-server-service.texi | 27 + doc/gsasl-callback-validate.texi | 17 + doc/gsasl-example1.c | 37 + doc/gsasl.texi | 944 ++ doc/lgpl.texi | 565 + doc/specification/draft-burdis-cat-srp-sasl-06.txt | 1848 +++ doc/specification/draft-burdis-cat-srp-sasl-07.txt | 2128 +++ .../draft-ietf-cat-sasl-gssapi-05.txt | 843 ++ .../draft-ietf-ldapext-x509-sasl-03.txt | 576 + doc/specification/draft-melnikov-rfc2831bis-00.txt | 1741 +++ doc/specification/draft-melnikov-rfc2831bis-01.txt | 1980 +++ .../draft-melnikov-sasl-digest-aes-00.txt | 184 + doc/specification/draft-myers-saslrev-02.txt | 958 ++ doc/specification/draft-naffah-cat-sasl-sm2-02.txt | 1459 ++ .../draft-nerenberg-sasl-crammd5-01.txt | 371 + .../draft-nerenberg-sasl-crammd5-02.txt | 371 + doc/specification/draft-newman-auth-scram-03.txt | 1457 ++ doc/specification/draft-newman-sasl-passdss-01.txt | 1122 ++ doc/specification/draft-newman-telnet-sasl-01.txt | 450 + .../draft-overell-roaming-elgamal-sasl-00.txt | 300 + doc/specification/draft-sasl-login.txt | 33 + doc/specification/draft-weltman-java-sasl-05.txt | 2043 +++ doc/specification/draft-zeilenga-sasl-anon-00.txt | 395 + doc/specification/draft-zeilenga-sasl-plain-00.txt | 339 + doc/specification/md5.txt | 78 + doc/specification/rfc1321.txt | 1179 ++ doc/specification/rfc1939.txt | 1291 ++ doc/specification/rfc2104.txt | 619 + doc/specification/rfc2195.txt | 283 + doc/specification/rfc2222.txt | 899 ++ doc/specification/rfc2243.txt | 563 + doc/specification/rfc2245.txt | 283 + doc/specification/rfc2289.txt | 1403 ++ doc/specification/rfc2444.txt | 395 + doc/specification/rfc2595.txt | 843 ++ doc/specification/rfc2808.txt | 619 + doc/specification/rfc2831.txt | 1515 ++ doc/specification/rfc2945.txt | 451 + doc/specification/rfc3163.txt | 955 ++ doc/specification/rfc3174.txt | 1235 ++ doc/specification/sasl-mechanisms | 114 + intl/ChangeLog | 4 + intl/Makefile.in | 337 + intl/VERSION | 1 + intl/bindtextdom.c | 369 + intl/config.charset | 466 + intl/dcgettext.c | 59 + intl/dcigettext.c | 1206 ++ intl/dcngettext.c | 61 + intl/dgettext.c | 59 + intl/dngettext.c | 61 + intl/eval-plural.h | 114 + intl/explodename.c | 192 + intl/finddomain.c | 198 + intl/gettext.c | 64 + intl/gettextP.h | 242 + intl/gmo.h | 148 + intl/hash-string.h | 59 + intl/intl-compat.c | 131 + intl/l10nflist.c | 453 + intl/libgnuintl.h | 296 + intl/loadinfo.h | 156 + intl/loadmsgcat.c | 1316 ++ intl/localcharset.c | 369 + intl/locale.alias | 78 + intl/localealias.c | 419 + intl/localename.c | 772 ++ intl/ngettext.c | 68 + intl/os2compat.c | 98 + intl/os2compat.h | 46 + intl/osdep.c | 24 + intl/plural-exp.c | 156 + intl/plural-exp.h | 126 + intl/plural.y | 409 + intl/ref-add.sin | 31 + intl/ref-del.sin | 26 + intl/textdomain.c | 142 + lib/CaseFolding-3.2.0.txt | 912 ++ lib/CompositionExclusions-3.2.0.txt | 176 + lib/LineBreak-3.2.0.txt | 13889 +++++++++++++++++++ lib/Makefile.am | 52 + lib/SpecialCasing-3.2.0.txt | 255 + lib/UnicodeData-3.2.0.txt | 13874 ++++++++++++++++++ lib/anonymous.c | 187 + lib/anonymous.h | 53 + lib/base64.c | 331 + lib/callback.c | 841 ++ lib/common.c | 172 + lib/cram-md5.c | 388 + lib/cram-md5.h | 59 + lib/digest-md5.c | 1742 +++ lib/digest-md5.h | 59 + lib/done.c | 54 + lib/error.c | 203 + lib/external.c | 150 + lib/external.h | 53 + lib/gen-unicode-tables.pl | 1169 ++ lib/gettext.h | 69 + lib/gsasl.h.in | 380 + lib/gssapi.c | 582 + lib/gunibreak.h | 6640 +++++++++ lib/gunicomp.h | 656 + lib/gunidecomp.h | 6972 ++++++++++ lib/hexdump.c | 42 + lib/init.c | 120 + lib/internal.h | 105 + lib/listmech.c | 107 + lib/login.c | 335 + lib/login.h | 53 + lib/md5pwd.c | 98 + lib/ntlm.c | 197 + lib/plain.c | 298 + lib/plain.h | 53 + lib/securid.c | 310 + lib/securid.h | 53 + lib/suggest.c | 54 + lib/supportp.c | 62 + lib/unicode.c | 667 + lib/version.c | 103 + lib/x-gssapi.h | 53 + lib/x-ntlm.h | 56 + lib/xfinish.c | 52 + lib/xstart.c | 114 + lib/xstep.c | 195 + m4/ChangeLog | 21 + m4/Makefile.am | 1 + m4/codeset.m4 | 23 + m4/gettext.m4 | 587 + m4/glibc21.m4 | 32 + m4/iconv.m4 | 103 + m4/intdiv0.m4 | 72 + m4/inttypes-pri.m4 | 32 + m4/inttypes.m4 | 27 + m4/inttypes_h.m4 | 28 + m4/isc-posix.m4 | 26 + m4/lcmessage.m4 | 32 + m4/lib-ld.m4 | 97 + m4/lib-link.m4 | 554 + m4/lib-prefix.m4 | 148 + m4/libntlm.m4 | 76 + m4/progtest.m4 | 59 + m4/stdint_h.m4 | 28 + m4/uintmax_t.m4 | 29 + m4/ulonglong.m4 | 23 + po/ChangeLog | 11 + po/LINGUAS | 2 + po/Makefile.in.in | 317 + po/Makevars | 25 + po/Makevars.template | 25 + po/POTFILES.in | 5 + po/Rules-quot | 42 + po/boldquot.sed | 10 + po/en@boldquot.header | 25 + po/en@quot.header | 22 + po/insert-header.sin | 23 + po/libgsasl.pot | 232 + po/quot.sed | 6 + po/remove-potcdate.sin | 19 + po/sv.po | 266 + src/Makefile.am | 34 + src/callbacks.c | 525 + src/callbacks.h | 121 + src/gettext.h | 69 + src/gsasl.c | 446 + src/libcharset/Makefile.am | 61 + src/libcharset/README | 46 + src/libcharset/config.charset | 466 + src/libcharset/libcharset-gsasl.patch | 45 + src/libcharset/libcharset.h | 41 + src/libcharset/localcharset.c | 369 + src/libcharset/localcharset.c.orig | 369 + src/libcharset/make-patch.sh | 23 + src/libcharset/ref-add.sin | 31 + src/libcharset/ref-del.sin | 26 + src/libcharset/update.sh | 23 + src/libgsasl-config.in | 100 + src/libgsasl.m4 | 76 + tests/Makefile.am | 32 + tests/plain-client.sh | 63 + tests/unicode.c | 182 + 233 files changed, 117731 insertions(+) create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 COPYING.DOC create mode 100644 COPYING.LIB create mode 100644 ChangeLog create mode 100644 Makefile.am create mode 100644 NEWS create mode 100644 README create mode 100644 THANKS create mode 100644 argp/Makefile.am create mode 100644 argp/Versions create mode 100644 argp/acinclude.m4 create mode 100644 argp/aclocal.m4 create mode 100644 argp/argp-ba.c create mode 100644 argp/argp-eexst.c create mode 100644 argp/argp-fmtstream.c create mode 100644 argp/argp-fmtstream.h create mode 100644 argp/argp-fs-xinl.c create mode 100644 argp/argp-help.c create mode 100644 argp/argp-namefrob.h create mode 100644 argp/argp-parse.c create mode 100644 argp/argp-pv.c create mode 100644 argp/argp-pvh.c create mode 100644 argp/argp-test.c create mode 100644 argp/argp-xinl.c create mode 100644 argp/argp.h create mode 100644 argp/config.h.in create mode 100755 argp/configure create mode 100644 argp/configure.ac create mode 100755 argp/depcomp create mode 100755 argp/install-sh create mode 100644 argp/libargp.m4 create mode 100644 argp/mempcpy.c create mode 100755 argp/missing create mode 100755 argp/mkinstalldirs create mode 100644 argp/strchrnul.c create mode 100644 argp/strndup.c create mode 100755 autogen.sh create mode 100644 configure.ac create mode 100644 doc/Makefile.am create mode 100644 doc/fdl.texi create mode 100755 doc/gdoc create mode 100644 doc/gpl.texi create mode 100644 doc/gsasl-callback-authentication.texi create mode 100644 doc/gsasl-callback-authorization.texi create mode 100644 doc/gsasl-callback-client-service.texi create mode 100644 doc/gsasl-callback-cram-md5.texi create mode 100644 doc/gsasl-callback-digest-md5.texi create mode 100644 doc/gsasl-callback-gssapi.texi create mode 100644 doc/gsasl-callback-passcode.texi create mode 100644 doc/gsasl-callback-password.texi create mode 100644 doc/gsasl-callback-retrieve.texi create mode 100644 doc/gsasl-callback-securid.texi create mode 100644 doc/gsasl-callback-server-service.texi create mode 100644 doc/gsasl-callback-validate.texi create mode 100644 doc/gsasl-example1.c create mode 100644 doc/gsasl.texi create mode 100644 doc/lgpl.texi create mode 100644 doc/specification/draft-burdis-cat-srp-sasl-06.txt create mode 100644 doc/specification/draft-burdis-cat-srp-sasl-07.txt create mode 100644 doc/specification/draft-ietf-cat-sasl-gssapi-05.txt create mode 100644 doc/specification/draft-ietf-ldapext-x509-sasl-03.txt create mode 100644 doc/specification/draft-melnikov-rfc2831bis-00.txt create mode 100644 doc/specification/draft-melnikov-rfc2831bis-01.txt create mode 100644 doc/specification/draft-melnikov-sasl-digest-aes-00.txt create mode 100644 doc/specification/draft-myers-saslrev-02.txt create mode 100644 doc/specification/draft-naffah-cat-sasl-sm2-02.txt create mode 100644 doc/specification/draft-nerenberg-sasl-crammd5-01.txt create mode 100644 doc/specification/draft-nerenberg-sasl-crammd5-02.txt create mode 100644 doc/specification/draft-newman-auth-scram-03.txt create mode 100644 doc/specification/draft-newman-sasl-passdss-01.txt create mode 100644 doc/specification/draft-newman-telnet-sasl-01.txt create mode 100644 doc/specification/draft-overell-roaming-elgamal-sasl-00.txt create mode 100644 doc/specification/draft-sasl-login.txt create mode 100644 doc/specification/draft-weltman-java-sasl-05.txt create mode 100644 doc/specification/draft-zeilenga-sasl-anon-00.txt create mode 100644 doc/specification/draft-zeilenga-sasl-plain-00.txt create mode 100644 doc/specification/md5.txt create mode 100644 doc/specification/rfc1321.txt create mode 100644 doc/specification/rfc1939.txt create mode 100644 doc/specification/rfc2104.txt create mode 100644 doc/specification/rfc2195.txt create mode 100644 doc/specification/rfc2222.txt create mode 100644 doc/specification/rfc2243.txt create mode 100644 doc/specification/rfc2245.txt create mode 100644 doc/specification/rfc2289.txt create mode 100644 doc/specification/rfc2444.txt create mode 100644 doc/specification/rfc2595.txt create mode 100644 doc/specification/rfc2808.txt create mode 100644 doc/specification/rfc2831.txt create mode 100644 doc/specification/rfc2945.txt create mode 100644 doc/specification/rfc3163.txt create mode 100644 doc/specification/rfc3174.txt create mode 100644 doc/specification/sasl-mechanisms create mode 100644 intl/ChangeLog create mode 100644 intl/Makefile.in create mode 100644 intl/VERSION create mode 100644 intl/bindtextdom.c create mode 100755 intl/config.charset create mode 100644 intl/dcgettext.c create mode 100644 intl/dcigettext.c create mode 100644 intl/dcngettext.c create mode 100644 intl/dgettext.c create mode 100644 intl/dngettext.c create mode 100644 intl/eval-plural.h create mode 100644 intl/explodename.c create mode 100644 intl/finddomain.c create mode 100644 intl/gettext.c create mode 100644 intl/gettextP.h create mode 100644 intl/gmo.h create mode 100644 intl/hash-string.h create mode 100644 intl/intl-compat.c create mode 100644 intl/l10nflist.c create mode 100644 intl/libgnuintl.h create mode 100644 intl/loadinfo.h create mode 100644 intl/loadmsgcat.c create mode 100644 intl/localcharset.c create mode 100644 intl/locale.alias create mode 100644 intl/localealias.c create mode 100644 intl/localename.c create mode 100644 intl/ngettext.c create mode 100644 intl/os2compat.c create mode 100644 intl/os2compat.h create mode 100644 intl/osdep.c create mode 100644 intl/plural-exp.c create mode 100644 intl/plural-exp.h create mode 100644 intl/plural.y create mode 100644 intl/ref-add.sin create mode 100644 intl/ref-del.sin create mode 100644 intl/textdomain.c create mode 100644 lib/CaseFolding-3.2.0.txt create mode 100644 lib/CompositionExclusions-3.2.0.txt create mode 100644 lib/LineBreak-3.2.0.txt create mode 100644 lib/Makefile.am create mode 100644 lib/SpecialCasing-3.2.0.txt create mode 100644 lib/UnicodeData-3.2.0.txt create mode 100644 lib/anonymous.c create mode 100644 lib/anonymous.h create mode 100644 lib/base64.c create mode 100644 lib/callback.c create mode 100644 lib/common.c create mode 100644 lib/cram-md5.c create mode 100644 lib/cram-md5.h create mode 100644 lib/digest-md5.c create mode 100644 lib/digest-md5.h create mode 100644 lib/done.c create mode 100644 lib/error.c create mode 100644 lib/external.c create mode 100644 lib/external.h create mode 100755 lib/gen-unicode-tables.pl create mode 100644 lib/gettext.h create mode 100644 lib/gsasl.h.in create mode 100644 lib/gssapi.c create mode 100644 lib/gunibreak.h create mode 100644 lib/gunicomp.h create mode 100644 lib/gunidecomp.h create mode 100644 lib/hexdump.c create mode 100644 lib/init.c create mode 100644 lib/internal.h create mode 100644 lib/listmech.c create mode 100644 lib/login.c create mode 100644 lib/login.h create mode 100644 lib/md5pwd.c create mode 100644 lib/ntlm.c create mode 100644 lib/plain.c create mode 100644 lib/plain.h create mode 100644 lib/securid.c create mode 100644 lib/securid.h create mode 100644 lib/suggest.c create mode 100644 lib/supportp.c create mode 100644 lib/unicode.c create mode 100644 lib/version.c create mode 100644 lib/x-gssapi.h create mode 100644 lib/x-ntlm.h create mode 100644 lib/xfinish.c create mode 100644 lib/xstart.c create mode 100644 lib/xstep.c create mode 100644 m4/ChangeLog create mode 100644 m4/Makefile.am create mode 100644 m4/codeset.m4 create mode 100644 m4/gettext.m4 create mode 100644 m4/glibc21.m4 create mode 100644 m4/iconv.m4 create mode 100644 m4/intdiv0.m4 create mode 100644 m4/inttypes-pri.m4 create mode 100644 m4/inttypes.m4 create mode 100644 m4/inttypes_h.m4 create mode 100644 m4/isc-posix.m4 create mode 100644 m4/lcmessage.m4 create mode 100644 m4/lib-ld.m4 create mode 100644 m4/lib-link.m4 create mode 100644 m4/lib-prefix.m4 create mode 100644 m4/libntlm.m4 create mode 100644 m4/progtest.m4 create mode 100644 m4/stdint_h.m4 create mode 100644 m4/uintmax_t.m4 create mode 100644 m4/ulonglong.m4 create mode 100644 po/ChangeLog create mode 100644 po/LINGUAS create mode 100644 po/Makefile.in.in create mode 100644 po/Makevars create mode 100644 po/Makevars.template create mode 100644 po/POTFILES.in create mode 100644 po/Rules-quot create mode 100644 po/boldquot.sed create mode 100644 po/en@boldquot.header create mode 100644 po/en@quot.header create mode 100644 po/insert-header.sin create mode 100644 po/libgsasl.pot create mode 100644 po/quot.sed create mode 100644 po/remove-potcdate.sin create mode 100644 po/sv.po create mode 100644 src/Makefile.am create mode 100644 src/callbacks.c create mode 100644 src/callbacks.h create mode 100644 src/gettext.h create mode 100644 src/gsasl.c create mode 100644 src/libcharset/Makefile.am create mode 100644 src/libcharset/README create mode 100755 src/libcharset/config.charset create mode 100644 src/libcharset/libcharset-gsasl.patch create mode 100644 src/libcharset/libcharset.h create mode 100644 src/libcharset/localcharset.c create mode 100644 src/libcharset/localcharset.c.orig create mode 100755 src/libcharset/make-patch.sh create mode 100644 src/libcharset/ref-add.sin create mode 100644 src/libcharset/ref-del.sin create mode 100755 src/libcharset/update.sh create mode 100644 src/libgsasl-config.in create mode 100644 src/libgsasl.m4 create mode 100644 tests/Makefile.am create mode 100755 tests/plain-client.sh create mode 100644 tests/unicode.c diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..e280084 --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +Simon Josefsson diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d60c31a --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/COPYING.DOC b/COPYING.DOC new file mode 100644 index 0000000..b42936b --- /dev/null +++ b/COPYING.DOC @@ -0,0 +1,355 @@ + GNU Free Documentation License + Version 1.1, March 2000 + + Copyright (C) 2000 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + +0. PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +written document "free" in the sense of freedom: to assure everyone +the effective freedom to copy and redistribute it, with or without +modifying it, either commercially or noncommercially. Secondarily, +this License preserves for the author and publisher a way to get +credit for their work, while not being considered responsible for +modifications made by others. + +This License is a kind of "copyleft", which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + + +1. APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work that contains a +notice placed by the copyright holder saying it can be distributed +under the terms of this License. The "Document", below, refers to any +such manual or work. Any member of the public is a licensee, and is +addressed as "you". + +A "Modified Version" of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A "Secondary Section" is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall subject +(or to related matters) and contains nothing that could fall directly +within that overall subject. (For example, if the Document is in part a +textbook of mathematics, a Secondary Section may not explain any +mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The "Invariant Sections" are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. + +The "Cover Texts" are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. + +A "Transparent" copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, whose contents can be viewed and edited directly and +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup has been designed to thwart or discourage +subsequent modification by readers is not Transparent. A copy that is +not "Transparent" is called "Opaque". + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input format, SGML +or XML using a publicly available DTD, and standard-conforming simple +HTML designed for human modification. Opaque formats include +PostScript, PDF, proprietary formats that can be read and edited only +by proprietary word processors, SGML or XML for which the DTD and/or +processing tools are not generally available, and the +machine-generated HTML produced by some word processors for output +purposes only. + +The "Title Page" means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, "Title Page" means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + + +2. VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + + +3. COPYING IN QUANTITY + +If you publish printed copies of the Document numbering more than 100, +and the Document's license notice requires Cover Texts, you must enclose +the copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a publicly-accessible computer-network location containing a complete +Transparent copy of the Document, free of added material, which the +general network-using public has access to download anonymously at no +charge using public-standard network protocols. If you use the latter +option, you must take reasonably prudent steps, when you begin +distribution of Opaque copies in quantity, to ensure that this +Transparent copy will remain thus accessible at the stated location +until at least one year after the last time you distribute an Opaque +copy (directly or through your agents or retailers) of that edition to +the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + + +4. MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +A. Use in the Title Page (and on the covers, if any) a title distinct + from that of the Document, and from those of previous versions + (which should, if there were any, be listed in the History section + of the Document). You may use the same title as a previous version + if the original publisher of that version gives permission. +B. List on the Title Page, as authors, one or more persons or entities + responsible for authorship of the modifications in the Modified + Version, together with at least five of the principal authors of the + Document (all of its principal authors, if it has less than five). +C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. +D. Preserve all the copyright notices of the Document. +E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. +F. Include, immediately after the copyright notices, a license notice + giving the public permission to use the Modified Version under the + terms of this License, in the form shown in the Addendum below. +G. Preserve in that license notice the full lists of Invariant Sections + and required Cover Texts given in the Document's license notice. +H. Include an unaltered copy of this License. +I. Preserve the section entitled "History", and its title, and add to + it an item stating at least the title, year, new authors, and + publisher of the Modified Version as given on the Title Page. If + there is no section entitled "History" in the Document, create one + stating the title, year, authors, and publisher of the Document as + given on its Title Page, then add an item describing the Modified + Version as stated in the previous sentence. +J. Preserve the network location, if any, given in the Document for + public access to a Transparent copy of the Document, and likewise + the network locations given in the Document for previous versions + it was based on. These may be placed in the "History" section. + You may omit a network location for a work that was published at + least four years before the Document itself, or if the original + publisher of the version it refers to gives permission. +K. In any section entitled "Acknowledgements" or "Dedications", + preserve the section's title, and preserve in the section all the + substance and tone of each of the contributor acknowledgements + and/or dedications given therein. +L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section titles. +M. Delete any section entitled "Endorsements". Such a section + may not be included in the Modified Version. +N. Do not retitle any existing section as "Endorsements" + or to conflict in title with any Invariant Section. + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section entitled "Endorsements", provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + + +5. COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections entitled "History" +in the various original documents, forming one section entitled +"History"; likewise combine any sections entitled "Acknowledgements", +and any sections entitled "Dedications". You must delete all sections +entitled "Endorsements." + + +6. COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + + +7. AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, does not as a whole count as a Modified Version +of the Document, provided no compilation copyright is claimed for the +compilation. Such a compilation is called an "aggregate", and this +License does not apply to the other self-contained works thus compiled +with the Document, on account of their being thus compiled, if they +are not themselves derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one quarter +of the entire aggregate, the Document's Cover Texts may be placed on +covers that surround only the Document within the aggregate. +Otherwise they must appear on covers around the whole aggregate. + + +8. TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License provided that you also include the +original English version of this License. In case of a disagreement +between the translation and the original English version of this +License, the original English version will prevail. + + +9. TERMINATION + +You may not copy, modify, sublicense, or distribute the Document except +as expressly provided for under this License. Any other attempt to +copy, modify, sublicense or distribute the Document is void, and will +automatically terminate your rights under this License. However, +parties who have received copies, or rights, from you under this +License will not have their licenses terminated so long as such +parties remain in full compliance. + + +10. FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +http://www.gnu.org/copyleft/. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. + + +ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + + Copyright (c) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.1 + or any later version published by the Free Software Foundation; + with the Invariant Sections being LIST THEIR TITLES, with the + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. + A copy of the license is included in the section entitled "GNU + Free Documentation License". + +If you have no Invariant Sections, write "with no Invariant Sections" +instead of saying which ones are invariant. If you have no +Front-Cover Texts, write "no Front-Cover Texts" instead of +"Front-Cover Texts being LIST"; likewise for Back-Cover Texts. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. diff --git a/COPYING.LIB b/COPYING.LIB new file mode 100644 index 0000000..cf9b6b9 --- /dev/null +++ b/COPYING.LIB @@ -0,0 +1,510 @@ + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations +below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. +^L + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it +becomes a de-facto standard. To achieve this, non-free programs must +be allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. +^L + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control +compilation and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. +^L + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. +^L + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at least + three years, to give the same user the materials specified in + Subsection 6a, above, for a charge no more than the cost of + performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. +^L + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. +^L + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply, and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License +may add an explicit geographical distribution limitation excluding those +countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. +^L + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS +^L + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms +of the ordinary General Public License). + + To apply these terms, attach the following notices to the library. +It is safest to attach them to the start of each source file to most +effectively convey the exclusion of warranty; and each file should +have at least the "copyright" line and a pointer to where the full +notice is found. + + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or +your school, if any, to sign a "copyright disclaimer" for the library, +if necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James + Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..b4025df --- /dev/null +++ b/ChangeLog @@ -0,0 +1,9 @@ +2002-10-07 gettextize + + * Makefile.am (SUBDIRS): Add intl, + (EXTRA_DIST): Add config.rpath mkinstalldirs. + * configure.ac (AC_CONFIG_FILES): Add intl/Makefile, + +2002-10-07 Simon Josefsson + + * Version 0.0.0 released. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..ef0efd9 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,24 @@ +## Process this file with automake to produce Makefile.in +# Copyright (C) 2002 Simon Josefsson. +# +# This file is part of Libgsasl. +# +# Libgsasl is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of +# the License, or (at your option) any later version. +# +# Libgsasl 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 program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +SUBDIRS = m4 intl po argp lib src tests doc + +ACLOCAL_AMFLAGS = -I m4 -I argp + +EXTRA_DIST = config.rpath mkinstalldirs diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..3922dda --- /dev/null +++ b/NEWS @@ -0,0 +1,12 @@ +Libgsasl NEWS -- history of user-visible changes. + +* Changes in 0.0.0 (released 2002-10-07) + +** Initial release. + +---------------------------------------------------------------------- + +Local variables: +mode: outline +paragraph-separate: "[ ]*$" +end: diff --git a/README b/README new file mode 100644 index 0000000..4409ea1 --- /dev/null +++ b/README @@ -0,0 +1,50 @@ +This directory holds the library `libgsasl', which implement the +Simple Authentication and Security Layer (SASL), and an application +`gsasl' for interfacing with the library from the command line. + +Libgsasl is unstable and in its early steps of development. You +should expect it to not work as well as having security problems. +Currently there is some support for the following mechanisms: + + - CRAM-MD5 (RFC 2195, requires libgcrypt) + - EXTERNAL (RFC 2222) + - GSSAPI (RFC 2222, client only, requires MIT Kerberos 5 GSSAPI library) + - ANONYMOUS (RFC 2245) + - PLAIN (RFC 2595) + - SECURID (RFC 2808) + - DIGEST-MD5 (RFC 2831, requires libgcrypt) + - LOGIN (non-standard) + - NTLM (non-standard, client only, requires libntlm) + +You probably need GNU make to build libgsasl (i.e., it sometimes work +with other make tools but not reliably). Libgsasl has at some point +in time built on the following systems, but no guarantees. + + - alphaev67-dec-osf5.0 (Tru64 UNIX C, GNU make) + - i686-pc-linux-gnu (Debian unstable) + - i686-pc-linux-gnu (RedHat 7.2) + - mips-sgi-irix6.5 (MIPS C compiler, GNU make) + - rs6000-ibm-aix4.3.2.0 (GCC 2.9-aix43-000718, GNU make) + - rs6000-ibm-aix4.3.2.0 (IBM C for AIX compiler, GNU make) + - sparc-sun-solaris2.6 (Sun WorkShop Compiler C 5.0, non-GNU make) + +Things left to do below. If you like to start working on anything, +please let me know so work duplication can be avoided. + + * Encryption/integrity layers (gsasl_encode() and gsasl_decode()) + * Authentication infrastructure implementing the callbacks for + PAM, Kerberos, SQL, etc. Separate project? + + Port applications to use libgsasl + + More SASL mechanisms + - Improve documentation + - Port to Cyclone? + +The library (lib/) is licensed under the GNU Lesser Public License +license (see COPYING.LIB), the application (src/) is licensed under +the GNU Public License (see COPYING), and the documentation (doc/) is +licensed under the GNU Free Documentation License (see COPYING.DOC). + +For mailing list information and archives, and other updates to the +project, see . + +Send all bug reports by electronic mail to bug-libgsasl@josefsson.org. diff --git a/THANKS b/THANKS new file mode 100644 index 0000000..8b2e4af --- /dev/null +++ b/THANKS @@ -0,0 +1,3 @@ +Libgsasl uses libntlm by Grant Edwards, libgssapi by MIT, libgcrypt by +Werner Koch. Templates for makefiles, manuals etc was borrowed from +Libgcrypt. diff --git a/argp/Makefile.am b/argp/Makefile.am new file mode 100644 index 0000000..5be411e --- /dev/null +++ b/argp/Makefile.am @@ -0,0 +1,39 @@ +# From glibc + +# Copyright (C) 1997 Free Software Foundation, Inc. +# This file is part of the GNU C Library. + +# The GNU C Library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public License as +# published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version. + +# The GNU C 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 +# Library General Public License for more details. + +# You should have received a copy of the GNU Library General Public +# License along with the GNU C Library; see the file COPYING.LIB. If +# not, write to the Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +AUTOMAKE_OPTIONS = foreign + +noinst_LIBRARIES = libargp.a +noinst_PROGRAMS = argp-test +noinst_HEADERS = argp.h argp-fmtstream.h argp-namefrob.h # argp-comp.h + +all: libargp.a + +EXTRA_DIST = mempcpy.c strchrnul.c strndup.c Versions libargp.m4 + +# Leaves out argp-fs-xinl.c and argp-xinl.c +libargp_a_SOURCES = argp-ba.c argp-eexst.c argp-fmtstream.c \ + argp-help.c argp-parse.c argp-pv.c \ + argp-pvh.c argp-eexst.c + +libargp_a_LIBADD = @LIBOBJS@ + +argp_test_LDADD = libargp.a + diff --git a/argp/Versions b/argp/Versions new file mode 100644 index 0000000..378320c --- /dev/null +++ b/argp/Versions @@ -0,0 +1,14 @@ +libc { + GLIBC_2.1 { + # variables in normal name space + argp_err_exit_status; argp_program_bug_address; argp_program_version; + argp_program_version_hook; + + # a* + argp_error; argp_failure; argp_help; argp_parse; argp_state_help; + argp_usage; + + # kludge for recursive argp callers that know the magic. + _argp_unlock_xxx; + } +} diff --git a/argp/acinclude.m4 b/argp/acinclude.m4 new file mode 100644 index 0000000..a849b4a --- /dev/null +++ b/argp/acinclude.m4 @@ -0,0 +1,14 @@ +dnl ARGP_CHECK_VAR(VAR, INCLUDES) +AC_DEFUN(ARGP_CHECK_VAR, +[ AC_CACHE_CHECK( + [for $1], + lsh_cv_var_$1, + AC_TRY_LINK([$2], [void *p = (void *) &$1;], + [lsh_cv_var_$1=yes], + [lsh_cv_var_$1=no])) + if eval "test \"`echo '$lsh_cv_var_'$1`\" = yes"; then + AC_DEFINE_UNQUOTED( + [HAVE_`echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`], 1, + [Define if the variable exists (usually provided by the linker).]) + fi +]) diff --git a/argp/aclocal.m4 b/argp/aclocal.m4 new file mode 100644 index 0000000..f7ec48a --- /dev/null +++ b/argp/aclocal.m4 @@ -0,0 +1,957 @@ +# aclocal.m4 generated automatically by aclocal 1.6.3 -*- Autoconf -*- + +# Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 +# Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +dnl ARGP_CHECK_VAR(VAR, INCLUDES) +AC_DEFUN(ARGP_CHECK_VAR, +[ AC_CACHE_CHECK( + [for $1], + lsh_cv_var_$1, + AC_TRY_LINK([$2], [void *p = (void *) &$1;], + [lsh_cv_var_$1=yes], + [lsh_cv_var_$1=no])) + if eval "test \"`echo '$lsh_cv_var_'$1`\" = yes"; then + AC_DEFINE_UNQUOTED( + [HAVE_`echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`], 1, + [Define if the variable exists (usually provided by the linker).]) + fi +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# This macro actually does too much some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 8 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +AC_PREREQ([2.52]) + +# Autoconf 2.50 wants to disallow AM_ names. We explicitly allow +# the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl + AC_REQUIRE([AC_PROG_INSTALL])dnl +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl + AC_SUBST([PACKAGE], [AC_PACKAGE_TARNAME])dnl + AC_SUBST([VERSION], [AC_PACKAGE_VERSION])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_MISSING_PROG(AMTAR, tar) +AM_PROG_INSTALL_SH +AM_PROG_INSTALL_STRIP +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl + +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_][CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_][CC], + defn([AC_PROG_][CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_][CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_][CXX], + defn([AC_PROG_][CXX])[_AM_DEPENDENCIES(CXX)])])dnl +]) +]) + +# Copyright 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +AC_DEFUN([AM_AUTOMAKE_VERSION],[am__api_version="1.6"]) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION so it can be traced. +# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], + [AM_AUTOMAKE_VERSION([1.6.3])]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright 2001, 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 2 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# +# Check to make sure that the build environment is sane. +# + +# Copyright 1996, 1997, 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# -*- Autoconf -*- + + +# Copyright 1997, 1999, 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# AM_AUX_DIR_EXPAND + +# Copyright 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +# Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50]) + +AC_DEFUN([AM_AUX_DIR_EXPAND], [ +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. + +# Copyright 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +install_sh=${install_sh-"$am_aux_dir/install-sh"} +AC_SUBST(install_sh)]) + +# AM_PROG_INSTALL_STRIP + +# Copyright 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# serial 4 -*- Autoconf -*- + +# Copyright 1999, 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + for depmode in $am_compiler_list; do + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + echo '#include "conftest.h"' > conftest.c + echo 'int i;' > conftest.h + echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=conftest.c object=conftest.o \ + depfile=conftest.Po tmpdepfile=conftest.TPo \ + $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 && + grep conftest.h conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[rm -f .deps 2>/dev/null +mkdir .deps 2>/dev/null +if test -d .deps; then + DEPDIR=.deps +else + # MS-DOS does not allow filenames that begin with a dot. + DEPDIR=_deps +fi +rmdir .deps 2>/dev/null +AC_SUBST([DEPDIR]) +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking Speeds up one-time builds + --enable-dependency-tracking Do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH]) +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +#serial 2 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + grep '^DEP_FILES *= *[[^ @%:@]]' < "$mf" > /dev/null || continue + # Extract the definition of DEP_FILES from the Makefile without + # running `make'. + DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` + test -z "$DEPDIR" && continue + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n -e '/^U = / s///p' < "$mf"` + test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" + # We invoke sed twice because it is the simplest approach to + # changing $(DEPDIR) to its actual value in the expansion. + for file in `sed -n -e ' + /^DEP_FILES = .*\\\\$/ { + s/^DEP_FILES = // + :loop + s/\\\\$// + p + n + /\\\\$/ b loop + p + } + /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Copyright 2001 Free Software Foundation, Inc. -*- Autoconf -*- + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 2 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +doit: + @echo done +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | fgrep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi +AC_SUBST(am__include) +AC_SUBST(am__quote) +AC_MSG_RESULT($_am_result) +rm -f confinc confmf +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright 1997, 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 5 + +AC_PREREQ(2.52) + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE]) +AC_SUBST([$1_FALSE]) +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([conditional \"$1\" was never defined. +Usually this means the macro was only invoked conditionally.]) +fi])]) + +# Like AC_CONFIG_HEADER, but automatically create stamp file. -*- Autoconf -*- + +# Copyright 1996, 1997, 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_PREREQ([2.52]) + +# serial 6 + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. We must strip everything past the first ":", +# and everything past the last "/". + +# _AM_DIRNAME(PATH) +# ----------------- +# Like AS_DIRNAME, only do it during macro expansion +AC_DEFUN([_AM_DIRNAME], + [m4_if(regexp([$1], [^.*[^/]//*[^/][^/]*/*$]), -1, + m4_if(regexp([$1], [^//\([^/]\|$\)]), -1, + m4_if(regexp([$1], [^/.*]), -1, + [.], + patsubst([$1], [^\(/\).*], [\1])), + patsubst([$1], [^\(//\)\([^/].*\|$\)], [\1])), + patsubst([$1], [^\(.*[^/]\)//*[^/][^/]*/*$], [\1]))[]dnl +])# _AM_DIRNAME + + +# The stamp files are numbered to have different names. +# We could number them on a directory basis, but that's additional +# complications, let's have a unique counter. +m4_define([_AM_STAMP_Count], [0]) + + +# _AM_STAMP(HEADER) +# ----------------- +# The name of the stamp file for HEADER. +AC_DEFUN([_AM_STAMP], +[m4_define([_AM_STAMP_Count], m4_incr(_AM_STAMP_Count))dnl +AS_ESCAPE(_AM_DIRNAME(patsubst([$1], + [:.*])))/stamp-h[]_AM_STAMP_Count]) + + +# _AM_CONFIG_HEADER(HEADER[:SOURCES], COMMANDS, INIT-COMMANDS) +# ------------------------------------------------------------ +# We used to try to get a real timestamp in stamp-h. But the fear is that +# that will cause unnecessary cvs conflicts. +AC_DEFUN([_AM_CONFIG_HEADER], +[# Add the stamp file to the list of files AC keeps track of, +# along with our hook. +AC_CONFIG_HEADERS([$1], + [# update the timestamp +echo 'timestamp for $1' >"_AM_STAMP([$1])" +$2], + [$3]) +])# _AM_CONFIG_HEADER + + +# AM_CONFIG_HEADER(HEADER[:SOURCES]..., COMMANDS, INIT-COMMANDS) +# -------------------------------------------------------------- +AC_DEFUN([AM_CONFIG_HEADER], +[AC_FOREACH([_AM_File], [$1], [_AM_CONFIG_HEADER(_AM_File, [$2], [$3])]) +])# AM_CONFIG_HEADER + + +# Copyright 1996, 1997, 1999, 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 1 + +# @defmac AC_PROG_CC_STDC +# @maindex PROG_CC_STDC +# @ovindex CC +# If the C compiler in not in ANSI C mode by default, try to add an option +# to output variable @code{CC} to make it so. This macro tries various +# options that select ANSI C on some system or another. It considers the +# compiler to be in ANSI C mode if it handles function prototypes correctly. +# +# If you use this macro, you should check after calling it whether the C +# compiler has been set to accept ANSI C; if not, the shell variable +# @code{am_cv_prog_cc_stdc} is set to @samp{no}. If you wrote your source +# code in ANSI C, you can make an un-ANSIfied copy of it by using the +# program @code{ansi2knr}, which comes with Ghostscript. +# @end defmac + +AC_DEFUN([AM_PROG_CC_STDC], +[AC_REQUIRE([AC_PROG_CC]) +AC_BEFORE([$0], [AC_C_INLINE]) +AC_BEFORE([$0], [AC_C_CONST]) +dnl Force this before AC_PROG_CPP. Some cpp's, eg on HPUX, require +dnl a magic option to avoid problems with ANSI preprocessor commands +dnl like #elif. +dnl FIXME: can't do this because then AC_AIX won't work due to a +dnl circular dependency. +dnl AC_BEFORE([$0], [AC_PROG_CPP]) +AC_MSG_CHECKING([for ${CC-cc} option to accept ANSI C]) +AC_CACHE_VAL(am_cv_prog_cc_stdc, +[am_cv_prog_cc_stdc=no +ac_save_CC="$CC" +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + AC_TRY_COMPILE( +[#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +], [ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; +], +[am_cv_prog_cc_stdc="$ac_arg"; break]) +done +CC="$ac_save_CC" +]) +if test -z "$am_cv_prog_cc_stdc"; then + AC_MSG_RESULT([none needed]) +else + AC_MSG_RESULT([$am_cv_prog_cc_stdc]) +fi +case "x$am_cv_prog_cc_stdc" in + x|xno) ;; + *) CC="$CC $am_cv_prog_cc_stdc" ;; +esac +]) + diff --git a/argp/argp-ba.c b/argp/argp-ba.c new file mode 100644 index 0000000..5657c27 --- /dev/null +++ b/argp/argp-ba.c @@ -0,0 +1,26 @@ +/* Default definition for ARGP_PROGRAM_BUG_ADDRESS. + Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* If set by the user program, it should point to string that is the + bug-reporting address for the program. It will be printed by argp_help if + the ARGP_HELP_BUG_ADDR flag is set (as it is by various standard help + messages), embedded in a sentence that says something like `Report bugs to + ADDR.'. */ +const char *argp_program_bug_address; diff --git a/argp/argp-eexst.c b/argp/argp-eexst.c new file mode 100644 index 0000000..9040058 --- /dev/null +++ b/argp/argp-eexst.c @@ -0,0 +1,32 @@ +/* Default definition for ARGP_ERR_EXIT_STATUS + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "argp.h" + +/* The exit status that argp will use when exiting due to a parsing error. + If not defined or set by the user program, this defaults to EX_USAGE from + . */ +error_t argp_err_exit_status = EX_USAGE; diff --git a/argp/argp-fmtstream.c b/argp/argp-fmtstream.c new file mode 100644 index 0000000..af607ae --- /dev/null +++ b/argp/argp-fmtstream.c @@ -0,0 +1,475 @@ +/* Word-wrapping and line-truncating streams + Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* This package emulates glibc `line_wrap_stream' semantics for systems that + don't have that. */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include + +#include "argp-fmtstream.h" +#include "argp-namefrob.h" + +#ifndef ARGP_FMTSTREAM_USE_LINEWRAP + +#ifndef isblank +#define isblank(ch) ((ch)==' ' || (ch)=='\t') +#endif + +#if defined _LIBC && defined USE_IN_LIBIO +# include +# define __vsnprintf(s, l, f, a) _IO_vsnprintf (s, l, f, a) +#endif + +#define INIT_BUF_SIZE 200 +#define PRINTF_SIZE_GUESS 150 + +/* Return an argp_fmtstream that outputs to STREAM, and which prefixes lines + written on it with LMARGIN spaces and limits them to RMARGIN columns + total. If WMARGIN >= 0, words that extend past RMARGIN are wrapped by + replacing the whitespace before them with a newline and WMARGIN spaces. + Otherwise, chars beyond RMARGIN are simply dropped until a newline. + Returns NULL if there was an error. */ +argp_fmtstream_t +__argp_make_fmtstream (FILE *stream, + size_t lmargin, size_t rmargin, ssize_t wmargin) +{ + argp_fmtstream_t fs = malloc (sizeof (struct argp_fmtstream)); + if (fs) + { + fs->stream = stream; + + fs->lmargin = lmargin; + fs->rmargin = rmargin; + fs->wmargin = wmargin; + fs->point_col = 0; + fs->point_offs = 0; + + fs->buf = malloc (INIT_BUF_SIZE); + if (! fs->buf) + { + free (fs); + fs = 0; + } + else + { + fs->p = fs->buf; + fs->end = fs->buf + INIT_BUF_SIZE; + } + } + + return fs; +} +#ifdef weak_alias +weak_alias (__argp_make_fmtstream, argp_make_fmtstream) +#endif + +/* Flush FS to its stream, and free it (but don't close the stream). */ +void +__argp_fmtstream_free (argp_fmtstream_t fs) +{ + __argp_fmtstream_update (fs); + if (fs->p > fs->buf) + fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream); + free (fs->buf); + free (fs); +} +#ifdef weak_alias +weak_alias (__argp_fmtstream_free, argp_fmtstream_free) +#endif + +/* Process FS's buffer so that line wrapping is done from POINT_OFFS to the + end of its buffer. This code is mostly from glibc stdio/linewrap.c. */ +void +__argp_fmtstream_update (argp_fmtstream_t fs) +{ + char *buf, *nl; + size_t len; + + /* Scan the buffer for newlines. */ + buf = fs->buf + fs->point_offs; + while (buf < fs->p) + { + size_t r; + + if (fs->point_col == 0 && fs->lmargin != 0) + { + /* We are starting a new line. Print spaces to the left margin. */ + const size_t pad = fs->lmargin; + if (fs->p + pad < fs->end) + { + /* We can fit in them in the buffer by moving the + buffer text up and filling in the beginning. */ + memmove (buf + pad, buf, fs->p - buf); + fs->p += pad; /* Compensate for bigger buffer. */ + memset (buf, ' ', pad); /* Fill in the spaces. */ + buf += pad; /* Don't bother searching them. */ + } + else + { + /* No buffer space for spaces. Must flush. */ + size_t i; + for (i = 0; i < pad; i++) + putc_unlocked (' ', fs->stream); + } + fs->point_col = pad; + } + + len = fs->p - buf; + nl = memchr (buf, '\n', len); + + if (fs->point_col < 0) + fs->point_col = 0; + + if (!nl) + { + /* The buffer ends in a partial line. */ + + if (fs->point_col + len < fs->rmargin) + { + /* The remaining buffer text is a partial line and fits + within the maximum line width. Advance point for the + characters to be written and stop scanning. */ + fs->point_col += len; + break; + } + else + /* Set the end-of-line pointer for the code below to + the end of the buffer. */ + nl = fs->p; + } + else if (fs->point_col + (nl - buf) < (ssize_t) fs->rmargin) + { + /* The buffer contains a full line that fits within the maximum + line width. Reset point and scan the next line. */ + fs->point_col = 0; + buf = nl + 1; + continue; + } + + /* This line is too long. */ + r = fs->rmargin - 1; + + if (fs->wmargin < 0) + { + /* Truncate the line by overwriting the excess with the + newline and anything after it in the buffer. */ + if (nl < fs->p) + { + memmove (buf + (r - fs->point_col), nl, fs->p - nl); + fs->p -= buf + (r - fs->point_col) - nl; + /* Reset point for the next line and start scanning it. */ + fs->point_col = 0; + buf += r + 1; /* Skip full line plus \n. */ + } + else + { + /* The buffer ends with a partial line that is beyond the + maximum line width. Advance point for the characters + written, and discard those past the max from the buffer. */ + fs->point_col += len; + fs->p -= fs->point_col - r; + break; + } + } + else + { + /* Do word wrap. Go to the column just past the maximum line + width and scan back for the beginning of the word there. + Then insert a line break. */ + + char *p, *nextline; + int i; + + p = buf + (r + 1 - fs->point_col); + while (p >= buf && !isblank (*p)) + --p; + nextline = p + 1; /* This will begin the next line. */ + + if (nextline > buf) + { + /* Swallow separating blanks. */ + if (p >= buf) + do + --p; + while (p >= buf && isblank (*p)); + nl = p + 1; /* The newline will replace the first blank. */ + } + else + { + /* A single word that is greater than the maximum line width. + Oh well. Put it on an overlong line by itself. */ + p = buf + (r + 1 - fs->point_col); + /* Find the end of the long word. */ + do + ++p; + while (p < nl && !isblank (*p)); + if (p == nl) + { + /* It already ends a line. No fussing required. */ + fs->point_col = 0; + buf = nl + 1; + continue; + } + /* We will move the newline to replace the first blank. */ + nl = p; + /* Swallow separating blanks. */ + do + ++p; + while (isblank (*p)); + /* The next line will start here. */ + nextline = p; + } + + /* Note: There are a bunch of tests below for + NEXTLINE == BUF + LEN + 1; this case is where NL happens to fall + at the end of the buffer, and NEXTLINE is in fact empty (and so + we need not be careful to maintain its contents). */ + + if (nextline == buf + len + 1 + ? fs->end - nl < fs->wmargin + 1 + : nextline - (nl + 1) < fs->wmargin) + { + /* The margin needs more blanks than we removed. */ + if (fs->end - fs->p > fs->wmargin + 1) + /* Make some space for them. */ + { + size_t mv = fs->p - nextline; + memmove (nl + 1 + fs->wmargin, nextline, mv); + nextline = nl + 1 + fs->wmargin; + len = nextline + mv - buf; + *nl++ = '\n'; + } + else + /* Output the first line so we can use the space. */ + { + if (nl > fs->buf) + fwrite_unlocked (fs->buf, 1, nl - fs->buf, fs->stream); + putc_unlocked ('\n', fs->stream); + len += buf - fs->buf; + nl = buf = fs->buf; + } + } + else + /* We can fit the newline and blanks in before + the next word. */ + *nl++ = '\n'; + + if (nextline - nl >= fs->wmargin + || (nextline == buf + len + 1 && fs->end - nextline >= fs->wmargin)) + /* Add blanks up to the wrap margin column. */ + for (i = 0; i < fs->wmargin; ++i) + *nl++ = ' '; + else + for (i = 0; i < fs->wmargin; ++i) + putc_unlocked (' ', fs->stream); + + /* Copy the tail of the original buffer into the current buffer + position. */ + if (nl < nextline) + memmove (nl, nextline, buf + len - nextline); + len -= nextline - buf; + + /* Continue the scan on the remaining lines in the buffer. */ + buf = nl; + + /* Restore bufp to include all the remaining text. */ + fs->p = nl + len; + + /* Reset the counter of what has been output this line. If wmargin + is 0, we want to avoid the lmargin getting added, so we set + point_col to a magic value of -1 in that case. */ + fs->point_col = fs->wmargin ? fs->wmargin : -1; + } + } + + /* Remember that we've scanned as far as the end of the buffer. */ + fs->point_offs = fs->p - fs->buf; +} + +/* Ensure that FS has space for AMOUNT more bytes in its buffer, either by + growing the buffer, or by flushing it. True is returned iff we succeed. */ +int +__argp_fmtstream_ensure (struct argp_fmtstream *fs, size_t amount) +{ + if ((size_t) (fs->end - fs->p) < amount) + { + ssize_t wrote; + + /* Flush FS's buffer. */ + __argp_fmtstream_update (fs); + + wrote = fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream); + if (wrote == fs->p - fs->buf) + { + fs->p = fs->buf; + fs->point_offs = 0; + } + else + { + fs->p -= wrote; + fs->point_offs -= wrote; + memmove (fs->buf, fs->buf + wrote, fs->p - fs->buf); + return 0; + } + + if ((size_t) (fs->end - fs->buf) < amount) + /* Gotta grow the buffer. */ + { + size_t new_size = fs->end - fs->buf + amount; + char *new_buf = realloc (fs->buf, new_size); + + if (! new_buf) + { + __set_errno (ENOMEM); + return 0; + } + + fs->buf = new_buf; + fs->end = new_buf + new_size; + fs->p = fs->buf; + } + } + + return 1; +} + +ssize_t +__argp_fmtstream_printf (struct argp_fmtstream *fs, const char *fmt, ...) +{ + size_t out; + size_t avail; + size_t size_guess = PRINTF_SIZE_GUESS; /* How much space to reserve. */ + + do + { + va_list args; + + if (! __argp_fmtstream_ensure (fs, size_guess)) + return -1; + + va_start (args, fmt); + avail = fs->end - fs->p; + out = __vsnprintf (fs->p, avail, fmt, args); + va_end (args); + if (out >= avail) + size_guess = out + 1; + } + while (out >= avail); + + fs->p += out; + + return out; +} +#ifdef weak_alias +weak_alias (__argp_fmtstream_printf, argp_fmtstream_printf) +#endif + +/* Duplicate the inline definitions in argp-fmtstream.h, for compilers + * that don't do inlining. */ +size_t +__argp_fmtstream_write (argp_fmtstream_t __fs, + __const char *__str, size_t __len) +{ + if (__fs->p + __len <= __fs->end || __argp_fmtstream_ensure (__fs, __len)) + { + memcpy (__fs->p, __str, __len); + __fs->p += __len; + return __len; + } + else + return 0; +} + +int +__argp_fmtstream_puts (argp_fmtstream_t __fs, __const char *__str) +{ + size_t __len = strlen (__str); + if (__len) + { + size_t __wrote = __argp_fmtstream_write (__fs, __str, __len); + return __wrote == __len ? 0 : -1; + } + else + return 0; +} + +int +__argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch) +{ + if (__fs->p < __fs->end || __argp_fmtstream_ensure (__fs, 1)) + return *__fs->p++ = __ch; + else + return EOF; +} + +/* Set __FS's left margin to __LMARGIN and return the old value. */ +size_t +__argp_fmtstream_set_lmargin (argp_fmtstream_t __fs, size_t __lmargin) +{ + size_t __old; + if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs) + __argp_fmtstream_update (__fs); + __old = __fs->lmargin; + __fs->lmargin = __lmargin; + return __old; +} + +/* Set __FS's right margin to __RMARGIN and return the old value. */ +size_t +__argp_fmtstream_set_rmargin (argp_fmtstream_t __fs, size_t __rmargin) +{ + size_t __old; + if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs) + __argp_fmtstream_update (__fs); + __old = __fs->rmargin; + __fs->rmargin = __rmargin; + return __old; +} + +/* Set FS's wrap margin to __WMARGIN and return the old value. */ +size_t +__argp_fmtstream_set_wmargin (argp_fmtstream_t __fs, size_t __wmargin) +{ + size_t __old; + if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs) + __argp_fmtstream_update (__fs); + __old = __fs->wmargin; + __fs->wmargin = __wmargin; + return __old; +} + +/* Return the column number of the current output point in __FS. */ +size_t +__argp_fmtstream_point (argp_fmtstream_t __fs) +{ + if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs) + __argp_fmtstream_update (__fs); + return __fs->point_col >= 0 ? __fs->point_col : 0; +} + +#endif /* !ARGP_FMTSTREAM_USE_LINEWRAP */ diff --git a/argp/argp-fmtstream.h b/argp/argp-fmtstream.h new file mode 100644 index 0000000..ac44645 --- /dev/null +++ b/argp/argp-fmtstream.h @@ -0,0 +1,322 @@ +/* Word-wrapping and line-truncating streams. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* This package emulates glibc `line_wrap_stream' semantics for systems that + don't have that. If the system does have it, it is just a wrapper for + that. This header file is only used internally while compiling argp, and + shouldn't be installed. */ + +#ifndef _ARGP_FMTSTREAM_H +#define _ARGP_FMTSTREAM_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#if !_LIBC +# if ! (defined (HAVE_FLOCKFILE) && defined(HAVE_PUTC_UNLOCKED) \ + && defined (HAVE_FPUTS_UNLOCKED) && defined (HAVE_FWRITE_UNLOCKED) ) + +/* Don't use stdio locking */ + +# define flockfile(f) +# define funlockfile(f) +# define putc_unlocked(c, f) putc((c), (f)) +# define fputs_unlocked(s, f) fputs((s), (f)) +# define fwrite_unlocked(b, s, n, f) fwrite((b), (s), (n), (f)) +# endif /* No thread safe i/o */ +#endif /* !_LIBC */ + +#if (_LIBC - 0 && !defined (USE_IN_LIBIO)) \ + || (defined (__GNU_LIBRARY__) && defined (HAVE_LINEWRAP_H)) +/* line_wrap_stream is available, so use that. */ +#define ARGP_FMTSTREAM_USE_LINEWRAP +#endif + +#ifdef ARGP_FMTSTREAM_USE_LINEWRAP +/* Just be a simple wrapper for line_wrap_stream; the semantics are + *slightly* different, as line_wrap_stream doesn't actually make a new + object, it just modifies the given stream (reversibly) to do + line-wrapping. Since we control who uses this code, it doesn't matter. */ + +#include + +typedef FILE *argp_fmtstream_t; + +#define argp_make_fmtstream line_wrap_stream +#define __argp_make_fmtstream line_wrap_stream +#define argp_fmtstream_free line_unwrap_stream +#define __argp_fmtstream_free line_unwrap_stream + +#define __argp_fmtstream_putc(fs,ch) putc(ch,fs) +#define argp_fmtstream_putc(fs,ch) putc(ch,fs) +#define __argp_fmtstream_puts(fs,str) fputs(str,fs) +#define argp_fmtstream_puts(fs,str) fputs(str,fs) +#define __argp_fmtstream_write(fs,str,len) fwrite(str,1,len,fs) +#define argp_fmtstream_write(fs,str,len) fwrite(str,1,len,fs) +#define __argp_fmtstream_printf fprintf +#define argp_fmtstream_printf fprintf + +#define __argp_fmtstream_lmargin line_wrap_lmargin +#define argp_fmtstream_lmargin line_wrap_lmargin +#define __argp_fmtstream_set_lmargin line_wrap_set_lmargin +#define argp_fmtstream_set_lmargin line_wrap_set_lmargin +#define __argp_fmtstream_rmargin line_wrap_rmargin +#define argp_fmtstream_rmargin line_wrap_rmargin +#define __argp_fmtstream_set_rmargin line_wrap_set_rmargin +#define argp_fmtstream_set_rmargin line_wrap_set_rmargin +#define __argp_fmtstream_wmargin line_wrap_wmargin +#define argp_fmtstream_wmargin line_wrap_wmargin +#define __argp_fmtstream_set_wmargin line_wrap_set_wmargin +#define argp_fmtstream_set_wmargin line_wrap_set_wmargin +#define __argp_fmtstream_point line_wrap_point +#define argp_fmtstream_point line_wrap_point + +#else /* !ARGP_FMTSTREAM_USE_LINEWRAP */ +/* Guess we have to define our own version. */ + +#ifndef __const +#define __const const +#endif + +/* FIXME: We could use a configure test to check for __attribute__, + * just like lsh does. */ +#ifndef PRINTF_STYLE +# if __GNUC__ >= 2 +# define PRINTF_STYLE(f, a) __attribute__ ((__format__ (__printf__, f, a))) +# else +# define PRINTF_STYLE(f, a) +# endif +#endif + + +struct argp_fmtstream +{ + FILE *stream; /* The stream we're outputting to. */ + + size_t lmargin, rmargin; /* Left and right margins. */ + ssize_t wmargin; /* Margin to wrap to, or -1 to truncate. */ + + /* Point in buffer to which we've processed for wrapping, but not output. */ + size_t point_offs; + /* Output column at POINT_OFFS, or -1 meaning 0 but don't add lmargin. */ + ssize_t point_col; + + char *buf; /* Output buffer. */ + char *p; /* Current end of text in BUF. */ + char *end; /* Absolute end of BUF. */ +}; + +typedef struct argp_fmtstream *argp_fmtstream_t; + +/* Return an argp_fmtstream that outputs to STREAM, and which prefixes lines + written on it with LMARGIN spaces and limits them to RMARGIN columns + total. If WMARGIN >= 0, words that extend past RMARGIN are wrapped by + replacing the whitespace before them with a newline and WMARGIN spaces. + Otherwise, chars beyond RMARGIN are simply dropped until a newline. + Returns NULL if there was an error. */ +extern argp_fmtstream_t __argp_make_fmtstream (FILE *__stream, + size_t __lmargin, + size_t __rmargin, + ssize_t __wmargin); +extern argp_fmtstream_t argp_make_fmtstream (FILE *__stream, + size_t __lmargin, + size_t __rmargin, + ssize_t __wmargin); + +/* Flush __FS to its stream, and free it (but don't close the stream). */ +extern void __argp_fmtstream_free (argp_fmtstream_t __fs); +extern void argp_fmtstream_free (argp_fmtstream_t __fs); + +extern ssize_t __argp_fmtstream_printf (argp_fmtstream_t __fs, + __const char *__fmt, ...) + PRINTF_STYLE(2,3); +extern ssize_t argp_fmtstream_printf (argp_fmtstream_t __fs, + __const char *__fmt, ...) + PRINTF_STYLE(2,3); + +extern int __argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch); +extern int argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch); + +extern int __argp_fmtstream_puts (argp_fmtstream_t __fs, __const char *__str); +extern int argp_fmtstream_puts (argp_fmtstream_t __fs, __const char *__str); + +extern size_t __argp_fmtstream_write (argp_fmtstream_t __fs, + __const char *__str, size_t __len); +extern size_t argp_fmtstream_write (argp_fmtstream_t __fs, + __const char *__str, size_t __len); + +/* Access macros for various bits of state. */ +#define argp_fmtstream_lmargin(__fs) ((__fs)->lmargin) +#define argp_fmtstream_rmargin(__fs) ((__fs)->rmargin) +#define argp_fmtstream_wmargin(__fs) ((__fs)->wmargin) +#define __argp_fmtstream_lmargin argp_fmtstream_lmargin +#define __argp_fmtstream_rmargin argp_fmtstream_rmargin +#define __argp_fmtstream_wmargin argp_fmtstream_wmargin + +/* Set __FS's left margin to LMARGIN and return the old value. */ +extern size_t argp_fmtstream_set_lmargin (argp_fmtstream_t __fs, + size_t __lmargin); +extern size_t __argp_fmtstream_set_lmargin (argp_fmtstream_t __fs, + size_t __lmargin); + +/* Set __FS's right margin to __RMARGIN and return the old value. */ +extern size_t argp_fmtstream_set_rmargin (argp_fmtstream_t __fs, + size_t __rmargin); +extern size_t __argp_fmtstream_set_rmargin (argp_fmtstream_t __fs, + size_t __rmargin); + +/* Set __FS's wrap margin to __WMARGIN and return the old value. */ +extern size_t argp_fmtstream_set_wmargin (argp_fmtstream_t __fs, + size_t __wmargin); +extern size_t __argp_fmtstream_set_wmargin (argp_fmtstream_t __fs, + size_t __wmargin); + +/* Return the column number of the current output point in __FS. */ +extern size_t argp_fmtstream_point (argp_fmtstream_t __fs); +extern size_t __argp_fmtstream_point (argp_fmtstream_t __fs); + +/* Internal routines. */ +extern void _argp_fmtstream_update (argp_fmtstream_t __fs); +extern void __argp_fmtstream_update (argp_fmtstream_t __fs); +extern int _argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount); +extern int __argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount); + +#ifdef __OPTIMIZE__ +/* Inline versions of above routines. */ + +#if !_LIBC +#define __argp_fmtstream_putc argp_fmtstream_putc +#define __argp_fmtstream_puts argp_fmtstream_puts +#define __argp_fmtstream_write argp_fmtstream_write +#define __argp_fmtstream_set_lmargin argp_fmtstream_set_lmargin +#define __argp_fmtstream_set_rmargin argp_fmtstream_set_rmargin +#define __argp_fmtstream_set_wmargin argp_fmtstream_set_wmargin +#define __argp_fmtstream_point argp_fmtstream_point +#define __argp_fmtstream_update _argp_fmtstream_update +#define __argp_fmtstream_ensure _argp_fmtstream_ensure +#endif + +#ifndef ARGP_FS_EI +#define ARGP_FS_EI extern inline +#endif + +ARGP_FS_EI size_t +__argp_fmtstream_write (argp_fmtstream_t __fs, + __const char *__str, size_t __len) +{ + if (__fs->p + __len <= __fs->end || __argp_fmtstream_ensure (__fs, __len)) + { + memcpy (__fs->p, __str, __len); + __fs->p += __len; + return __len; + } + else + return 0; +} + +ARGP_FS_EI int +__argp_fmtstream_puts (argp_fmtstream_t __fs, __const char *__str) +{ + size_t __len = strlen (__str); + if (__len) + { + size_t __wrote = __argp_fmtstream_write (__fs, __str, __len); + return __wrote == __len ? 0 : -1; + } + else + return 0; +} + +ARGP_FS_EI int +__argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch) +{ + if (__fs->p < __fs->end || __argp_fmtstream_ensure (__fs, 1)) + return *__fs->p++ = __ch; + else + return EOF; +} + +/* Set __FS's left margin to __LMARGIN and return the old value. */ +ARGP_FS_EI size_t +__argp_fmtstream_set_lmargin (argp_fmtstream_t __fs, size_t __lmargin) +{ + size_t __old; + if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs) + __argp_fmtstream_update (__fs); + __old = __fs->lmargin; + __fs->lmargin = __lmargin; + return __old; +} + +/* Set __FS's right margin to __RMARGIN and return the old value. */ +ARGP_FS_EI size_t +__argp_fmtstream_set_rmargin (argp_fmtstream_t __fs, size_t __rmargin) +{ + size_t __old; + if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs) + __argp_fmtstream_update (__fs); + __old = __fs->rmargin; + __fs->rmargin = __rmargin; + return __old; +} + +/* Set FS's wrap margin to __WMARGIN and return the old value. */ +ARGP_FS_EI size_t +__argp_fmtstream_set_wmargin (argp_fmtstream_t __fs, size_t __wmargin) +{ + size_t __old; + if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs) + __argp_fmtstream_update (__fs); + __old = __fs->wmargin; + __fs->wmargin = __wmargin; + return __old; +} + +/* Return the column number of the current output point in __FS. */ +ARGP_FS_EI size_t +__argp_fmtstream_point (argp_fmtstream_t __fs) +{ + if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs) + __argp_fmtstream_update (__fs); + return __fs->point_col >= 0 ? __fs->point_col : 0; +} + +#if !_LIBC +#undef __argp_fmtstream_putc +#undef __argp_fmtstream_puts +#undef __argp_fmtstream_write +#undef __argp_fmtstream_set_lmargin +#undef __argp_fmtstream_set_rmargin +#undef __argp_fmtstream_set_wmargin +#undef __argp_fmtstream_point +#undef __argp_fmtstream_update +#undef __argp_fmtstream_ensure +#endif + +#endif /* __OPTIMIZE__ */ + +#endif /* ARGP_FMTSTREAM_USE_LINEWRAP */ + +#endif /* argp-fmtstream.h */ diff --git a/argp/argp-fs-xinl.c b/argp/argp-fs-xinl.c new file mode 100644 index 0000000..94d5f58 --- /dev/null +++ b/argp/argp-fs-xinl.c @@ -0,0 +1,41 @@ +/* Real definitions for extern inline functions in argp-fmtstream.h + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#define ARGP_FS_EI +#undef __OPTIMIZE__ +#define __OPTIMIZE__ +#include "argp-fmtstream.h" + +/* Add weak aliases. */ +#if _LIBC - 0 && !defined (ARGP_FMTSTREAM_USE_LINEWRAP) && defined (weak_alias) + +weak_alias (__argp_fmtstream_putc, argp_fmtstream_putc) +weak_alias (__argp_fmtstream_puts, argp_fmtstream_puts) +weak_alias (__argp_fmtstream_write, argp_fmtstream_write) +weak_alias (__argp_fmtstream_set_lmargin, argp_fmtstream_set_lmargin) +weak_alias (__argp_fmtstream_set_rmargin, argp_fmtstream_set_rmargin) +weak_alias (__argp_fmtstream_set_wmargin, argp_fmtstream_set_wmargin) +weak_alias (__argp_fmtstream_point, argp_fmtstream_point) + +#endif diff --git a/argp/argp-help.c b/argp/argp-help.c new file mode 100644 index 0000000..58b3f33 --- /dev/null +++ b/argp/argp-help.c @@ -0,0 +1,1876 @@ +/* Hierarchial argument parsing help output + Copyright (C) 1995,1996,1997,1998,1999,2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifndef alloca +# ifdef __GNUC__ +# define alloca __builtin_alloca +# define HAVE_ALLOCA 1 +# else +# if defined HAVE_ALLOCA_H || defined _LIBC +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca +char *alloca (); +# endif +# endif +# endif +# endif +#endif + +#include +#include +#include +#include +#include +#include +#include + + +#ifndef _ +/* This is for other GNU distributions with internationalized messages. */ +# if defined HAVE_LIBINTL_H || defined _LIBC +# include +# ifdef _LIBC +# undef dgettext +# define dgettext(domain, msgid) __dcgettext (domain, msgid, LC_MESSAGES) +# endif +# else +# define dgettext(domain, msgid) (msgid) +# endif +#endif + +#include "argp.h" +#include "argp-fmtstream.h" +#include "argp-namefrob.h" + + +/* FIXME: We could use a configure test to check for __attribute__, + * just like lsh does. */ +#ifndef UNUSED +# if __GNUC__ >= 2 +# define UNUSED __attribute__ ((__unused__)) +# else +# define UNUSED +# endif +#endif + +#ifndef _LIBC +# ifndef __strchrnul +# define __strchrnul strchrnul +# endif +# ifndef __mempcpy +# define __mempcpy mempcpy +# endif +/* We need to use a different name, as __strndup is likely a macro. */ +# define STRNDUP strndup +# ifndef __flockfile +# define __flockfile flockfile +# endif +# ifndef __funlockfile +# define __funlockfile funlockfile +# endif +# if HAVE_STRERROR +# define STRERROR strerror +# else +# define STRERROR(x) (sys_errlist[x]) +# endif +#else /* _LIBC */ +# define STRNDUP __strndup +# define STRERROR strerror +#endif + +#if !_LIBC +# if !HAVE_STRNDUP +char *strndup (const char *s, size_t size); +# endif /* !HAVE_STRNDUP */ + +# if !HAVE_MEMPCPY +void *mempcpy (void *to, const void *from, size_t size); +# endif /* !HAVE_MEMPCPY */ + +# if !HAVE_STRCHRNUL +char *strchrnul(const char *s, int c); +# endif /* !HAVE_STRCHRNUL */ + +#endif /* !_LIBC */ + + +/* User-selectable (using an environment variable) formatting parameters. + + These may be specified in an environment variable called `ARGP_HELP_FMT', + with a contents like: VAR1=VAL1,VAR2=VAL2,BOOLVAR2,no-BOOLVAR2 + Where VALn must be a positive integer. The list of variables is in the + UPARAM_NAMES vector, below. */ + +/* Default parameters. */ +#define DUP_ARGS 0 /* True if option argument can be duplicated. */ +#define DUP_ARGS_NOTE 1 /* True to print a note about duplicate args. */ +#define SHORT_OPT_COL 2 /* column in which short options start */ +#define LONG_OPT_COL 6 /* column in which long options start */ +#define DOC_OPT_COL 2 /* column in which doc options start */ +#define OPT_DOC_COL 29 /* column in which option text starts */ +#define HEADER_COL 1 /* column in which group headers are printed */ +#define USAGE_INDENT 12 /* indentation of wrapped usage lines */ +#define RMARGIN 79 /* right margin used for wrapping */ + +/* User-selectable (using an environment variable) formatting parameters. + They must all be of type `int' for the parsing code to work. */ +struct uparams +{ + /* If true, arguments for an option are shown with both short and long + options, even when a given option has both, e.g. `-x ARG, --longx=ARG'. + If false, then if an option has both, the argument is only shown with + the long one, e.g., `-x, --longx=ARG', and a message indicating that + this really means both is printed below the options. */ + int dup_args; + + /* This is true if when DUP_ARGS is false, and some duplicate arguments have + been suppressed, an explanatory message should be printed. */ + int dup_args_note; + + /* Various output columns. */ + int short_opt_col; + int long_opt_col; + int doc_opt_col; + int opt_doc_col; + int header_col; + int usage_indent; + int rmargin; + + int valid; /* True when the values in here are valid. */ +}; + +/* This is a global variable, as user options are only ever read once. */ +static struct uparams uparams = { + DUP_ARGS, DUP_ARGS_NOTE, + SHORT_OPT_COL, LONG_OPT_COL, DOC_OPT_COL, OPT_DOC_COL, HEADER_COL, + USAGE_INDENT, RMARGIN, + 0 +}; + +/* A particular uparam, and what the user name is. */ +struct uparam_name +{ + const char *name; /* User name. */ + int is_bool; /* Whether it's `boolean'. */ + size_t uparams_offs; /* Location of the (int) field in UPARAMS. */ +}; + +/* The name-field mappings we know about. */ +static const struct uparam_name uparam_names[] = +{ + { "dup-args", 1, offsetof (struct uparams, dup_args) }, + { "dup-args-note", 1, offsetof (struct uparams, dup_args_note) }, + { "short-opt-col", 0, offsetof (struct uparams, short_opt_col) }, + { "long-opt-col", 0, offsetof (struct uparams, long_opt_col) }, + { "doc-opt-col", 0, offsetof (struct uparams, doc_opt_col) }, + { "opt-doc-col", 0, offsetof (struct uparams, opt_doc_col) }, + { "header-col", 0, offsetof (struct uparams, header_col) }, + { "usage-indent", 0, offsetof (struct uparams, usage_indent) }, + { "rmargin", 0, offsetof (struct uparams, rmargin) }, + { 0 } +}; + +/* Read user options from the environment, and fill in UPARAMS appropiately. */ +static void +fill_in_uparams (const struct argp_state *state) +{ + /* FIXME: Can we get away without an explicit cast? */ + const unsigned char *var = (unsigned char *) getenv ("ARGP_HELP_FMT"); + +#define SKIPWS(p) do { while (isspace (*p)) p++; } while (0); + + if (var) + /* Parse var. */ + while (*var) + { + SKIPWS (var); + + if (isalpha (*var)) + { + size_t var_len; + const struct uparam_name *un; + int unspec = 0, val = 0; + const unsigned char *arg = var; + + while (isalnum (*arg) || *arg == '-' || *arg == '_') + arg++; + var_len = arg - var; + + SKIPWS (arg); + + if (*arg == '\0' || *arg == ',') + unspec = 1; + else if (*arg == '=') + { + arg++; + SKIPWS (arg); + } + + if (unspec) + { + if (var[0] == 'n' && var[1] == 'o' && var[2] == '-') + { + val = 0; + var += 3; + var_len -= 3; + } + else + val = 1; + } + else if (isdigit (*arg)) + { + val = atoi (arg); + while (isdigit (*arg)) + arg++; + SKIPWS (arg); + } + + for (un = uparam_names; un->name; un++) + if (strlen (un->name) == var_len + && strncmp (var, un->name, var_len) == 0) + { + if (unspec && !un->is_bool) + __argp_failure (state, 0, 0, + dgettext (state->root_argp->argp_domain, "\ +%.*s: ARGP_HELP_FMT parameter requires a value"), + (int) var_len, var); + else + *(int *)((char *)&uparams + un->uparams_offs) = val; + break; + } + if (! un->name) + __argp_failure (state, 0, 0, + dgettext (state->root_argp->argp_domain, "\ +%.*s: Unknown ARGP_HELP_FMT parameter"), + (int) var_len, var); + + var = arg; + if (*var == ',') + var++; + } + else if (*var) + { + __argp_failure (state, 0, 0, + dgettext (state->root_argp->argp_domain, + "Garbage in ARGP_HELP_FMT: %s"), var); + break; + } + } +} + +/* Returns true if OPT hasn't been marked invisible. Visibility only affects + whether OPT is displayed or used in sorting, not option shadowing. */ +#define ovisible(opt) (! ((opt)->flags & OPTION_HIDDEN)) + +/* Returns true if OPT is an alias for an earlier option. */ +#define oalias(opt) ((opt)->flags & OPTION_ALIAS) + +/* Returns true if OPT is an documentation-only entry. */ +#define odoc(opt) ((opt)->flags & OPTION_DOC) + +/* Returns true if OPT is the end-of-list marker for a list of options. */ +#define oend(opt) __option_is_end (opt) + +/* Returns true if OPT has a short option. */ +#define oshort(opt) __option_is_short (opt) + +/* + The help format for a particular option is like: + + -xARG, -yARG, --long1=ARG, --long2=ARG Documentation... + + Where ARG will be omitted if there's no argument, for this option, or + will be surrounded by "[" and "]" appropiately if the argument is + optional. The documentation string is word-wrapped appropiately, and if + the list of options is long enough, it will be started on a separate line. + If there are no short options for a given option, the first long option is + indented slighly in a way that's supposed to make most long options appear + to be in a separate column. + + For example, the following output (from ps): + + -p PID, --pid=PID List the process PID + --pgrp=PGRP List processes in the process group PGRP + -P, -x, --no-parent Include processes without parents + -Q, --all-fields Don't elide unusable fields (normally if there's + some reason ps can't print a field for any + process, it's removed from the output entirely) + -r, --reverse, --gratuitously-long-reverse-option + Reverse the order of any sort + --session[=SID] Add the processes from the session SID (which + defaults to the sid of the current process) + + Here are some more options: + -f ZOT, --foonly=ZOT Glork a foonly + -z, --zaza Snit a zar + + -?, --help Give this help list + --usage Give a short usage message + -V, --version Print program version + + The struct argp_option array for the above could look like: + + { + {"pid", 'p', "PID", 0, "List the process PID"}, + {"pgrp", OPT_PGRP, "PGRP", 0, "List processes in the process group PGRP"}, + {"no-parent", 'P', 0, 0, "Include processes without parents"}, + {0, 'x', 0, OPTION_ALIAS}, + {"all-fields",'Q', 0, 0, "Don't elide unusable fields (normally" + " if there's some reason ps can't" + " print a field for any process, it's" + " removed from the output entirely)" }, + {"reverse", 'r', 0, 0, "Reverse the order of any sort"}, + {"gratuitously-long-reverse-option", 0, 0, OPTION_ALIAS}, + {"session", OPT_SESS, "SID", OPTION_ARG_OPTIONAL, + "Add the processes from the session" + " SID (which defaults to the sid of" + " the current process)" }, + + {0,0,0,0, "Here are some more options:"}, + {"foonly", 'f', "ZOT", 0, "Glork a foonly"}, + {"zaza", 'z', 0, 0, "Snit a zar"}, + + {0} + } + + Note that the last three options are automatically supplied by argp_parse, + unless you tell it not to with ARGP_NO_HELP. + +*/ + +/* Returns true if CH occurs between BEG and END. */ +static int +find_char (char ch, char *beg, char *end) +{ + while (beg < end) + if (*beg == ch) + return 1; + else + beg++; + return 0; +} + +struct hol_cluster; /* fwd decl */ + +struct hol_entry +{ + /* First option. */ + const struct argp_option *opt; + /* Number of options (including aliases). */ + unsigned num; + + /* A pointers into the HOL's short_options field, to the first short option + letter for this entry. The order of the characters following this point + corresponds to the order of options pointed to by OPT, and there are at + most NUM. A short option recorded in a option following OPT is only + valid if it occurs in the right place in SHORT_OPTIONS (otherwise it's + probably been shadowed by some other entry). */ + char *short_options; + + /* Entries are sorted by their group first, in the order: + 1, 2, ..., n, 0, -m, ..., -2, -1 + and then alphabetically within each group. The default is 0. */ + int group; + + /* The cluster of options this entry belongs to, or 0 if none. */ + struct hol_cluster *cluster; + + /* The argp from which this option came. */ + const struct argp *argp; +}; + +/* A cluster of entries to reflect the argp tree structure. */ +struct hol_cluster +{ + /* A descriptive header printed before options in this cluster. */ + const char *header; + + /* Used to order clusters within the same group with the same parent, + according to the order in which they occurred in the parent argp's child + list. */ + int index; + + /* How to sort this cluster with respect to options and other clusters at the + same depth (clusters always follow options in the same group). */ + int group; + + /* The cluster to which this cluster belongs, or 0 if it's at the base + level. */ + struct hol_cluster *parent; + + /* The argp from which this cluster is (eventually) derived. */ + const struct argp *argp; + + /* The distance this cluster is from the root. */ + int depth; + + /* Clusters in a given hol are kept in a linked list, to make freeing them + possible. */ + struct hol_cluster *next; +}; + +/* A list of options for help. */ +struct hol +{ + /* An array of hol_entry's. */ + struct hol_entry *entries; + /* The number of entries in this hol. If this field is zero, the others + are undefined. */ + unsigned num_entries; + + /* A string containing all short options in this HOL. Each entry contains + pointers into this string, so the order can't be messed with blindly. */ + char *short_options; + + /* Clusters of entries in this hol. */ + struct hol_cluster *clusters; +}; + +/* Create a struct hol from the options in ARGP. CLUSTER is the + hol_cluster in which these entries occur, or 0, if at the root. */ +static struct hol * +make_hol (const struct argp *argp, struct hol_cluster *cluster) +{ + char *so; + const struct argp_option *o; + const struct argp_option *opts = argp->options; + struct hol_entry *entry; + unsigned num_short_options = 0; + struct hol *hol = malloc (sizeof (struct hol)); + + assert (hol); + + hol->num_entries = 0; + hol->clusters = 0; + + if (opts) + { + int cur_group = 0; + + /* The first option must not be an alias. */ + assert (! oalias (opts)); + + /* Calculate the space needed. */ + for (o = opts; ! oend (o); o++) + { + if (! oalias (o)) + hol->num_entries++; + if (oshort (o)) + num_short_options++; /* This is an upper bound. */ + } + + hol->entries = malloc (sizeof (struct hol_entry) * hol->num_entries); + hol->short_options = malloc (num_short_options + 1); + + assert (hol->entries && hol->short_options); + + /* Fill in the entries. */ + so = hol->short_options; + for (o = opts, entry = hol->entries; ! oend (o); entry++) + { + entry->opt = o; + entry->num = 0; + entry->short_options = so; + entry->group = cur_group = + o->group + ? o->group + : ((!o->name && !o->key) + ? cur_group + 1 + : cur_group); + entry->cluster = cluster; + entry->argp = argp; + + do + { + entry->num++; + if (oshort (o) && ! find_char (o->key, hol->short_options, so)) + /* O has a valid short option which hasn't already been used.*/ + *so++ = o->key; + o++; + } + while (! oend (o) && oalias (o)); + } + *so = '\0'; /* null terminated so we can find the length */ + } + + return hol; +} + +/* Add a new cluster to HOL, with the given GROUP and HEADER (taken from the + associated argp child list entry), INDEX, and PARENT, and return a pointer + to it. ARGP is the argp that this cluster results from. */ +static struct hol_cluster * +hol_add_cluster (struct hol *hol, int group, const char *header, int index, + struct hol_cluster *parent, const struct argp *argp) +{ + struct hol_cluster *cl = malloc (sizeof (struct hol_cluster)); + if (cl) + { + cl->group = group; + cl->header = header; + + cl->index = index; + cl->parent = parent; + cl->argp = argp; + cl->depth = parent ? parent->depth + 1 : 0; + + cl->next = hol->clusters; + hol->clusters = cl; + } + return cl; +} + +/* Free HOL and any resources it uses. */ +static void +hol_free (struct hol *hol) +{ + struct hol_cluster *cl = hol->clusters; + + while (cl) + { + struct hol_cluster *next = cl->next; + free (cl); + cl = next; + } + + if (hol->num_entries > 0) + { + free (hol->entries); + free (hol->short_options); + } + + free (hol); +} + +static inline int +hol_entry_short_iterate (const struct hol_entry *entry, + int (*func)(const struct argp_option *opt, + const struct argp_option *real, + const char *domain, void *cookie), + const char *domain, void *cookie) +{ + unsigned nopts; + int val = 0; + const struct argp_option *opt, *real = entry->opt; + char *so = entry->short_options; + + for (opt = real, nopts = entry->num; nopts > 0 && !val; opt++, nopts--) + if (oshort (opt) && *so == opt->key) + { + if (!oalias (opt)) + real = opt; + if (ovisible (opt)) + val = (*func)(opt, real, domain, cookie); + so++; + } + + return val; +} + +static inline int +hol_entry_long_iterate (const struct hol_entry *entry, + int (*func)(const struct argp_option *opt, + const struct argp_option *real, + const char *domain, void *cookie), + const char *domain, void *cookie) +{ + unsigned nopts; + int val = 0; + const struct argp_option *opt, *real = entry->opt; + + for (opt = real, nopts = entry->num; nopts > 0 && !val; opt++, nopts--) + if (opt->name) + { + if (!oalias (opt)) + real = opt; + if (ovisible (opt)) + val = (*func)(opt, real, domain, cookie); + } + + return val; +} + +/* Iterator that returns true for the first short option. */ +static inline int +until_short (const struct argp_option *opt, const struct argp_option *real UNUSED, + const char *domain UNUSED, void *cookie UNUSED) +{ + return oshort (opt) ? opt->key : 0; +} + +/* Returns the first valid short option in ENTRY, or 0 if there is none. */ +static char +hol_entry_first_short (const struct hol_entry *entry) +{ + return hol_entry_short_iterate (entry, until_short, + entry->argp->argp_domain, 0); +} + +/* Returns the first valid long option in ENTRY, or 0 if there is none. */ +static const char * +hol_entry_first_long (const struct hol_entry *entry) +{ + const struct argp_option *opt; + unsigned num; + for (opt = entry->opt, num = entry->num; num > 0; opt++, num--) + if (opt->name && ovisible (opt)) + return opt->name; + return 0; +} + +/* Returns the entry in HOL with the long option name NAME, or 0 if there is + none. */ +static struct hol_entry * +hol_find_entry (struct hol *hol, const char *name) +{ + struct hol_entry *entry = hol->entries; + unsigned num_entries = hol->num_entries; + + while (num_entries-- > 0) + { + const struct argp_option *opt = entry->opt; + unsigned num_opts = entry->num; + + while (num_opts-- > 0) + if (opt->name && ovisible (opt) && strcmp (opt->name, name) == 0) + return entry; + else + opt++; + + entry++; + } + + return 0; +} + +/* If an entry with the long option NAME occurs in HOL, set it's special + sort position to GROUP. */ +static void +hol_set_group (struct hol *hol, const char *name, int group) +{ + struct hol_entry *entry = hol_find_entry (hol, name); + if (entry) + entry->group = group; +} + +/* Order by group: 0, 1, 2, ..., n, -m, ..., -2, -1. + EQ is what to return if GROUP1 and GROUP2 are the same. */ +static int +group_cmp (int group1, int group2, int eq) +{ + if (group1 == group2) + return eq; + else if ((group1 < 0 && group2 < 0) || (group1 >= 0 && group2 >= 0)) + return group1 - group2; + else + return group2 - group1; +} + +/* Compare clusters CL1 & CL2 by the order that they should appear in + output. */ +static int +hol_cluster_cmp (const struct hol_cluster *cl1, const struct hol_cluster *cl2) +{ + /* If one cluster is deeper than the other, use its ancestor at the same + level, so that finding the common ancestor is straightforward. */ + while (cl1->depth < cl2->depth) + cl1 = cl1->parent; + while (cl2->depth < cl1->depth) + cl2 = cl2->parent; + + /* Now reduce both clusters to their ancestors at the point where both have + a common parent; these can be directly compared. */ + while (cl1->parent != cl2->parent) + cl1 = cl1->parent, cl2 = cl2->parent; + + return group_cmp (cl1->group, cl2->group, cl2->index - cl1->index); +} + +/* Return the ancestor of CL that's just below the root (i.e., has a parent + of 0). */ +static struct hol_cluster * +hol_cluster_base (struct hol_cluster *cl) +{ + while (cl->parent) + cl = cl->parent; + return cl; +} + +/* Return true if CL1 is a child of CL2. */ +static int +hol_cluster_is_child (const struct hol_cluster *cl1, + const struct hol_cluster *cl2) +{ + while (cl1 && cl1 != cl2) + cl1 = cl1->parent; + return cl1 == cl2; +} + +/* Given the name of a OPTION_DOC option, modifies NAME to start at the tail + that should be used for comparisons, and returns true iff it should be + treated as a non-option. */ + +/* FIXME: Can we use unsigned char * for the argument? */ +static int +canon_doc_option (const char **name) +{ + int non_opt; + /* Skip initial whitespace. */ + while (isspace ( (unsigned char) **name)) + (*name)++; + /* Decide whether this looks like an option (leading `-') or not. */ + non_opt = (**name != '-'); + /* Skip until part of name used for sorting. */ + while (**name && !isalnum ( (unsigned char) **name)) + (*name)++; + return non_opt; +} + +/* Order ENTRY1 & ENTRY2 by the order which they should appear in a help + listing. */ +static int +hol_entry_cmp (const struct hol_entry *entry1, + const struct hol_entry *entry2) +{ + /* The group numbers by which the entries should be ordered; if either is + in a cluster, then this is just the group within the cluster. */ + int group1 = entry1->group, group2 = entry2->group; + + if (entry1->cluster != entry2->cluster) + { + /* The entries are not within the same cluster, so we can't compare them + directly, we have to use the appropiate clustering level too. */ + if (! entry1->cluster) + /* ENTRY1 is at the `base level', not in a cluster, so we have to + compare it's group number with that of the base cluster in which + ENTRY2 resides. Note that if they're in the same group, the + clustered option always comes laster. */ + return group_cmp (group1, hol_cluster_base (entry2->cluster)->group, -1); + else if (! entry2->cluster) + /* Likewise, but ENTRY2's not in a cluster. */ + return group_cmp (hol_cluster_base (entry1->cluster)->group, group2, 1); + else + /* Both entries are in clusters, we can just compare the clusters. */ + return hol_cluster_cmp (entry1->cluster, entry2->cluster); + } + else if (group1 == group2) + /* The entries are both in the same cluster and group, so compare them + alphabetically. */ + { + int short1 = hol_entry_first_short (entry1); + int short2 = hol_entry_first_short (entry2); + int doc1 = odoc (entry1->opt); + int doc2 = odoc (entry2->opt); + /* FIXME: Can we use unsigned char * instead? */ + const char *long1 = hol_entry_first_long (entry1); + const char *long2 = hol_entry_first_long (entry2); + + if (doc1) + doc1 = canon_doc_option (&long1); + if (doc2) + doc2 = canon_doc_option (&long2); + + if (doc1 != doc2) + /* `documentation' options always follow normal options (or + documentation options that *look* like normal options). */ + return doc1 - doc2; + else if (!short1 && !short2 && long1 && long2) + /* Only long options. */ + return __strcasecmp (long1, long2); + else + /* Compare short/short, long/short, short/long, using the first + character of long options. Entries without *any* valid + options (such as options with OPTION_HIDDEN set) will be put + first, but as they're not displayed, it doesn't matter where + they are. */ + { + unsigned char first1 = short1 ? short1 : long1 ? *long1 : 0; + unsigned char first2 = short2 ? short2 : long2 ? *long2 : 0; +#ifdef _tolower + int lower_cmp = _tolower (first1) - _tolower (first2); +#else + int lower_cmp = tolower (first1) - tolower (first2); +#endif + /* Compare ignoring case, except when the options are both the + same letter, in which case lower-case always comes first. */ + /* NOTE: The subtraction below does the right thing + even with eight-bit chars: first1 and first2 are + converted to int *before* the subtraction. */ + return lower_cmp ? lower_cmp : first2 - first1; + } + } + else + /* Within the same cluster, but not the same group, so just compare + groups. */ + return group_cmp (group1, group2, 0); +} + +/* Version of hol_entry_cmp with correct signature for qsort. */ +static int +hol_entry_qcmp (const void *entry1_v, const void *entry2_v) +{ + return hol_entry_cmp (entry1_v, entry2_v); +} + +/* Sort HOL by group and alphabetically by option name (with short options + taking precedence over long). Since the sorting is for display purposes + only, the shadowing of options isn't effected. */ +static void +hol_sort (struct hol *hol) +{ + if (hol->num_entries > 0) + qsort (hol->entries, hol->num_entries, sizeof (struct hol_entry), + hol_entry_qcmp); +} + +/* Append MORE to HOL, destroying MORE in the process. Options in HOL shadow + any in MORE with the same name. */ +static void +hol_append (struct hol *hol, struct hol *more) +{ + struct hol_cluster **cl_end = &hol->clusters; + + /* Steal MORE's cluster list, and add it to the end of HOL's. */ + while (*cl_end) + cl_end = &(*cl_end)->next; + *cl_end = more->clusters; + more->clusters = 0; + + /* Merge entries. */ + if (more->num_entries > 0) + { + if (hol->num_entries == 0) + { + hol->num_entries = more->num_entries; + hol->entries = more->entries; + hol->short_options = more->short_options; + more->num_entries = 0; /* Mark MORE's fields as invalid. */ + } + else + /* Append the entries in MORE to those in HOL, taking care to only add + non-shadowed SHORT_OPTIONS values. */ + { + unsigned left; + char *so, *more_so; + struct hol_entry *e; + unsigned num_entries = hol->num_entries + more->num_entries; + struct hol_entry *entries = + malloc (num_entries * sizeof (struct hol_entry)); + unsigned hol_so_len = strlen (hol->short_options); + char *short_options = + malloc (hol_so_len + strlen (more->short_options) + 1); + + __mempcpy (__mempcpy (entries, hol->entries, + hol->num_entries * sizeof (struct hol_entry)), + more->entries, + more->num_entries * sizeof (struct hol_entry)); + + __mempcpy (short_options, hol->short_options, hol_so_len); + + /* Fix up the short options pointers from HOL. */ + for (e = entries, left = hol->num_entries; left > 0; e++, left--) + e->short_options += (short_options - hol->short_options); + + /* Now add the short options from MORE, fixing up its entries + too. */ + so = short_options + hol_so_len; + more_so = more->short_options; + for (left = more->num_entries; left > 0; e++, left--) + { + int opts_left; + const struct argp_option *opt; + + e->short_options = so; + + for (opts_left = e->num, opt = e->opt; opts_left; opt++, opts_left--) + { + int ch = *more_so; + if (oshort (opt) && ch == opt->key) + /* The next short option in MORE_SO, CH, is from OPT. */ + { + if (! find_char (ch, short_options, + short_options + hol_so_len)) + /* The short option CH isn't shadowed by HOL's options, + so add it to the sum. */ + *so++ = ch; + more_so++; + } + } + } + + *so = '\0'; + + free (hol->entries); + free (hol->short_options); + + hol->entries = entries; + hol->num_entries = num_entries; + hol->short_options = short_options; + } + } + + hol_free (more); +} + +/* Inserts enough spaces to make sure STREAM is at column COL. */ +static void +indent_to (argp_fmtstream_t stream, unsigned col) +{ + int needed = col - __argp_fmtstream_point (stream); + while (needed-- > 0) + __argp_fmtstream_putc (stream, ' '); +} + +/* Output to STREAM either a space, or a newline if there isn't room for at + least ENSURE characters before the right margin. */ +static void +space (argp_fmtstream_t stream, size_t ensure) +{ + if (__argp_fmtstream_point (stream) + ensure + >= __argp_fmtstream_rmargin (stream)) + __argp_fmtstream_putc (stream, '\n'); + else + __argp_fmtstream_putc (stream, ' '); +} + +/* If the option REAL has an argument, we print it in using the printf + format REQ_FMT or OPT_FMT depending on whether it's a required or + optional argument. */ +static void +arg (const struct argp_option *real, const char *req_fmt, const char *opt_fmt, + const char *domain UNUSED, argp_fmtstream_t stream) +{ + if (real->arg) + { + if (real->flags & OPTION_ARG_OPTIONAL) + __argp_fmtstream_printf (stream, opt_fmt, + dgettext (domain, real->arg)); + else + __argp_fmtstream_printf (stream, req_fmt, + dgettext (domain, real->arg)); + } +} + +/* Helper functions for hol_entry_help. */ + +/* State used during the execution of hol_help. */ +struct hol_help_state +{ + /* PREV_ENTRY should contain the previous entry printed, or 0. */ + struct hol_entry *prev_entry; + + /* If an entry is in a different group from the previous one, and SEP_GROUPS + is true, then a blank line will be printed before any output. */ + int sep_groups; + + /* True if a duplicate option argument was suppressed (only ever set if + UPARAMS.dup_args is false). */ + int suppressed_dup_arg; +}; + +/* Some state used while printing a help entry (used to communicate with + helper functions). See the doc for hol_entry_help for more info, as most + of the fields are copied from its arguments. */ +struct pentry_state +{ + const struct hol_entry *entry; + argp_fmtstream_t stream; + struct hol_help_state *hhstate; + + /* True if nothing's been printed so far. */ + int first; + + /* If non-zero, the state that was used to print this help. */ + const struct argp_state *state; +}; + +/* If a user doc filter should be applied to DOC, do so. */ +static const char * +filter_doc (const char *doc, int key, const struct argp *argp, + const struct argp_state *state) +{ + if (argp->help_filter) + /* We must apply a user filter to this output. */ + { + void *input = __argp_input (argp, state); + return (*argp->help_filter) (key, doc, input); + } + else + /* No filter. */ + return doc; +} + +/* Prints STR as a header line, with the margin lines set appropiately, and + notes the fact that groups should be separated with a blank line. ARGP is + the argp that should dictate any user doc filtering to take place. Note + that the previous wrap margin isn't restored, but the left margin is reset + to 0. */ +static void +print_header (const char *str, const struct argp *argp, + struct pentry_state *pest) +{ + const char *tstr = dgettext (argp->argp_domain, str); + const char *fstr = filter_doc (tstr, ARGP_KEY_HELP_HEADER, argp, pest->state); + + if (fstr) + { + if (*fstr) + { + if (pest->hhstate->prev_entry) + /* Precede with a blank line. */ + __argp_fmtstream_putc (pest->stream, '\n'); + indent_to (pest->stream, uparams.header_col); + __argp_fmtstream_set_lmargin (pest->stream, uparams.header_col); + __argp_fmtstream_set_wmargin (pest->stream, uparams.header_col); + __argp_fmtstream_puts (pest->stream, fstr); + __argp_fmtstream_set_lmargin (pest->stream, 0); + __argp_fmtstream_putc (pest->stream, '\n'); + } + + pest->hhstate->sep_groups = 1; /* Separate subsequent groups. */ + } + + if (fstr != tstr) + free ((char *) fstr); +} + +/* Inserts a comma if this isn't the first item on the line, and then makes + sure we're at least to column COL. If this *is* the first item on a line, + prints any pending whitespace/headers that should precede this line. Also + clears FIRST. */ +static void +comma (unsigned col, struct pentry_state *pest) +{ + if (pest->first) + { + const struct hol_entry *pe = pest->hhstate->prev_entry; + const struct hol_cluster *cl = pest->entry->cluster; + + if (pest->hhstate->sep_groups && pe && pest->entry->group != pe->group) + __argp_fmtstream_putc (pest->stream, '\n'); + + if (cl && cl->header && *cl->header + && (!pe + || (pe->cluster != cl + && !hol_cluster_is_child (pe->cluster, cl)))) + /* If we're changing clusters, then this must be the start of the + ENTRY's cluster unless that is an ancestor of the previous one + (in which case we had just popped into a sub-cluster for a bit). + If so, then print the cluster's header line. */ + { + int old_wm = __argp_fmtstream_wmargin (pest->stream); + print_header (cl->header, cl->argp, pest); + __argp_fmtstream_set_wmargin (pest->stream, old_wm); + } + + pest->first = 0; + } + else + __argp_fmtstream_puts (pest->stream, ", "); + + indent_to (pest->stream, col); +} + +/* Print help for ENTRY to STREAM. */ +static void +hol_entry_help (struct hol_entry *entry, const struct argp_state *state, + argp_fmtstream_t stream, struct hol_help_state *hhstate) +{ + unsigned num; + const struct argp_option *real = entry->opt, *opt; + char *so = entry->short_options; + int have_long_opt = 0; /* We have any long options. */ + /* Saved margins. */ + int old_lm = __argp_fmtstream_set_lmargin (stream, 0); + int old_wm = __argp_fmtstream_wmargin (stream); + /* PEST is a state block holding some of our variables that we'd like to + share with helper functions. */ +#ifdef __GNUC__ + struct pentry_state pest = { entry, stream, hhstate, 1, state }; +#else /* !__GNUC__ */ + /* Decent initializers are a GNU extension */ + struct pentry_state pest; + pest.entry = entry; + pest.stream = stream; + pest.hhstate = hhstate; + pest.first = 1; + pest.state = state; +#endif /* !__GNUC__ */ + + if (! odoc (real)) + for (opt = real, num = entry->num; num > 0; opt++, num--) + if (opt->name && ovisible (opt)) + { + have_long_opt = 1; + break; + } + + /* First emit short options. */ + __argp_fmtstream_set_wmargin (stream, uparams.short_opt_col); /* For truly bizarre cases. */ + for (opt = real, num = entry->num; num > 0; opt++, num--) + if (oshort (opt) && opt->key == *so) + /* OPT has a valid (non shadowed) short option. */ + { + if (ovisible (opt)) + { + comma (uparams.short_opt_col, &pest); + __argp_fmtstream_putc (stream, '-'); + __argp_fmtstream_putc (stream, *so); + if (!have_long_opt || uparams.dup_args) + arg (real, " %s", "[%s]", state->root_argp->argp_domain, stream); + else if (real->arg) + hhstate->suppressed_dup_arg = 1; + } + so++; + } + + /* Now, long options. */ + if (odoc (real)) + /* A `documentation' option. */ + { + __argp_fmtstream_set_wmargin (stream, uparams.doc_opt_col); + for (opt = real, num = entry->num; num > 0; opt++, num--) + if (opt->name && ovisible (opt)) + { + comma (uparams.doc_opt_col, &pest); + /* Calling gettext here isn't quite right, since sorting will + have been done on the original; but documentation options + should be pretty rare anyway... */ + __argp_fmtstream_puts (stream, + dgettext (state->root_argp->argp_domain, + opt->name)); + } + } + else + /* A real long option. */ + { + int first_long_opt = 1; + + __argp_fmtstream_set_wmargin (stream, uparams.long_opt_col); + for (opt = real, num = entry->num; num > 0; opt++, num--) + if (opt->name && ovisible (opt)) + { + comma (uparams.long_opt_col, &pest); + __argp_fmtstream_printf (stream, "--%s", opt->name); + if (first_long_opt || uparams.dup_args) + arg (real, "=%s", "[=%s]", state->root_argp->argp_domain, + stream); + else if (real->arg) + hhstate->suppressed_dup_arg = 1; + } + } + + /* Next, documentation strings. */ + __argp_fmtstream_set_lmargin (stream, 0); + + if (pest.first) + { + /* Didn't print any switches, what's up? */ + if (!oshort (real) && !real->name) + /* This is a group header, print it nicely. */ + print_header (real->doc, entry->argp, &pest); + else + /* Just a totally shadowed option or null header; print nothing. */ + goto cleanup; /* Just return, after cleaning up. */ + } + else + { + const char *tstr = real->doc ? dgettext (state->root_argp->argp_domain, + real->doc) : 0; + const char *fstr = filter_doc (tstr, real->key, entry->argp, state); + if (fstr && *fstr) + { + unsigned int col = __argp_fmtstream_point (stream); + + __argp_fmtstream_set_lmargin (stream, uparams.opt_doc_col); + __argp_fmtstream_set_wmargin (stream, uparams.opt_doc_col); + + if (col > (unsigned int) (uparams.opt_doc_col + 3)) + __argp_fmtstream_putc (stream, '\n'); + else if (col >= (unsigned int) uparams.opt_doc_col) + __argp_fmtstream_puts (stream, " "); + else + indent_to (stream, uparams.opt_doc_col); + + __argp_fmtstream_puts (stream, fstr); + } + if (fstr && fstr != tstr) + free ((char *) fstr); + + /* Reset the left margin. */ + __argp_fmtstream_set_lmargin (stream, 0); + __argp_fmtstream_putc (stream, '\n'); + } + + hhstate->prev_entry = entry; + +cleanup: + __argp_fmtstream_set_lmargin (stream, old_lm); + __argp_fmtstream_set_wmargin (stream, old_wm); +} + +/* Output a long help message about the options in HOL to STREAM. */ +static void +hol_help (struct hol *hol, const struct argp_state *state, + argp_fmtstream_t stream) +{ + unsigned num; + struct hol_entry *entry; + struct hol_help_state hhstate = { 0, 0, 0 }; + + for (entry = hol->entries, num = hol->num_entries; num > 0; entry++, num--) + hol_entry_help (entry, state, stream, &hhstate); + + if (hhstate.suppressed_dup_arg && uparams.dup_args_note) + { + const char *tstr = dgettext (state->root_argp->argp_domain, "\ +Mandatory or optional arguments to long options are also mandatory or \ +optional for any corresponding short options."); + const char *fstr = filter_doc (tstr, ARGP_KEY_HELP_DUP_ARGS_NOTE, + state ? state->root_argp : 0, state); + if (fstr && *fstr) + { + __argp_fmtstream_putc (stream, '\n'); + __argp_fmtstream_puts (stream, fstr); + __argp_fmtstream_putc (stream, '\n'); + } + if (fstr && fstr != tstr) + free ((char *) fstr); + } +} + +/* Helper functions for hol_usage. */ + +/* If OPT is a short option without an arg, append its key to the string + pointer pointer to by COOKIE, and advance the pointer. */ +static int +add_argless_short_opt (const struct argp_option *opt, + const struct argp_option *real, + const char *domain UNUSED, void *cookie) +{ + char **snao_end = cookie; + if (!(opt->arg || real->arg) + && !((opt->flags | real->flags) & OPTION_NO_USAGE)) + *(*snao_end)++ = opt->key; + return 0; +} + +/* If OPT is a short option with an arg, output a usage entry for it to the + stream pointed at by COOKIE. */ +static int +usage_argful_short_opt (const struct argp_option *opt, + const struct argp_option *real, + const char *domain UNUSED, void *cookie) +{ + argp_fmtstream_t stream = cookie; + const char *arg = opt->arg; + int flags = opt->flags | real->flags; + + if (! arg) + arg = real->arg; + + if (arg && !(flags & OPTION_NO_USAGE)) + { + arg = dgettext (domain, arg); + + if (flags & OPTION_ARG_OPTIONAL) + __argp_fmtstream_printf (stream, " [-%c[%s]]", opt->key, arg); + else + { + /* Manually do line wrapping so that it (probably) won't + get wrapped at the embedded space. */ + space (stream, 6 + strlen (arg)); + __argp_fmtstream_printf (stream, "[-%c %s]", opt->key, arg); + } + } + + return 0; +} + +/* Output a usage entry for the long option opt to the stream pointed at by + COOKIE. */ +static int +usage_long_opt (const struct argp_option *opt, + const struct argp_option *real, + const char *domain UNUSED, void *cookie) +{ + argp_fmtstream_t stream = cookie; + const char *arg = opt->arg; + int flags = opt->flags | real->flags; + + if (! arg) + arg = real->arg; + + if (! (flags & OPTION_NO_USAGE)) + { + if (arg) + { + arg = dgettext (domain, arg); + if (flags & OPTION_ARG_OPTIONAL) + __argp_fmtstream_printf (stream, " [--%s[=%s]]", opt->name, arg); + else + __argp_fmtstream_printf (stream, " [--%s=%s]", opt->name, arg); + } + else + __argp_fmtstream_printf (stream, " [--%s]", opt->name); + } + + return 0; +} + +/* Print a short usage description for the arguments in HOL to STREAM. */ +static void +hol_usage (struct hol *hol, argp_fmtstream_t stream) +{ + if (hol->num_entries > 0) + { + unsigned nentries; + struct hol_entry *entry; + char *short_no_arg_opts = alloca (strlen (hol->short_options) + 1); + char *snao_end = short_no_arg_opts; + + /* First we put a list of short options without arguments. */ + for (entry = hol->entries, nentries = hol->num_entries + ; nentries > 0 + ; entry++, nentries--) + hol_entry_short_iterate (entry, add_argless_short_opt, + entry->argp->argp_domain, &snao_end); + if (snao_end > short_no_arg_opts) + { + *snao_end++ = 0; + __argp_fmtstream_printf (stream, " [-%s]", short_no_arg_opts); + } + + /* Now a list of short options *with* arguments. */ + for (entry = hol->entries, nentries = hol->num_entries + ; nentries > 0 + ; entry++, nentries--) + hol_entry_short_iterate (entry, usage_argful_short_opt, + entry->argp->argp_domain, stream); + + /* Finally, a list of long options (whew!). */ + for (entry = hol->entries, nentries = hol->num_entries + ; nentries > 0 + ; entry++, nentries--) + hol_entry_long_iterate (entry, usage_long_opt, + entry->argp->argp_domain, stream); + } +} + +/* Make a HOL containing all levels of options in ARGP. CLUSTER is the + cluster in which ARGP's entries should be clustered, or 0. */ +static struct hol * +argp_hol (const struct argp *argp, struct hol_cluster *cluster) +{ + const struct argp_child *child = argp->children; + struct hol *hol = make_hol (argp, cluster); + if (child) + while (child->argp) + { + struct hol_cluster *child_cluster = + ((child->group || child->header) + /* Put CHILD->argp within its own cluster. */ + ? hol_add_cluster (hol, child->group, child->header, + child - argp->children, cluster, argp) + /* Just merge it into the parent's cluster. */ + : cluster); + hol_append (hol, argp_hol (child->argp, child_cluster)) ; + child++; + } + return hol; +} + +/* Calculate how many different levels with alternative args strings exist in + ARGP. */ +static size_t +argp_args_levels (const struct argp *argp) +{ + size_t levels = 0; + const struct argp_child *child = argp->children; + + if (argp->args_doc && strchr (argp->args_doc, '\n')) + levels++; + + if (child) + while (child->argp) + levels += argp_args_levels ((child++)->argp); + + return levels; +} + +/* Print all the non-option args documented in ARGP to STREAM. Any output is + preceded by a space. LEVELS is a pointer to a byte vector the length + returned by argp_args_levels; it should be initialized to zero, and + updated by this routine for the next call if ADVANCE is true. True is + returned as long as there are more patterns to output. */ +static int +argp_args_usage (const struct argp *argp, const struct argp_state *state, + char **levels, int advance, argp_fmtstream_t stream) +{ + char *our_level = *levels; + int multiple = 0; + const struct argp_child *child = argp->children; + const char *tdoc = dgettext (argp->argp_domain, argp->args_doc), *nl = 0; + const char *fdoc = filter_doc (tdoc, ARGP_KEY_HELP_ARGS_DOC, argp, state); + + if (fdoc) + { + const char *cp = fdoc; + nl = __strchrnul (cp, '\n'); + if (*nl != '\0') + /* This is a `multi-level' args doc; advance to the correct position + as determined by our state in LEVELS, and update LEVELS. */ + { + int i; + multiple = 1; + for (i = 0; i < *our_level; i++) + cp = nl + 1, nl = __strchrnul (cp, '\n'); + (*levels)++; + } + + /* Manually do line wrapping so that it (probably) won't get wrapped at + any embedded spaces. */ + space (stream, 1 + nl - cp); + + __argp_fmtstream_write (stream, cp, nl - cp); + } + if (fdoc && fdoc != tdoc) + free ((char *)fdoc); /* Free user's modified doc string. */ + + if (child) + while (child->argp) + advance = !argp_args_usage ((child++)->argp, state, levels, advance, stream); + + if (advance && multiple) + { + /* Need to increment our level. */ + if (*nl) + /* There's more we can do here. */ + { + (*our_level)++; + advance = 0; /* Our parent shouldn't advance also. */ + } + else if (*our_level > 0) + /* We had multiple levels, but used them up; reset to zero. */ + *our_level = 0; + } + + return !advance; +} + +/* Print the documentation for ARGP to STREAM; if POST is false, then + everything preceeding a `\v' character in the documentation strings (or + the whole string, for those with none) is printed, otherwise, everything + following the `\v' character (nothing for strings without). Each separate + bit of documentation is separated a blank line, and if PRE_BLANK is true, + then the first is as well. If FIRST_ONLY is true, only the first + occurrence is output. Returns true if anything was output. */ +static int +argp_doc (const struct argp *argp, const struct argp_state *state, + int post, int pre_blank, int first_only, + argp_fmtstream_t stream) +{ + const char *text; + const char *inp_text; + void *input = 0; + int anything = 0; + size_t inp_text_limit = 0; + const char *doc = dgettext (argp->argp_domain, argp->doc); + const struct argp_child *child = argp->children; + + if (doc) + { + char *vt = strchr (doc, '\v'); + inp_text = post ? (vt ? vt + 1 : 0) : doc; + inp_text_limit = (!post && vt) ? (vt - doc) : 0; + } + else + inp_text = 0; + + if (argp->help_filter) + /* We have to filter the doc strings. */ + { + if (inp_text_limit) + /* Copy INP_TEXT so that it's nul-terminated. */ + inp_text = STRNDUP (inp_text, inp_text_limit); + input = __argp_input (argp, state); + text = + (*argp->help_filter) (post + ? ARGP_KEY_HELP_POST_DOC + : ARGP_KEY_HELP_PRE_DOC, + inp_text, input); + } + else + text = (const char *) inp_text; + + if (text) + { + if (pre_blank) + __argp_fmtstream_putc (stream, '\n'); + + if (text == inp_text && inp_text_limit) + __argp_fmtstream_write (stream, inp_text, inp_text_limit); + else + __argp_fmtstream_puts (stream, text); + + if (__argp_fmtstream_point (stream) > __argp_fmtstream_lmargin (stream)) + __argp_fmtstream_putc (stream, '\n'); + + anything = 1; + } + + if (text && text != inp_text) + free ((char *) text); /* Free TEXT returned from the help filter. */ + if (inp_text && inp_text_limit && argp->help_filter) + free ((char *) inp_text); /* We copied INP_TEXT, so free it now. */ + + if (post && argp->help_filter) + /* Now see if we have to output a ARGP_KEY_HELP_EXTRA text. */ + { + text = (*argp->help_filter) (ARGP_KEY_HELP_EXTRA, 0, input); + if (text) + { + if (anything || pre_blank) + __argp_fmtstream_putc (stream, '\n'); + __argp_fmtstream_puts (stream, text); + free ((char *) text); + if (__argp_fmtstream_point (stream) + > __argp_fmtstream_lmargin (stream)) + __argp_fmtstream_putc (stream, '\n'); + anything = 1; + } + } + + if (child) + while (child->argp && !(first_only && anything)) + anything |= + argp_doc ((child++)->argp, state, + post, anything || pre_blank, first_only, + stream); + + return anything; +} + +/* Output a usage message for ARGP to STREAM. If called from + argp_state_help, STATE is the relevent parsing state. FLAGS are from the + set ARGP_HELP_*. NAME is what to use wherever a `program name' is + needed. */ + +static void +_help (const struct argp *argp, const struct argp_state *state, FILE *stream, + unsigned flags, const char *name) +{ + int anything = 0; /* Whether we've output anything. */ + struct hol *hol = 0; + argp_fmtstream_t fs; + + if (! stream) + return; + + __flockfile (stream); + + if (! uparams.valid) + fill_in_uparams (state); + + fs = __argp_make_fmtstream (stream, 0, uparams.rmargin, 0); + if (! fs) + { + __funlockfile (stream); + return; + } + + if (flags & (ARGP_HELP_USAGE | ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG)) + { + hol = argp_hol (argp, 0); + + /* If present, these options always come last. */ + hol_set_group (hol, "help", -1); + hol_set_group (hol, "version", -1); + + hol_sort (hol); + } + + if (flags & (ARGP_HELP_USAGE | ARGP_HELP_SHORT_USAGE)) + /* Print a short `Usage:' message. */ + { + int first_pattern = 1, more_patterns; + size_t num_pattern_levels = argp_args_levels (argp); + char *pattern_levels = alloca (num_pattern_levels); + + memset (pattern_levels, 0, num_pattern_levels); + + do + { + int old_lm; + int old_wm = __argp_fmtstream_set_wmargin (fs, uparams.usage_indent); + char *levels = pattern_levels; + + if (first_pattern) + __argp_fmtstream_printf (fs, "%s %s", + dgettext (argp->argp_domain, "Usage:"), + name); + else + __argp_fmtstream_printf (fs, "%s %s", + dgettext (argp->argp_domain, " or: "), + name); + + /* We set the lmargin as well as the wmargin, because hol_usage + manually wraps options with newline to avoid annoying breaks. */ + old_lm = __argp_fmtstream_set_lmargin (fs, uparams.usage_indent); + + if (flags & ARGP_HELP_SHORT_USAGE) + /* Just show where the options go. */ + { + if (hol->num_entries > 0) + __argp_fmtstream_puts (fs, dgettext (argp->argp_domain, + " [OPTION...]")); + } + else + /* Actually print the options. */ + { + hol_usage (hol, fs); + flags |= ARGP_HELP_SHORT_USAGE; /* But only do so once. */ + } + + more_patterns = argp_args_usage (argp, state, &levels, 1, fs); + + __argp_fmtstream_set_wmargin (fs, old_wm); + __argp_fmtstream_set_lmargin (fs, old_lm); + + __argp_fmtstream_putc (fs, '\n'); + anything = 1; + + first_pattern = 0; + } + while (more_patterns); + } + + if (flags & ARGP_HELP_PRE_DOC) + anything |= argp_doc (argp, state, 0, 0, 1, fs); + + if (flags & ARGP_HELP_SEE) + { + __argp_fmtstream_printf (fs, dgettext (argp->argp_domain, "\ +Try `%s --help' or `%s --usage' for more information.\n"), + name, name); + anything = 1; + } + + if (flags & ARGP_HELP_LONG) + /* Print a long, detailed help message. */ + { + /* Print info about all the options. */ + if (hol->num_entries > 0) + { + if (anything) + __argp_fmtstream_putc (fs, '\n'); + hol_help (hol, state, fs); + anything = 1; + } + } + + if (flags & ARGP_HELP_POST_DOC) + /* Print any documentation strings at the end. */ + anything |= argp_doc (argp, state, 1, anything, 0, fs); + + if ((flags & ARGP_HELP_BUG_ADDR) && argp_program_bug_address) + { + if (anything) + __argp_fmtstream_putc (fs, '\n'); + __argp_fmtstream_printf (fs, dgettext (argp->argp_domain, + "Report bugs to %s.\n"), + argp_program_bug_address); + anything = 1; + } + + __funlockfile (stream); + + if (hol) + hol_free (hol); + + __argp_fmtstream_free (fs); +} + +/* Output a usage message for ARGP to STREAM. FLAGS are from the set + ARGP_HELP_*. NAME is what to use wherever a `program name' is needed. */ +void __argp_help (const struct argp *argp, FILE *stream, + unsigned flags, char *name) +{ + _help (argp, 0, stream, flags, name); +} +#ifdef weak_alias +weak_alias (__argp_help, argp_help) +#endif + +char *__argp_basename(char *name) +{ + char *short_name = strrchr(name, '/'); + return short_name ? short_name + 1 : name; +} + +char * +__argp_short_program_name(const struct argp_state *state) +{ + if (state) + return state->name; +#if HAVE_PROGRAM_INVOCATION_SHORT_NAME + return program_invocation_short_name; +#elif HAVE_PROGRAM_INVOCATION_NAME + return __argp_basename(program_invocation_name); +#else /* !HAVE_PROGRAM_INVOCATION_NAME */ + /* FIXME: What now? Miles suggests that it is better to use NULL, + but currently the value is passed on directly to fputs_unlocked, + so that requires more changes. */ +# if __GNUC__ +# warning No reasonable value to return + return ""; +# endif /* __GNUC__ */ +#endif /* !HAVE_PROGRAM_INVOCATION_NAME */ +} + +/* Output, if appropriate, a usage message for STATE to STREAM. FLAGS are + from the set ARGP_HELP_*. */ +void +__argp_state_help (const struct argp_state *state, FILE *stream, unsigned flags) +{ + if ((!state || ! (state->flags & ARGP_NO_ERRS)) && stream) + { + if (state && (state->flags & ARGP_LONG_ONLY)) + flags |= ARGP_HELP_LONG_ONLY; + + _help (state ? state->root_argp : 0, state, stream, flags, + __argp_short_program_name(state)); + + if (!state || ! (state->flags & ARGP_NO_EXIT)) + { + if (flags & ARGP_HELP_EXIT_ERR) + exit (argp_err_exit_status); + if (flags & ARGP_HELP_EXIT_OK) + exit (0); + } + } +} +#ifdef weak_alias +weak_alias (__argp_state_help, argp_state_help) +#endif + +/* If appropriate, print the printf string FMT and following args, preceded + by the program name and `:', to stderr, and followed by a `Try ... --help' + message, then exit (1). */ +void +__argp_error (const struct argp_state *state, const char *fmt, ...) +{ + if (!state || !(state->flags & ARGP_NO_ERRS)) + { + FILE *stream = state ? state->err_stream : stderr; + + if (stream) + { + va_list ap; + + __flockfile (stream); + + fputs_unlocked (__argp_short_program_name(state), + stream); + putc_unlocked (':', stream); + putc_unlocked (' ', stream); + + va_start (ap, fmt); + vfprintf (stream, fmt, ap); + va_end (ap); + + putc_unlocked ('\n', stream); + + __argp_state_help (state, stream, ARGP_HELP_STD_ERR); + + __funlockfile (stream); + } + } +} +#ifdef weak_alias +weak_alias (__argp_error, argp_error) +#endif + +/* Similar to the standard gnu error-reporting function error(), but will + respect the ARGP_NO_EXIT and ARGP_NO_ERRS flags in STATE, and will print + to STATE->err_stream. This is useful for argument parsing code that is + shared between program startup (when exiting is desired) and runtime + option parsing (when typically an error code is returned instead). The + difference between this function and argp_error is that the latter is for + *parsing errors*, and the former is for other problems that occur during + parsing but don't reflect a (syntactic) problem with the input. */ +void +__argp_failure (const struct argp_state *state, int status, int errnum, + const char *fmt, ...) +{ + if (!state || !(state->flags & ARGP_NO_ERRS)) + { + FILE *stream = state ? state->err_stream : stderr; + + if (stream) + { + __flockfile (stream); + + fputs_unlocked (__argp_short_program_name(state), + stream); + + if (fmt) + { + va_list ap; + + putc_unlocked (':', stream); + putc_unlocked (' ', stream); + + va_start (ap, fmt); + vfprintf (stream, fmt, ap); + va_end (ap); + } + + if (errnum) + { + putc_unlocked (':', stream); + putc_unlocked (' ', stream); + fputs (STRERROR (errnum), stream); + } + + putc_unlocked ('\n', stream); + + __funlockfile (stream); + + if (status && (!state || !(state->flags & ARGP_NO_EXIT))) + exit (status); + } + } +} +#ifdef weak_alias +weak_alias (__argp_failure, argp_failure) +#endif diff --git a/argp/argp-namefrob.h b/argp/argp-namefrob.h new file mode 100644 index 0000000..0ce1148 --- /dev/null +++ b/argp/argp-namefrob.h @@ -0,0 +1,96 @@ +/* Name frobnication for compiling argp outside of glibc + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#if !_LIBC +/* This code is written for inclusion in gnu-libc, and uses names in the + namespace reserved for libc. If we're not compiling in libc, define those + names to be the normal ones instead. */ + +/* argp-parse functions */ +#undef __argp_parse +#define __argp_parse argp_parse +#undef __option_is_end +#define __option_is_end _option_is_end +#undef __option_is_short +#define __option_is_short _option_is_short +#undef __argp_input +#define __argp_input _argp_input + +/* argp-help functions */ +#undef __argp_help +#define __argp_help argp_help +#undef __argp_error +#define __argp_error argp_error +#undef __argp_failure +#define __argp_failure argp_failure +#undef __argp_state_help +#define __argp_state_help argp_state_help +#undef __argp_usage +#define __argp_usage argp_usage +#undef __argp_basename +#define __argp_basename _argp_basename +#undef __argp_short_program_name +#define __argp_short_program_name _argp_short_program_name + +/* argp-fmtstream functions */ +#undef __argp_make_fmtstream +#define __argp_make_fmtstream argp_make_fmtstream +#undef __argp_fmtstream_free +#define __argp_fmtstream_free argp_fmtstream_free +#undef __argp_fmtstream_putc +#define __argp_fmtstream_putc argp_fmtstream_putc +#undef __argp_fmtstream_puts +#define __argp_fmtstream_puts argp_fmtstream_puts +#undef __argp_fmtstream_write +#define __argp_fmtstream_write argp_fmtstream_write +#undef __argp_fmtstream_printf +#define __argp_fmtstream_printf argp_fmtstream_printf +#undef __argp_fmtstream_set_lmargin +#define __argp_fmtstream_set_lmargin argp_fmtstream_set_lmargin +#undef __argp_fmtstream_set_rmargin +#define __argp_fmtstream_set_rmargin argp_fmtstream_set_rmargin +#undef __argp_fmtstream_set_wmargin +#define __argp_fmtstream_set_wmargin argp_fmtstream_set_wmargin +#undef __argp_fmtstream_point +#define __argp_fmtstream_point argp_fmtstream_point +#undef __argp_fmtstream_update +#define __argp_fmtstream_update _argp_fmtstream_update +#undef __argp_fmtstream_ensure +#define __argp_fmtstream_ensure _argp_fmtstream_ensure +#undef __argp_fmtstream_lmargin +#define __argp_fmtstream_lmargin argp_fmtstream_lmargin +#undef __argp_fmtstream_rmargin +#define __argp_fmtstream_rmargin argp_fmtstream_rmargin +#undef __argp_fmtstream_wmargin +#define __argp_fmtstream_wmargin argp_fmtstream_wmargin + +/* normal libc functions we call */ +#undef __sleep +#define __sleep sleep +#undef __strcasecmp +#define __strcasecmp strcasecmp +#undef __vsnprintf +#define __vsnprintf vsnprintf + +#endif /* !_LIBC */ + +#ifndef __set_errno +#define __set_errno(e) (errno = (e)) +#endif diff --git a/argp/argp-parse.c b/argp/argp-parse.c new file mode 100644 index 0000000..a39e7ad --- /dev/null +++ b/argp/argp-parse.c @@ -0,0 +1,1293 @@ +/* Hierarchial argument parsing + Copyright (C) 1995, 96, 97, 98, 99, 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include + +#ifndef UNUSED +# if __GNUC__ >= 2 +# define UNUSED __attribute__ ((__unused__)) +# else +# define UNUSED +# endif +#endif + +#ifndef _ +/* This is for other GNU distributions with internationalized messages. + When compiling libc, the _ macro is predefined. */ +# if defined HAVE_LIBINTL_H || defined _LIBC +# include +# ifdef _LIBC +# undef dgettext +# define dgettext(domain, msgid) __dcgettext (domain, msgid, LC_MESSAGES) +# endif +# else +# define dgettext(domain, msgid) (msgid) +# define gettext(msgid) (msgid) +# endif +#endif +#ifndef N_ +# define N_(msgid) (msgid) +#endif + +#if _LIBC - 0 +#include +#else +#ifdef HAVE_CTHREADS_H +#include +#endif +#endif /* _LIBC */ + +#include "argp.h" +#include "argp-namefrob.h" + + +/* The meta-argument used to prevent any further arguments being interpreted + as options. */ +#define QUOTE "--" + +/* EZ alias for ARGP_ERR_UNKNOWN. */ +#define EBADKEY ARGP_ERR_UNKNOWN + + +/* Default options. */ + +/* When argp is given the --HANG switch, _ARGP_HANG is set and argp will sleep + for one second intervals, decrementing _ARGP_HANG until it's zero. Thus + you can force the program to continue by attaching a debugger and setting + it to 0 yourself. */ +volatile int _argp_hang; + +#define OPT_PROGNAME -2 +#define OPT_USAGE -3 +#define OPT_HANG -4 + +static const struct argp_option argp_default_options[] = +{ + {"help", '?', 0, 0, N_("Give this help list"), -1}, + {"usage", OPT_USAGE, 0, 0, N_("Give a short usage message")}, + {"program-name",OPT_PROGNAME,"NAME", OPTION_HIDDEN, N_("Set the program name")}, + {"HANG", OPT_HANG, "SECS", OPTION_ARG_OPTIONAL | OPTION_HIDDEN, + N_("Hang for SECS seconds (default 3600)")}, + {0, 0} +}; + +static error_t +argp_default_parser (int key, char *arg, struct argp_state *state) +{ + switch (key) + { + case '?': + __argp_state_help (state, state->out_stream, ARGP_HELP_STD_HELP); + break; + case OPT_USAGE: + __argp_state_help (state, state->out_stream, + ARGP_HELP_USAGE | ARGP_HELP_EXIT_OK); + break; + + case OPT_PROGNAME: /* Set the program name. */ +#if HAVE_PROGRAM_INVOCATION_NAME + program_invocation_name = arg; +#endif + /* [Note that some systems only have PROGRAM_INVOCATION_SHORT_NAME (aka + __PROGNAME), in which case, PROGRAM_INVOCATION_NAME is just defined + to be that, so we have to be a bit careful here.] */ + + /* Update what we use for messages. */ + + state->name = __argp_basename(arg); + +#if HAVE_PROGRAM_INVOCATION_SHORT_NAME + program_invocation_short_name = state->name; +#endif + + if ((state->flags & (ARGP_PARSE_ARGV0 | ARGP_NO_ERRS)) + == ARGP_PARSE_ARGV0) + /* Update what getopt uses too. */ + state->argv[0] = arg; + + break; + + case OPT_HANG: + _argp_hang = atoi (arg ? arg : "3600"); + fprintf(state->err_stream, "%s: pid = %ld\n", + state->name, (long) getpid()); + while (_argp_hang-- > 0) + __sleep (1); + break; + + default: + return EBADKEY; + } + return 0; +} + +static const struct argp argp_default_argp = + {argp_default_options, &argp_default_parser, NULL, NULL, NULL, NULL, "libc"}; + + +static const struct argp_option argp_version_options[] = +{ + {"version", 'V', 0, 0, N_("Print program version"), -1}, + {0, 0} +}; + +static error_t +argp_version_parser (int key, char *arg UNUSED, struct argp_state *state) +{ + switch (key) + { + case 'V': + if (argp_program_version_hook) + (*argp_program_version_hook) (state->out_stream, state); + else if (argp_program_version) + fprintf (state->out_stream, "%s\n", argp_program_version); + else + __argp_error (state, dgettext (state->root_argp->argp_domain, + "(PROGRAM ERROR) No version known!?")); + if (! (state->flags & ARGP_NO_EXIT)) + exit (0); + break; + default: + return EBADKEY; + } + return 0; +} + +static const struct argp argp_version_argp = + {argp_version_options, &argp_version_parser, NULL, NULL, NULL, NULL, "libc"}; + + + +/* The state of a `group' during parsing. Each group corresponds to a + particular argp structure from the tree of such descending from the top + level argp passed to argp_parse. */ +struct group +{ + /* This group's parsing function. */ + argp_parser_t parser; + + /* Which argp this group is from. */ + const struct argp *argp; + + /* The number of non-option args sucessfully handled by this parser. */ + unsigned args_processed; + + /* This group's parser's parent's group. */ + struct group *parent; + unsigned parent_index; /* And the our position in the parent. */ + + /* These fields are swapped into and out of the state structure when + calling this group's parser. */ + void *input, **child_inputs; + void *hook; +}; + +/* Call GROUP's parser with KEY and ARG, swapping any group-specific info + from STATE before calling, and back into state afterwards. If GROUP has + no parser, EBADKEY is returned. */ +static error_t +group_parse (struct group *group, struct argp_state *state, int key, char *arg) +{ + if (group->parser) + { + error_t err; + state->hook = group->hook; + state->input = group->input; + state->child_inputs = group->child_inputs; + state->arg_num = group->args_processed; + err = (*group->parser)(key, arg, state); + group->hook = state->hook; + return err; + } + else + return EBADKEY; +} + +struct parser +{ + const struct argp *argp; + + const char *posixly_correct; + + /* True if there are only no-option arguments left, which are just + passed verbatim with ARGP_KEY_ARG. This is set if we encounter a + quote, or the end of the proper options, but may be cleared again + if the user moves the next argument pointer backwards. */ + int args_only; + + /* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, the default is + REQUIRE_ORDER if the environment variable POSIXLY_CORRECT is + defined, PERMUTE otherwise. + + REQUIRE_ORDER means don't recognize them as options; stop option + processing when the first non-option is seen. This is what Unix + does. This mode of operation is selected by either setting the + environment variable POSIXLY_CORRECT, or using `+' as the first + character of the list of option characters. + + PERMUTE is the default. We permute the contents of ARGV as we + scan, so that eventually all the non-options are at the end. This + allows options to be given in any order, even with programs that + were not written to expect this. + + RETURN_IN_ORDER is an option available to programs that were + written to expect options and other ARGV-elements in any order + and that care about the ordering of the two. We describe each + non-option ARGV-element as if it were the argument of an option + with character code 1. Using `-' as the first character of the + list of option characters selects this mode of operation. + + */ + enum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } ordering; + + /* A segment of non-option arguments that have been skipped for + later processing, after all options. `first_nonopt' is the index + in ARGV of the first of them; `last_nonopt' is the index after + the last of them. + + If quoted or args_only is non-zero, this segment should be empty. */ + + /* FIXME: I'd prefer to use unsigned, but it's more consistent to + use the same type as for state.next. */ + int first_nonopt; + int last_nonopt; + + /* String of all recognized short options. Needed for ARGP_LONG_ONLY. */ + /* FIXME: Perhaps change to a pointer to a suitable bitmap instead? */ + char *short_opts; + + /* For parsing combined short options. */ + char *nextchar; + + /* States of the various parsing groups. */ + struct group *groups; + /* The end of the GROUPS array. */ + struct group *egroup; + /* An vector containing storage for the CHILD_INPUTS field in all groups. */ + void **child_inputs; + + /* State block supplied to parsing routines. */ + struct argp_state state; + + /* Memory used by this parser. */ + void *storage; +}; + +/* Search for a group defining a short option. */ +static const struct argp_option * +find_short_option(struct parser *parser, int key, struct group **p) +{ + struct group *group; + + assert(key >= 0); + assert(isascii(key)); + + for (group = parser->groups; group < parser->egroup; group++) + { + const struct argp_option *opts; + + for (opts = group->argp->options; !__option_is_end(opts); opts++) + if (opts->key == key) + { + *p = group; + return opts; + } + } + return NULL; +} + +enum match_result { MATCH_EXACT, MATCH_PARTIAL, MATCH_NO }; + +/* If defined, allow complete.el-like abbreviations of long options. */ +#ifndef ARGP_COMPLETE +#define ARGP_COMPLETE 0 +#endif + +/* Matches an encountern long-option argument ARG against an option NAME. + * ARG is terminated by NUL or '='. */ +static enum match_result +match_option(const char *arg, const char *name) +{ + unsigned i, j; + for (i = j = 0;; i++, j++) + { + switch(arg[i]) + { + case '\0': + case '=': + return name[j] ? MATCH_PARTIAL : MATCH_EXACT; +#if ARGP_COMPLETE + case '-': + while (name[j] != '-') + if (!name[j++]) + return MATCH_NO; + break; +#endif + default: + if (arg[i] != name[j]) + return MATCH_NO; + } + } +} + +static const struct argp_option * +find_long_option(struct parser *parser, + const char *arg, + struct group **p) +{ + struct group *group; + + /* Partial match found so far. */ + struct group *matched_group = NULL; + const struct argp_option *matched_option = NULL; + + /* Number of partial matches. */ + int num_partial = 0; + + for (group = parser->groups; group < parser->egroup; group++) + { + const struct argp_option *opts; + + for (opts = group->argp->options; !__option_is_end(opts); opts++) + { + if (!opts->name) + continue; + switch (match_option(arg, opts->name)) + { + case MATCH_NO: + break; + case MATCH_PARTIAL: + num_partial++; + + matched_group = group; + matched_option = opts; + + break; + case MATCH_EXACT: + /* Exact match. */ + *p = group; + return opts; + } + } + } + if (num_partial == 1) + { + *p = matched_group; + return matched_option; + } + + return NULL; +} + + +/* The next usable entries in the various parser tables being filled in by + convert_options. */ +struct parser_convert_state +{ + struct parser *parser; + char *short_end; + void **child_inputs_end; +}; + +/* Initialize GROUP from ARGP. If CVT->SHORT_END is non-NULL, short + options are recorded in the short options string. Returns the next + unused group entry. CVT holds state used during the conversion. */ +static struct group * +convert_options (const struct argp *argp, + struct group *parent, unsigned parent_index, + struct group *group, struct parser_convert_state *cvt) +{ + const struct argp_option *opt = argp->options; + const struct argp_child *children = argp->children; + + if (opt || argp->parser) + { + /* This parser needs a group. */ + if (cvt->short_end) + { + /* Record any short options. */ + for ( ; !__option_is_end (opt); opt++) + if (__option_is_short(opt)) + *cvt->short_end++ = opt->key; + } + + group->parser = argp->parser; + group->argp = argp; + group->args_processed = 0; + group->parent = parent; + group->parent_index = parent_index; + group->input = 0; + group->hook = 0; + group->child_inputs = 0; + + if (children) + /* Assign GROUP's CHILD_INPUTS field some space from + CVT->child_inputs_end.*/ + { + unsigned num_children = 0; + while (children[num_children].argp) + num_children++; + group->child_inputs = cvt->child_inputs_end; + cvt->child_inputs_end += num_children; + } + parent = group++; + } + else + parent = 0; + + if (children) + { + unsigned index = 0; + while (children->argp) + group = + convert_options (children++->argp, parent, index++, group, cvt); + } + + return group; +} +/* Allocate and initialize the group structures, so that they are + ordered as if by traversing the corresponding argp parser tree in + pre-order. Also build the list of short options, if that is needed. */ +static void +parser_convert (struct parser *parser, const struct argp *argp) +{ + struct parser_convert_state cvt; + + cvt.parser = parser; + cvt.short_end = parser->short_opts; + cvt.child_inputs_end = parser->child_inputs; + + parser->argp = argp; + + if (argp) + parser->egroup = convert_options (argp, 0, 0, parser->groups, &cvt); + else + parser->egroup = parser->groups; /* No parsers at all! */ + + if (parser->short_opts) + *cvt.short_end ='\0'; +} + +/* Lengths of various parser fields which we will allocated. */ +struct parser_sizes +{ + /* Needed only ARGP_LONG_ONLY */ + size_t short_len; /* Number of short options. */ + + size_t num_groups; /* Group structures we allocate. */ + size_t num_child_inputs; /* Child input slots. */ +}; + +/* For ARGP, increments the NUM_GROUPS field in SZS by the total + number of argp structures descended from it, and the SHORT_LEN by + the total number of short options. */ +static void +calc_sizes (const struct argp *argp, struct parser_sizes *szs) +{ + const struct argp_child *child = argp->children; + const struct argp_option *opt = argp->options; + + if (opt || argp->parser) + { + /* This parser needs a group. */ + szs->num_groups++; + if (opt) + { + while (__option_is_short (opt++)) + szs->short_len++; + } + } + + if (child) + while (child->argp) + { + calc_sizes ((child++)->argp, szs); + szs->num_child_inputs++; + } +} + +/* Initializes PARSER to parse ARGP in a manner described by FLAGS. */ +static error_t +parser_init (struct parser *parser, const struct argp *argp, + int argc, char **argv, int flags, void *input) +{ + error_t err = 0; + struct group *group; + struct parser_sizes szs; + + parser->posixly_correct = getenv ("POSIXLY_CORRECT"); + + if (flags & ARGP_IN_ORDER) + parser->ordering = RETURN_IN_ORDER; + else if (flags & ARGP_NO_ARGS) + parser->ordering = REQUIRE_ORDER; + else if (parser->posixly_correct) + parser->ordering = REQUIRE_ORDER; + else + parser->ordering = PERMUTE; + + szs.short_len = 0; + szs.num_groups = 0; + szs.num_child_inputs = 0; + + if (argp) + calc_sizes (argp, &szs); + + if (!(flags & ARGP_LONG_ONLY)) + /* We have no use for the short option array. */ + szs.short_len = 0; + + /* Lengths of the various bits of storage used by PARSER. */ +#define GLEN (szs.num_groups + 1) * sizeof (struct group) +#define CLEN (szs.num_child_inputs * sizeof (void *)) +#define SLEN (szs.short_len + 1) +#define STORAGE(offset) ((void *) (((char *) parser->storage) + (offset))) + + parser->storage = malloc (GLEN + CLEN + SLEN); + if (! parser->storage) + return ENOMEM; + + parser->groups = parser->storage; + + parser->child_inputs = STORAGE(GLEN); + memset (parser->child_inputs, 0, szs.num_child_inputs * sizeof (void *)); + + if (flags & ARGP_LONG_ONLY) + parser->short_opts = STORAGE(GLEN + CLEN); + else + parser->short_opts = NULL; + + parser_convert (parser, argp); + + memset (&parser->state, 0, sizeof (struct argp_state)); + + parser->state.root_argp = parser->argp; + parser->state.argc = argc; + parser->state.argv = argv; + parser->state.flags = flags; + parser->state.err_stream = stderr; + parser->state.out_stream = stdout; + parser->state.pstate = parser; + + parser->args_only = 0; + parser->nextchar = NULL; + parser->first_nonopt = parser->last_nonopt = 0; + + /* Call each parser for the first time, giving it a chance to propagate + values to child parsers. */ + if (parser->groups < parser->egroup) + parser->groups->input = input; + for (group = parser->groups; + group < parser->egroup && (!err || err == EBADKEY); + group++) + { + if (group->parent) + /* If a child parser, get the initial input value from the parent. */ + group->input = group->parent->child_inputs[group->parent_index]; + + if (!group->parser + && group->argp->children && group->argp->children->argp) + /* For the special case where no parsing function is supplied for an + argp, propagate its input to its first child, if any (this just + makes very simple wrapper argps more convenient). */ + group->child_inputs[0] = group->input; + + err = group_parse (group, &parser->state, ARGP_KEY_INIT, 0); + } + if (err == EBADKEY) + err = 0; /* Some parser didn't understand. */ + + if (err) + return err; + + if (argv[0] && !(parser->state.flags & ARGP_PARSE_ARGV0)) + /* There's an argv[0]; use it for messages. */ + { + parser->state.name = __argp_basename(argv[0]); + + /* Don't parse it as an argument. */ + parser->state.next = 1; + } + else + parser->state.name = __argp_short_program_name(NULL); + + return 0; +} + +/* Free any storage consumed by PARSER (but not PARSER itself). */ +static error_t +parser_finalize (struct parser *parser, + error_t err, int arg_ebadkey, int *end_index) +{ + struct group *group; + + if (err == EBADKEY && arg_ebadkey) + /* Suppress errors generated by unparsed arguments. */ + err = 0; + + if (! err) + { + if (parser->state.next == parser->state.argc) + /* We successfully parsed all arguments! Call all the parsers again, + just a few more times... */ + { + for (group = parser->groups; + group < parser->egroup && (!err || err==EBADKEY); + group++) + if (group->args_processed == 0) + err = group_parse (group, &parser->state, ARGP_KEY_NO_ARGS, 0); + for (group = parser->egroup - 1; + group >= parser->groups && (!err || err==EBADKEY); + group--) + err = group_parse (group, &parser->state, ARGP_KEY_END, 0); + + if (err == EBADKEY) + err = 0; /* Some parser didn't understand. */ + + /* Tell the user that all arguments are parsed. */ + if (end_index) + *end_index = parser->state.next; + } + else if (end_index) + /* Return any remaining arguments to the user. */ + *end_index = parser->state.next; + else + /* No way to return the remaining arguments, they must be bogus. */ + { + if (!(parser->state.flags & ARGP_NO_ERRS) + && parser->state.err_stream) + fprintf (parser->state.err_stream, + dgettext (parser->argp->argp_domain, + "%s: Too many arguments\n"), + parser->state.name); + err = EBADKEY; + } + } + + /* Okay, we're all done, with either an error or success; call the parsers + to indicate which one. */ + + if (err) + { + /* Maybe print an error message. */ + if (err == EBADKEY) + /* An appropriate message describing what the error was should have + been printed earlier. */ + __argp_state_help (&parser->state, parser->state.err_stream, + ARGP_HELP_STD_ERR); + + /* Since we didn't exit, give each parser an error indication. */ + for (group = parser->groups; group < parser->egroup; group++) + group_parse (group, &parser->state, ARGP_KEY_ERROR, 0); + } + else + /* Notify parsers of success, and propagate back values from parsers. */ + { + /* We pass over the groups in reverse order so that child groups are + given a chance to do there processing before passing back a value to + the parent. */ + for (group = parser->egroup - 1 + ; group >= parser->groups && (!err || err == EBADKEY) + ; group--) + err = group_parse (group, &parser->state, ARGP_KEY_SUCCESS, 0); + if (err == EBADKEY) + err = 0; /* Some parser didn't understand. */ + } + + /* Call parsers once more, to do any final cleanup. Errors are ignored. */ + for (group = parser->egroup - 1; group >= parser->groups; group--) + group_parse (group, &parser->state, ARGP_KEY_FINI, 0); + + if (err == EBADKEY) + err = EINVAL; + + free (parser->storage); + + return err; +} + +/* Call the user parsers to parse the non-option argument VAL, at the + current position, returning any error. The state NEXT pointer + should point to the argument; this function will adjust it + correctly to reflect however many args actually end up being + consumed. */ +static error_t +parser_parse_arg (struct parser *parser, char *val) +{ + /* Save the starting value of NEXT */ + int index = parser->state.next; + error_t err = EBADKEY; + struct group *group; + int key = 0; /* Which of ARGP_KEY_ARG[S] we used. */ + + /* Try to parse the argument in each parser. */ + for (group = parser->groups + ; group < parser->egroup && err == EBADKEY + ; group++) + { + parser->state.next++; /* For ARGP_KEY_ARG, consume the arg. */ + key = ARGP_KEY_ARG; + err = group_parse (group, &parser->state, key, val); + + if (err == EBADKEY) + /* This parser doesn't like ARGP_KEY_ARG; try ARGP_KEY_ARGS instead. */ + { + parser->state.next--; /* For ARGP_KEY_ARGS, put back the arg. */ + key = ARGP_KEY_ARGS; + err = group_parse (group, &parser->state, key, 0); + } + } + + if (! err) + { + if (key == ARGP_KEY_ARGS) + /* The default for ARGP_KEY_ARGS is to assume that if NEXT isn't + changed by the user, *all* arguments should be considered + consumed. */ + parser->state.next = parser->state.argc; + + if (parser->state.next > index) + /* Remember that we successfully processed a non-option + argument -- but only if the user hasn't gotten tricky and set + the clock back. */ + (--group)->args_processed += (parser->state.next - index); + else + /* The user wants to reparse some args, so try looking for options again. */ + parser->args_only = 0; + } + + return err; +} + +/* Exchange two adjacent subsequences of ARGV. + One subsequence is elements [first_nonopt,last_nonopt) + which contains all the non-options that have been skipped so far. + The other is elements [last_nonopt,next), which contains all + the options processed since those non-options were skipped. + + `first_nonopt' and `last_nonopt' are relocated so that they describe + the new indices of the non-options in ARGV after they are moved. */ + +static void +exchange (struct parser *parser) +{ + int bottom = parser->first_nonopt; + int middle = parser->last_nonopt; + int top = parser->state.next; + char **argv = parser->state.argv; + + char *tem; + + /* Exchange the shorter segment with the far end of the longer segment. + That puts the shorter segment into the right place. + It leaves the longer segment in the right place overall, + but it consists of two parts that need to be swapped next. */ + + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + /* Bottom segment is the short one. */ + int len = middle - bottom; + register int i; + + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + } + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } + else + { + /* Top segment is the short one. */ + int len = top - middle; + register int i; + + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + } + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } + } + + /* Update records for the slots the non-options now occupy. */ + + parser->first_nonopt += (parser->state.next - parser->last_nonopt); + parser->last_nonopt = parser->state.next; +} + + + +enum arg_type { ARG_ARG, ARG_SHORT_OPTION, + ARG_LONG_OPTION, ARG_LONG_ONLY_OPTION, + ARG_QUOTE }; + +static enum arg_type +classify_arg(struct parser *parser, char *arg, char **opt) +{ + if (arg[0] == '-') + /* Looks like an option... */ + switch (arg[1]) + { + case '\0': + /* "-" is not an option. */ + return ARG_ARG; + case '-': + /* Long option, or quote. */ + if (!arg[2]) + return ARG_QUOTE; + + /* A long option. */ + if (opt) + *opt = arg + 2; + return ARG_LONG_OPTION; + + default: + /* Short option. But if ARGP_LONG_ONLY, it can also be a long option. */ + + if (opt) + *opt = arg + 1; + + if (parser->state.flags & ARGP_LONG_ONLY) + { + /* Rules from getopt.c: + + If long_only and the ARGV-element has the form "-f", + where f is a valid short option, don't consider it an + abbreviated form of a long option that starts with f. + Otherwise there would be no way to give the -f short + option. + + On the other hand, if there's a long option "fubar" and + the ARGV-element is "-fu", do consider that an + abbreviation of the long option, just like "--fu", and + not "-f" with arg "u". + + This distinction seems to be the most useful approach. */ + + assert(parser->short_opts); + + if (arg[2] || !strchr(parser->short_opts, arg[1])) + return ARG_LONG_ONLY_OPTION; + } + + return ARG_SHORT_OPTION; + } + + else + return ARG_ARG; +} + +/* Parse the next argument in PARSER (as indicated by PARSER->state.next). + Any error from the parsers is returned, and *ARGP_EBADKEY indicates + whether a value of EBADKEY is due to an unrecognized argument (which is + generally not fatal). */ +static error_t +parser_parse_next (struct parser *parser, int *arg_ebadkey) +{ + if (parser->state.quoted && parser->state.next < parser->state.quoted) + /* The next argument pointer has been moved to before the quoted + region, so pretend we never saw the quoting `--', and start + looking for options again. If the `--' is still there we'll just + process it one more time. */ + parser->state.quoted = parser->args_only = 0; + + /* Give FIRST_NONOPT & LAST_NONOPT rational values if NEXT has been + moved back by the user (who may also have changed the arguments). */ + if (parser->last_nonopt > parser->state.next) + parser->last_nonopt = parser->state.next; + if (parser->first_nonopt > parser->state.next) + parser->first_nonopt = parser->state.next; + + if (parser->nextchar) + /* Deal with short options. */ + { + struct group *group; + char c; + const struct argp_option *option; + char *value = NULL;; + + assert(!parser->args_only); + + c = *parser->nextchar++; + + option = find_short_option(parser, c, &group); + if (!option) + { + if (parser->posixly_correct) + /* 1003.2 specifies the format of this message. */ + fprintf (parser->state.err_stream, + dgettext(parser->state.root_argp->argp_domain, + "%s: illegal option -- %c\n"), + parser->state.name, c); + else + fprintf (parser->state.err_stream, + dgettext(parser->state.root_argp->argp_domain, + "%s: invalid option -- %c\n"), + parser->state.name, c); + + *arg_ebadkey = 0; + return EBADKEY; + } + + if (!*parser->nextchar) + parser->nextchar = NULL; + + if (option->arg) + { + value = parser->nextchar; + parser->nextchar = NULL; + + if (!value + && !(option->flags & OPTION_ARG_OPTIONAL)) + /* We need an mandatory argument. */ + { + if (parser->state.next == parser->state.argc) + /* Missing argument */ + { + /* 1003.2 specifies the format of this message. */ + fprintf (parser->state.err_stream, + dgettext(parser->state.root_argp->argp_domain, + "%s: option requires an argument -- %c\n"), + parser->state.name, c); + + *arg_ebadkey = 0; + return EBADKEY; + } + value = parser->state.argv[parser->state.next++]; + } + } + return group_parse(group, &parser->state, + option->key, value); + } + else + /* Advance to the next ARGV-element. */ + { + if (parser->args_only) + { + *arg_ebadkey = 1; + if (parser->state.next >= parser->state.argc) + /* We're done. */ + return EBADKEY; + else + return parser_parse_arg(parser, + parser->state.argv[parser->state.next]); + } + + if (parser->state.next >= parser->state.argc) + /* Almost done. If there are non-options that we skipped + previously, we should process them now. */ + { + *arg_ebadkey = 1; + if (parser->first_nonopt != parser->last_nonopt) + { + /* Start processing the arguments we skipped previously. */ + parser->state.next = parser->first_nonopt; + + parser->first_nonopt = parser->last_nonopt = 0; + + parser->args_only = 1; + return 0; + } + else + /* Indicate that we're really done. */ + return EBADKEY; + } + else + /* Look for options. */ + { + char *arg = parser->state.argv[parser->state.next]; + + char *optstart; + enum arg_type token = classify_arg(parser, arg, &optstart); + + switch (token) + { + case ARG_ARG: + switch (parser->ordering) + { + case PERMUTE: + if (parser->first_nonopt == parser->last_nonopt) + /* Skipped sequence is empty; start a new one. */ + parser->first_nonopt = parser->last_nonopt = parser->state.next; + + else if (parser->last_nonopt != parser->state.next) + /* We have a non-empty skipped sequence, and + we're not at the end-point, so move it. */ + exchange(parser); + + assert(parser->last_nonopt == parser->state.next); + + /* Skip this argument for now. */ + parser->state.next++; + parser->last_nonopt = parser->state.next; + + return 0; + + case REQUIRE_ORDER: + /* Implicit quote before the first argument. */ + parser->args_only = 1; + return 0; + + case RETURN_IN_ORDER: + *arg_ebadkey = 1; + return parser_parse_arg(parser, arg); + + default: + abort(); + } + case ARG_QUOTE: + /* Skip it, then exchange with any previous non-options. */ + parser->state.next++; + assert (parser->last_nonopt != parser->state.next); + + if (parser->first_nonopt != parser->last_nonopt) + { + exchange(parser); + + /* Start processing the skipped and the quoted + arguments. */ + + parser->state.quoted = parser->state.next = parser->first_nonopt; + + /* Also empty the skipped-list, to avoid confusion + if the user resets the next pointer. */ + parser->first_nonopt = parser->last_nonopt = 0; + } + else + parser->state.quoted = parser->state.next; + + parser->args_only = 1; + return 0; + + case ARG_LONG_ONLY_OPTION: + case ARG_LONG_OPTION: + { + struct group *group; + const struct argp_option *option; + char *value; + + parser->state.next++; + option = find_long_option(parser, optstart, &group); + + if (!option) + { + /* NOTE: This includes any "=something" in the output. */ + fprintf (parser->state.err_stream, + dgettext(parser->state.root_argp->argp_domain, + "%s: unrecognized option `%s'\n"), + parser->state.name, arg); + *arg_ebadkey = 0; + return EBADKEY; + } + + value = strchr(optstart, '='); + if (value) + value++; + + if (value && !option->arg) + /* Unexpected argument. */ + { + if (token == ARG_LONG_OPTION) + /* --option */ + fprintf (parser->state.err_stream, + dgettext(parser->state.root_argp->argp_domain, + "%s: option `--%s' doesn't allow an argument\n"), + parser->state.name, option->name); + else + /* +option or -option */ + fprintf (parser->state.err_stream, + dgettext(parser->state.root_argp->argp_domain, + "%s: option `%c%s' doesn't allow an argument\n"), + parser->state.name, arg[0], option->name); + + *arg_ebadkey = 0; + return EBADKEY; + } + + if (option->arg && !value + && !(option->flags & OPTION_ARG_OPTIONAL)) + /* We need an mandatory argument. */ + { + if (parser->state.next == parser->state.argc) + /* Missing argument */ + { + if (token == ARG_LONG_OPTION) + /* --option */ + fprintf (parser->state.err_stream, + dgettext(parser->state.root_argp->argp_domain, + "%s: option `--%s' requires an argument\n"), + parser->state.name, option->name); + else + /* +option or -option */ + fprintf (parser->state.err_stream, + dgettext(parser->state.root_argp->argp_domain, + "%s: option `%c%s' requires an argument\n"), + parser->state.name, arg[0], option->name); + + *arg_ebadkey = 0; + return EBADKEY; + } + + value = parser->state.argv[parser->state.next++]; + } + *arg_ebadkey = 0; + return group_parse(group, &parser->state, + option->key, value); + } + case ARG_SHORT_OPTION: + parser->state.next++; + parser->nextchar = optstart; + return 0; + + default: + abort(); + } + } + } +} + +/* Parse the options strings in ARGC & ARGV according to the argp in ARGP. + FLAGS is one of the ARGP_ flags above. If END_INDEX is non-NULL, the + index in ARGV of the first unparsed option is returned in it. If an + unknown option is present, EINVAL is returned; if some parser routine + returned a non-zero value, it is returned; otherwise 0 is returned. */ +error_t +__argp_parse (const struct argp *argp, int argc, char **argv, unsigned flags, + int *end_index, void *input) +{ + error_t err; + struct parser parser; + + /* If true, then err == EBADKEY is a result of a non-option argument failing + to be parsed (which in some cases isn't actually an error). */ + int arg_ebadkey = 0; + + if (! (flags & ARGP_NO_HELP)) + /* Add our own options. */ + { + struct argp_child *child = malloc (4 * sizeof (struct argp_child)); + struct argp *top_argp = malloc (sizeof (struct argp)); + + /* TOP_ARGP has no options, it just serves to group the user & default + argps. */ + memset (top_argp, 0, sizeof (*top_argp)); + top_argp->children = child; + + memset (child, 0, 4 * sizeof (struct argp_child)); + + if (argp) + (child++)->argp = argp; + (child++)->argp = &argp_default_argp; + if (argp_program_version || argp_program_version_hook) + (child++)->argp = &argp_version_argp; + child->argp = 0; + + argp = top_argp; + } + + /* Construct a parser for these arguments. */ + err = parser_init (&parser, argp, argc, argv, flags, input); + + if (! err) + /* Parse! */ + { + while (! err) + err = parser_parse_next (&parser, &arg_ebadkey); + err = parser_finalize (&parser, err, arg_ebadkey, end_index); + } + + return err; +} +#ifdef weak_alias +weak_alias (__argp_parse, argp_parse) +#endif + +/* Return the input field for ARGP in the parser corresponding to STATE; used + by the help routines. */ +void * +__argp_input (const struct argp *argp, const struct argp_state *state) +{ + if (state) + { + struct group *group; + struct parser *parser = state->pstate; + + for (group = parser->groups; group < parser->egroup; group++) + if (group->argp == argp) + return group->input; + } + + return 0; +} +#ifdef weak_alias +weak_alias (__argp_input, _argp_input) +#endif + +/* Defined here, in case a user is not inlining the definitions in + * argp.h */ +void +__argp_usage (__const struct argp_state *__state) __THROW +{ + __argp_state_help (__state, stderr, ARGP_HELP_STD_USAGE); +} + +int +__option_is_short (__const struct argp_option *__opt) __THROW +{ + if (__opt->flags & OPTION_DOC) + return 0; + else + { + int __key = __opt->key; + /* FIXME: whether or not a particular key implies a short option + * ought not to be locale dependent. */ + return __key > 0 && isprint (__key); + } +} + +int +__option_is_end (__const struct argp_option *__opt) __THROW +{ + return !__opt->key && !__opt->name && !__opt->doc && !__opt->group; +} diff --git a/argp/argp-pv.c b/argp/argp-pv.c new file mode 100644 index 0000000..5061074 --- /dev/null +++ b/argp/argp-pv.c @@ -0,0 +1,25 @@ +/* Default definition for ARGP_PROGRAM_VERSION. + Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* If set by the user program to a non-zero value, then a default option + --version is added (unless the ARGP_NO_HELP flag is used), which will + print this this string followed by a newline and exit (unless the + ARGP_NO_EXIT flag is used). Overridden by ARGP_PROGRAM_VERSION_HOOK. */ +const char *argp_program_version; diff --git a/argp/argp-pvh.c b/argp/argp-pvh.c new file mode 100644 index 0000000..2d0bd39 --- /dev/null +++ b/argp/argp-pvh.c @@ -0,0 +1,32 @@ +/* Default definition for ARGP_PROGRAM_VERSION_HOOK. + Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "argp.h" + +/* If set by the user program to a non-zero value, then a default option + --version is added (unless the ARGP_NO_HELP flag is used), which calls + this function with a stream to print the version to and a pointer to the + current parsing state, and then exits (unless the ARGP_NO_EXIT flag is + used). This variable takes precedent over ARGP_PROGRAM_VERSION. */ +void (*argp_program_version_hook) (FILE *stream, struct argp_state *state); diff --git a/argp/argp-test.c b/argp/argp-test.c new file mode 100644 index 0000000..8165902 --- /dev/null +++ b/argp/argp-test.c @@ -0,0 +1,259 @@ +/* Test program for argp argument parser + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include "argp.h" + +#ifndef UNUSED +# if __GNUC__ >= 2 +# define UNUSED __attribute__ ((__unused__)) +# else +# define UNUSED +# endif +#endif + +#if !HAVE_ASPRINTF +#include + +static int +asprintf (char **result, const char *format, ...) +{ + size_t size; + char *p; + + for (size = 200, p = NULL;; size *= 2) + { + va_list args; + int written; + + p = realloc(p, size + 1); + if (!p) + { + fprintf(stderr, "Virtual memory exhausted.\n"); + abort(); + } + + p[size] = '\0'; + + va_start(args, format); + written = vsnprintf(p, size, format, args); + va_end(args); + + if (written >= 0) + { + *result = p; + return written; + } + } +} +#endif /* !HAVE_ASPRINTF */ + +const char *argp_program_version = "argp-test 1.0"; + +struct argp_option sub_options[] = +{ + {"subopt1", 's', 0, 0, "Nested option 1"}, + {"subopt2", 'S', 0, 0, "Nested option 2"}, + + { 0, 0, 0, 0, "Some more nested options:", 10}, + {"subopt3", 'p', 0, 0, "Nested option 3"}, + + {"subopt4", 'q', 0, 0, "Nested option 4", 1}, + + {0} +}; + +static const char sub_args_doc[] = "STRING...\n-"; +static const char sub_doc[] = "\vThis is the doc string from the sub-arg-parser."; + +static error_t +sub_parse_opt (int key, char *arg, struct argp_state *state UNUSED) +{ + switch (key) + { + case ARGP_KEY_NO_ARGS: + printf ("NO SUB ARGS\n"); + break; + case ARGP_KEY_ARG: + printf ("SUB ARG: %s\n", arg); + break; + + case 's' : case 'S': case 'p': case 'q': + printf ("SUB KEY %c\n", key); + break; + + default: + return ARGP_ERR_UNKNOWN; + } + return 0; +} + +static char * +sub_help_filter (int key, const char *text, void *input UNUSED) +{ + if (key == ARGP_KEY_HELP_EXTRA) + return strdup ("This is some extra text from the sub parser (note that it \ +is preceded by a blank line)."); + else + return (char *)text; +} + +static struct argp sub_argp = { + sub_options, sub_parse_opt, sub_args_doc, sub_doc, 0, sub_help_filter +}; + +/* Structure used to communicate with the parsing functions. */ +struct params +{ + unsigned foonly; /* Value parsed for foonly. */ + unsigned foonly_default; /* Default value for it. */ +}; + +#define OPT_PGRP 1 +#define OPT_SESS 2 + +struct argp_option options[] = +{ + {"pid", 'p', "PID", 0, "List the process PID"}, + {"pgrp", OPT_PGRP,"PGRP",0, "List processes in the process group PGRP"}, + {"no-parent", 'P', 0, 0, "Include processes without parents"}, + {0, 'x', 0, OPTION_ALIAS}, + {"all-fields",'Q', 0, 0, "Don't elide unusable fields (normally" + " if there's some reason ps can't" + " print a field for any process, it's" + " removed from the output entirely)" }, + {"reverse", 'r', 0, 0, "Reverse the order of any sort"}, + {"gratuitously-long-reverse-option", 0, 0, OPTION_ALIAS}, + {"session", OPT_SESS,"SID", OPTION_ARG_OPTIONAL, + "Add the processes from the session" + " SID (which defaults to the sid of" + " the current process)" }, + + {0,0,0,0, "Here are some more options:"}, + {"foonly", 'f', "ZOT", OPTION_ARG_OPTIONAL, "Glork a foonly"}, + {"zaza", 'z', 0, 0, "Snit a zar"}, + + {0} +}; + +static const char args_doc[] = "STRING"; +static const char doc[] = "Test program for argp." + "\vThis doc string comes after the options." + "\nHey! Some manual formatting!" + "\nThe current time is: %s"; + +static void +popt (int key, char *arg) +{ + char buf[10]; + if (isprint (key)) + sprintf (buf, "%c", key); + else + sprintf (buf, "%d", key); + if (arg) + printf ("KEY %s: %s\n", buf, arg); + else + printf ("KEY %s\n", buf); +} + +static error_t +parse_opt (int key, char *arg, struct argp_state *state) +{ + struct params *params = state->input; + + switch (key) + { + case ARGP_KEY_NO_ARGS: + printf ("NO ARGS\n"); + break; + + case ARGP_KEY_ARG: + if (state->arg_num > 0) + return ARGP_ERR_UNKNOWN; /* Leave it for the sub-arg parser. */ + printf ("ARG: %s\n", arg); + break; + + case 'f': + if (arg) + params->foonly = atoi (arg); + else + params->foonly = params->foonly_default; + popt (key, arg); + break; + + case 'p': case 'P': case OPT_PGRP: case 'x': case 'Q': + case 'r': case OPT_SESS: case 'z': + popt (key, arg); + break; + + default: + return ARGP_ERR_UNKNOWN; + } + return 0; +} + +static char * +help_filter (int key, const char *text, void *input) +{ + char *new_text; + struct params *params = input; + + if (key == ARGP_KEY_HELP_POST_DOC && text) + { + time_t now = time (0); + asprintf (&new_text, text, ctime (&now)); + } + else if (key == 'f') + /* Show the default for the --foonly option. */ + asprintf (&new_text, "%s (ZOT defaults to %x)", + text, params->foonly_default); + else + new_text = (char *)text; + + return new_text; +} + +static struct argp_child argp_children[] = { { &sub_argp }, { 0 } }; +static struct argp argp = { + options, parse_opt, args_doc, doc, argp_children, help_filter +}; + +int +main (int argc, char **argv) +{ + struct params params; + params.foonly = 0; + params.foonly_default = random (); + argp_parse (&argp, argc, argv, 0, 0, ¶ms); + printf ("After parsing: foonly = %x\n", params.foonly); + return 0; +} diff --git a/argp/argp-xinl.c b/argp/argp-xinl.c new file mode 100644 index 0000000..3710f6f --- /dev/null +++ b/argp/argp-xinl.c @@ -0,0 +1,42 @@ +/* Real definitions for extern inline functions in argp.h + Copyright (C) 1997, 1998 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C 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 the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#ifndef __USE_EXTERN_INLINES +# define __USE_EXTERN_INLINES 1 +#endif +#define ARGP_EI +#undef __OPTIMIZE__ +#define __OPTIMIZE__ +#include "argp.h" + +/* Add weak aliases. */ +#if _LIBC - 0 && defined (weak_alias) + +weak_alias (__argp_usage, argp_usage) +weak_alias (__option_is_short, _option_is_short) +weak_alias (__option_is_end, _option_is_end) + +#endif diff --git a/argp/argp.h b/argp/argp.h new file mode 100644 index 0000000..22b1aa7 --- /dev/null +++ b/argp/argp.h @@ -0,0 +1,594 @@ +/* Hierarchial argument parsing. + Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _ARGP_H +#define _ARGP_H + +#include +#include + +#define __need_error_t +#include + +#ifndef __THROW +# define __THROW +#endif + +#ifndef __const +# define __const const +#endif + +#ifndef __error_t_defined +typedef int error_t; +# define __error_t_defined +#endif + +/* FIXME: We could use a configure test to check for __attribute__, + * just like lsh does. */ +#ifndef PRINTF_STYLE +# if __GNUC__ >= 2 +# define PRINTF_STYLE(f, a) __attribute__ ((__format__ (__printf__, f, a))) +# else +# define PRINTF_STYLE(f, a) +# endif +#endif + +#define __restrict + + +#ifdef __cplusplus +extern "C" { +#endif + +/* A description of a particular option. A pointer to an array of + these is passed in the OPTIONS field of an argp structure. Each option + entry can correspond to one long option and/or one short option; more + names for the same option can be added by following an entry in an option + array with options having the OPTION_ALIAS flag set. */ +struct argp_option +{ + /* The long option name. For more than one name for the same option, you + can use following options with the OPTION_ALIAS flag set. */ + __const char *name; + + /* What key is returned for this option. If > 0 and printable, then it's + also accepted as a short option. */ + int key; + + /* If non-NULL, this is the name of the argument associated with this + option, which is required unless the OPTION_ARG_OPTIONAL flag is set. */ + __const char *arg; + + /* OPTION_ flags. */ + int flags; + + /* The doc string for this option. If both NAME and KEY are 0, This string + will be printed outdented from the normal option column, making it + useful as a group header (it will be the first thing printed in its + group); in this usage, it's conventional to end the string with a `:'. */ + __const char *doc; + + /* The group this option is in. In a long help message, options are sorted + alphabetically within each group, and the groups presented in the order + 0, 1, 2, ..., n, -m, ..., -2, -1. Every entry in an options array with + if this field 0 will inherit the group number of the previous entry, or + zero if it's the first one, unless its a group header (NAME and KEY both + 0), in which case, the previous entry + 1 is the default. Automagic + options such as --help are put into group -1. */ + int group; +}; + +/* The argument associated with this option is optional. */ +#define OPTION_ARG_OPTIONAL 0x1 + +/* This option isn't displayed in any help messages. */ +#define OPTION_HIDDEN 0x2 + +/* This option is an alias for the closest previous non-alias option. This + means that it will be displayed in the same help entry, and will inherit + fields other than NAME and KEY from the aliased option. */ +#define OPTION_ALIAS 0x4 + +/* This option isn't actually an option (and so should be ignored by the + actual option parser), but rather an arbitrary piece of documentation that + should be displayed in much the same manner as the options. If this flag + is set, then the option NAME field is displayed unmodified (e.g., no `--' + prefix is added) at the left-margin (where a *short* option would normally + be displayed), and the documentation string in the normal place. For + purposes of sorting, any leading whitespace and puncuation is ignored, + except that if the first non-whitespace character is not `-', this entry + is displayed after all options (and OPTION_DOC entries with a leading `-') + in the same group. */ +#define OPTION_DOC 0x8 + +/* This option shouldn't be included in `long' usage messages (but is still + included in help messages). This is mainly intended for options that are + completely documented in an argp's ARGS_DOC field, in which case including + the option in the generic usage list would be redundant. For instance, + if ARGS_DOC is "FOO BAR\n-x BLAH", and the `-x' option's purpose is to + distinguish these two cases, -x should probably be marked + OPTION_NO_USAGE. */ +#define OPTION_NO_USAGE 0x10 + +struct argp; /* fwd declare this type */ +struct argp_state; /* " */ +struct argp_child; /* " */ + +/* The type of a pointer to an argp parsing function. */ +typedef error_t (*argp_parser_t) (int key, char *arg, + struct argp_state *state); + +/* What to return for unrecognized keys. For special ARGP_KEY_ keys, such + returns will simply be ignored. For user keys, this error will be turned + into EINVAL (if the call to argp_parse is such that errors are propagated + back to the user instead of exiting); returning EINVAL itself would result + in an immediate stop to parsing in *all* cases. */ +#define ARGP_ERR_UNKNOWN E2BIG /* Hurd should never need E2BIG. XXX */ + +/* Special values for the KEY argument to an argument parsing function. + ARGP_ERR_UNKNOWN should be returned if they aren't understood. + + The sequence of keys to a parsing function is either (where each + uppercased word should be prefixed by `ARGP_KEY_' and opt is a user key): + + INIT opt... NO_ARGS END SUCCESS -- No non-option arguments at all + or INIT (opt | ARG)... END SUCCESS -- All non-option args parsed + or INIT (opt | ARG)... SUCCESS -- Some non-option arg unrecognized + + The third case is where every parser returned ARGP_KEY_UNKNOWN for an + argument, in which case parsing stops at that argument (returning the + unparsed arguments to the caller of argp_parse if requested, or stopping + with an error message if not). + + If an error occurs (either detected by argp, or because the parsing + function returned an error value), then the parser is called with + ARGP_KEY_ERROR, and no further calls are made. */ + +/* This is not an option at all, but rather a command line argument. If a + parser receiving this key returns success, the fact is recorded, and the + ARGP_KEY_NO_ARGS case won't be used. HOWEVER, if while processing the + argument, a parser function decrements the NEXT field of the state it's + passed, the option won't be considered processed; this is to allow you to + actually modify the argument (perhaps into an option), and have it + processed again. */ +#define ARGP_KEY_ARG 0 +/* There are remaining arguments not parsed by any parser, which may be found + starting at (STATE->argv + STATE->next). If success is returned, but + STATE->next left untouched, it's assumed that all arguments were consume, + otherwise, the parser should adjust STATE->next to reflect any arguments + consumed. */ +#define ARGP_KEY_ARGS 0x1000006 +/* There are no more command line arguments at all. */ +#define ARGP_KEY_END 0x1000001 +/* Because it's common to want to do some special processing if there aren't + any non-option args, user parsers are called with this key if they didn't + successfully process any non-option arguments. Called just before + ARGP_KEY_END (where more general validity checks on previously parsed + arguments can take place). */ +#define ARGP_KEY_NO_ARGS 0x1000002 +/* Passed in before any parsing is done. Afterwards, the values of each + element of the CHILD_INPUT field, if any, in the state structure is + copied to each child's state to be the initial value of the INPUT field. */ +#define ARGP_KEY_INIT 0x1000003 +/* Use after all other keys, including SUCCESS & END. */ +#define ARGP_KEY_FINI 0x1000007 +/* Passed in when parsing has successfully been completed (even if there are + still arguments remaining). */ +#define ARGP_KEY_SUCCESS 0x1000004 +/* Passed in if an error occurs. */ +#define ARGP_KEY_ERROR 0x1000005 + +/* An argp structure contains a set of options declarations, a function to + deal with parsing one, documentation string, a possible vector of child + argp's, and perhaps a function to filter help output. When actually + parsing options, getopt is called with the union of all the argp + structures chained together through their CHILD pointers, with conflicts + being resolved in favor of the first occurrence in the chain. */ +struct argp +{ + /* An array of argp_option structures, terminated by an entry with both + NAME and KEY having a value of 0. */ + __const struct argp_option *options; + + /* What to do with an option from this structure. KEY is the key + associated with the option, and ARG is any associated argument (NULL if + none was supplied). If KEY isn't understood, ARGP_ERR_UNKNOWN should be + returned. If a non-zero, non-ARGP_ERR_UNKNOWN value is returned, then + parsing is stopped immediately, and that value is returned from + argp_parse(). For special (non-user-supplied) values of KEY, see the + ARGP_KEY_ definitions below. */ + argp_parser_t parser; + + /* A string describing what other arguments are wanted by this program. It + is only used by argp_usage to print the `Usage:' message. If it + contains newlines, the strings separated by them are considered + alternative usage patterns, and printed on separate lines (lines after + the first are prefix by ` or: ' instead of `Usage:'). */ + __const char *args_doc; + + /* If non-NULL, a string containing extra text to be printed before and + after the options in a long help message (separated by a vertical tab + `\v' character). */ + __const char *doc; + + /* A vector of argp_children structures, terminated by a member with a 0 + argp field, pointing to child argps should be parsed with this one. Any + conflicts are resolved in favor of this argp, or early argps in the + CHILDREN list. This field is useful if you use libraries that supply + their own argp structure, which you want to use in conjunction with your + own. */ + __const struct argp_child *children; + + /* If non-zero, this should be a function to filter the output of help + messages. KEY is either a key from an option, in which case TEXT is + that option's help text, or a special key from the ARGP_KEY_HELP_ + defines, below, describing which other help text TEXT is. The function + should return either TEXT, if it should be used as-is, a replacement + string, which should be malloced, and will be freed by argp, or NULL, + meaning `print nothing'. The value for TEXT is *after* any translation + has been done, so if any of the replacement text also needs translation, + that should be done by the filter function. INPUT is either the input + supplied to argp_parse, or NULL, if argp_help was called directly. */ + char *(*help_filter) (int __key, __const char *__text, void *__input); + + /* If non-zero the strings used in the argp library are translated using + the domain described by this string. Otherwise the currently installed + default domain is used. */ + const char *argp_domain; +}; + +/* Possible KEY arguments to a help filter function. */ +#define ARGP_KEY_HELP_PRE_DOC 0x2000001 /* Help text preceeding options. */ +#define ARGP_KEY_HELP_POST_DOC 0x2000002 /* Help text following options. */ +#define ARGP_KEY_HELP_HEADER 0x2000003 /* Option header string. */ +#define ARGP_KEY_HELP_EXTRA 0x2000004 /* After all other documentation; + TEXT is NULL for this key. */ +/* Explanatory note emitted when duplicate option arguments have been + suppressed. */ +#define ARGP_KEY_HELP_DUP_ARGS_NOTE 0x2000005 +#define ARGP_KEY_HELP_ARGS_DOC 0x2000006 /* Argument doc string. */ + +/* When an argp has a non-zero CHILDREN field, it should point to a vector of + argp_child structures, each of which describes a subsidiary argp. */ +struct argp_child +{ + /* The child parser. */ + __const struct argp *argp; + + /* Flags for this child. */ + int flags; + + /* If non-zero, an optional header to be printed in help output before the + child options. As a side-effect, a non-zero value forces the child + options to be grouped together; to achieve this effect without actually + printing a header string, use a value of "". */ + __const char *header; + + /* Where to group the child options relative to the other (`consolidated') + options in the parent argp; the values are the same as the GROUP field + in argp_option structs, but all child-groupings follow parent options at + a particular group level. If both this field and HEADER are zero, then + they aren't grouped at all, but rather merged with the parent options + (merging the child's grouping levels with the parents). */ + int group; +}; + +/* Parsing state. This is provided to parsing functions called by argp, + which may examine and, as noted, modify fields. */ +struct argp_state +{ + /* The top level ARGP being parsed. */ + __const struct argp *root_argp; + + /* The argument vector being parsed. May be modified. */ + int argc; + char **argv; + + /* The index in ARGV of the next arg that to be parsed. May be modified. */ + int next; + + /* The flags supplied to argp_parse. May be modified. */ + unsigned flags; + + /* While calling a parsing function with a key of ARGP_KEY_ARG, this is the + number of the current arg, starting at zero, and incremented after each + such call returns. At all other times, this is the number of such + arguments that have been processed. */ + unsigned arg_num; + + /* If non-zero, the index in ARGV of the first argument following a special + `--' argument (which prevents anything following being interpreted as an + option). Only set once argument parsing has proceeded past this point. */ + int quoted; + + /* An arbitrary pointer passed in from the user. */ + void *input; + /* Values to pass to child parsers. This vector will be the same length as + the number of children for the current parser. */ + void **child_inputs; + + /* For the parser's use. Initialized to 0. */ + void *hook; + + /* The name used when printing messages. This is initialized to ARGV[0], + or PROGRAM_INVOCATION_NAME if that is unavailable. */ + char *name; + + /* Streams used when argp prints something. */ + FILE *err_stream; /* For errors; initialized to stderr. */ + FILE *out_stream; /* For information; initialized to stdout. */ + + void *pstate; /* Private, for use by argp. */ +}; + +/* Flags for argp_parse (note that the defaults are those that are + convenient for program command line parsing): */ + +/* Don't ignore the first element of ARGV. Normally (and always unless + ARGP_NO_ERRS is set) the first element of the argument vector is + skipped for option parsing purposes, as it corresponds to the program name + in a command line. */ +#define ARGP_PARSE_ARGV0 0x01 + +/* Don't print error messages for unknown options to stderr; unless this flag + is set, ARGP_PARSE_ARGV0 is ignored, as ARGV[0] is used as the program + name in the error messages. This flag implies ARGP_NO_EXIT (on the + assumption that silent exiting upon errors is bad behaviour). */ +#define ARGP_NO_ERRS 0x02 + +/* Don't parse any non-option args. Normally non-option args are parsed by + calling the parse functions with a key of ARGP_KEY_ARG, and the actual arg + as the value. Since it's impossible to know which parse function wants to + handle it, each one is called in turn, until one returns 0 or an error + other than ARGP_ERR_UNKNOWN; if an argument is handled by no one, the + argp_parse returns prematurely (but with a return value of 0). If all + args have been parsed without error, all parsing functions are called one + last time with a key of ARGP_KEY_END. This flag needn't normally be set, + as the normal behavior is to stop parsing as soon as some argument can't + be handled. */ +#define ARGP_NO_ARGS 0x04 + +/* Parse options and arguments in the same order they occur on the command + line -- normally they're rearranged so that all options come first. */ +#define ARGP_IN_ORDER 0x08 + +/* Don't provide the standard long option --help, which causes usage and + option help information to be output to stdout, and exit (0) called. */ +#define ARGP_NO_HELP 0x10 + +/* Don't exit on errors (they may still result in error messages). */ +#define ARGP_NO_EXIT 0x20 + +/* Use the gnu getopt `long-only' rules for parsing arguments. */ +#define ARGP_LONG_ONLY 0x40 + +/* Turns off any message-printing/exiting options. */ +#define ARGP_SILENT (ARGP_NO_EXIT | ARGP_NO_ERRS | ARGP_NO_HELP) + +/* Parse the options strings in ARGC & ARGV according to the options in ARGP. + FLAGS is one of the ARGP_ flags above. If ARG_INDEX is non-NULL, the + index in ARGV of the first unparsed option is returned in it. If an + unknown option is present, ARGP_ERR_UNKNOWN is returned; if some parser + routine returned a non-zero value, it is returned; otherwise 0 is + returned. This function may also call exit unless the ARGP_NO_HELP flag + is set. INPUT is a pointer to a value to be passed in to the parser. */ +extern error_t argp_parse (__const struct argp *__restrict __argp, + int __argc, char **__restrict __argv, + unsigned __flags, int *__restrict __arg_index, + void *__restrict __input) __THROW; +extern error_t __argp_parse (__const struct argp *__restrict __argp, + int __argc, char **__restrict __argv, + unsigned __flags, int *__restrict __arg_index, + void *__restrict __input) __THROW; + +/* Global variables. */ + +/* If defined or set by the user program to a non-zero value, then a default + option --version is added (unless the ARGP_NO_HELP flag is used), which + will print this string followed by a newline and exit (unless the + ARGP_NO_EXIT flag is used). Overridden by ARGP_PROGRAM_VERSION_HOOK. */ +extern __const char *argp_program_version; + +/* If defined or set by the user program to a non-zero value, then a default + option --version is added (unless the ARGP_NO_HELP flag is used), which + calls this function with a stream to print the version to and a pointer to + the current parsing state, and then exits (unless the ARGP_NO_EXIT flag is + used). This variable takes precedent over ARGP_PROGRAM_VERSION. */ +extern void (*argp_program_version_hook) (FILE *__restrict __stream, + struct argp_state *__restrict + __state); + +/* If defined or set by the user program, it should point to string that is + the bug-reporting address for the program. It will be printed by + argp_help if the ARGP_HELP_BUG_ADDR flag is set (as it is by various + standard help messages), embedded in a sentence that says something like + `Report bugs to ADDR.'. */ +extern __const char *argp_program_bug_address; + +/* The exit status that argp will use when exiting due to a parsing error. + If not defined or set by the user program, this defaults to EX_USAGE from + . */ +extern error_t argp_err_exit_status; + +/* Flags for argp_help. */ +#define ARGP_HELP_USAGE 0x01 /* a Usage: message. */ +#define ARGP_HELP_SHORT_USAGE 0x02 /* " but don't actually print options. */ +#define ARGP_HELP_SEE 0x04 /* a `Try ... for more help' message. */ +#define ARGP_HELP_LONG 0x08 /* a long help message. */ +#define ARGP_HELP_PRE_DOC 0x10 /* doc string preceding long help. */ +#define ARGP_HELP_POST_DOC 0x20 /* doc string following long help. */ +#define ARGP_HELP_DOC (ARGP_HELP_PRE_DOC | ARGP_HELP_POST_DOC) +#define ARGP_HELP_BUG_ADDR 0x40 /* bug report address */ +#define ARGP_HELP_LONG_ONLY 0x80 /* modify output appropriately to + reflect ARGP_LONG_ONLY mode. */ + +/* These ARGP_HELP flags are only understood by argp_state_help. */ +#define ARGP_HELP_EXIT_ERR 0x100 /* Call exit(1) instead of returning. */ +#define ARGP_HELP_EXIT_OK 0x200 /* Call exit(0) instead of returning. */ + +/* The standard thing to do after a program command line parsing error, if an + error message has already been printed. */ +#define ARGP_HELP_STD_ERR \ + (ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR) +/* The standard thing to do after a program command line parsing error, if no + more specific error message has been printed. */ +#define ARGP_HELP_STD_USAGE \ + (ARGP_HELP_SHORT_USAGE | ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR) +/* The standard thing to do in response to a --help option. */ +#define ARGP_HELP_STD_HELP \ + (ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG | ARGP_HELP_EXIT_OK \ + | ARGP_HELP_DOC | ARGP_HELP_BUG_ADDR) + +/* Output a usage message for ARGP to STREAM. FLAGS are from the set + ARGP_HELP_*. */ +extern void argp_help (__const struct argp *__restrict __argp, + FILE *__restrict __stream, + unsigned __flags, char *__restrict __name) __THROW; +extern void __argp_help (__const struct argp *__restrict __argp, + FILE *__restrict __stream, unsigned __flags, + char *__name) __THROW; + +/* The following routines are intended to be called from within an argp + parsing routine (thus taking an argp_state structure as the first + argument). They may or may not print an error message and exit, depending + on the flags in STATE -- in any case, the caller should be prepared for + them *not* to exit, and should return an appropiate error after calling + them. [argp_usage & argp_error should probably be called argp_state_..., + but they're used often enough that they should be short] */ + +/* Output, if appropriate, a usage message for STATE to STREAM. FLAGS are + from the set ARGP_HELP_*. */ +extern void argp_state_help (__const struct argp_state *__restrict __state, + FILE *__restrict __stream, + unsigned int __flags) __THROW; +extern void __argp_state_help (__const struct argp_state *__restrict __state, + FILE *__restrict __stream, + unsigned int __flags) __THROW; + +/* Possibly output the standard usage message for ARGP to stderr and exit. */ +extern void argp_usage (__const struct argp_state *__state) __THROW; +extern void __argp_usage (__const struct argp_state *__state) __THROW; + +/* If appropriate, print the printf string FMT and following args, preceded + by the program name and `:', to stderr, and followed by a `Try ... --help' + message, then exit (1). */ +extern void argp_error (__const struct argp_state *__restrict __state, + __const char *__restrict __fmt, ...) __THROW + PRINTF_STYLE(2,3); +extern void __argp_error (__const struct argp_state *__restrict __state, + __const char *__restrict __fmt, ...) __THROW + PRINTF_STYLE(2,3); + +/* Similar to the standard gnu error-reporting function error(), but will + respect the ARGP_NO_EXIT and ARGP_NO_ERRS flags in STATE, and will print + to STATE->err_stream. This is useful for argument parsing code that is + shared between program startup (when exiting is desired) and runtime + option parsing (when typically an error code is returned instead). The + difference between this function and argp_error is that the latter is for + *parsing errors*, and the former is for other problems that occur during + parsing but don't reflect a (syntactic) problem with the input. */ +extern void argp_failure (__const struct argp_state *__restrict __state, + int __status, int __errnum, + __const char *__restrict __fmt, ...) __THROW + PRINTF_STYLE(4,5); +extern void __argp_failure (__const struct argp_state *__restrict __state, + int __status, int __errnum, + __const char *__restrict __fmt, ...) __THROW + PRINTF_STYLE(4,5); + +/* Returns true if the option OPT is a valid short option. */ +extern int _option_is_short (__const struct argp_option *__opt) __THROW; +extern int __option_is_short (__const struct argp_option *__opt) __THROW; + +/* Returns true if the option OPT is in fact the last (unused) entry in an + options array. */ +extern int _option_is_end (__const struct argp_option *__opt) __THROW; +extern int __option_is_end (__const struct argp_option *__opt) __THROW; + +/* Return the input field for ARGP in the parser corresponding to STATE; used + by the help routines. */ +extern void *_argp_input (__const struct argp *__restrict __argp, + __const struct argp_state *__restrict __state) + __THROW; +extern void *__argp_input (__const struct argp *__restrict __argp, + __const struct argp_state *__restrict __state) + __THROW; + +/* Used for extracting the program name from argv[0] */ +extern char *_argp_basename(char *name) __THROW; +extern char *__argp_basename(char *name) __THROW; + +/* Getting the program name given an argp state */ +extern char * +_argp_short_program_name(const struct argp_state *state) __THROW; +extern char * +__argp_short_program_name(const struct argp_state *state) __THROW; + + +#ifdef __USE_EXTERN_INLINES + +# if !_LIBC +# define __argp_usage argp_usage +# define __argp_state_help argp_state_help +# define __option_is_short _option_is_short +# define __option_is_end _option_is_end +# endif + +# ifndef ARGP_EI +# define ARGP_EI extern __inline__ +# endif + +ARGP_EI void +__argp_usage (__const struct argp_state *__state) __THROW +{ + __argp_state_help (__state, stderr, ARGP_HELP_STD_USAGE); +} + +ARGP_EI int +__option_is_short (__const struct argp_option *__opt) __THROW +{ + if (__opt->flags & OPTION_DOC) + return 0; + else + { + int __key = __opt->key; + return __key > 0 && isprint (__key); + } +} + +ARGP_EI int +__option_is_end (__const struct argp_option *__opt) __THROW +{ + return !__opt->key && !__opt->name && !__opt->doc && !__opt->group; +} + +# if !_LIBC +# undef __argp_usage +# undef __argp_state_help +# undef __option_is_short +# undef __option_is_end +# endif +#endif /* Use extern inlines. */ + +#ifdef __cplusplus +} +#endif + +#endif /* argp.h */ diff --git a/argp/config.h.in b/argp/config.h.in new file mode 100644 index 0000000..f27cfbe --- /dev/null +++ b/argp/config.h.in @@ -0,0 +1,133 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if using `alloca.c'. */ +#undef C_ALLOCA + +/* Define to 1 if you have `alloca', as a function or macro. */ +#undef HAVE_ALLOCA + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +#undef HAVE_ALLOCA_H + +/* Define to 1 if you have the `asprintf' function. */ +#undef HAVE_ASPRINTF + +/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ +#undef HAVE_DOPRNT + +/* Define to 1 if you have the `flockfile' function. */ +#undef HAVE_FLOCKFILE + +/* Define to 1 if you have the `fputs_unlocked' function. */ +#undef HAVE_FPUTS_UNLOCKED + +/* Define to 1 if you have the `fwrite_unlocked' function. */ +#undef HAVE_FWRITE_UNLOCKED + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MALLOC_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `mempcpy' function. */ +#undef HAVE_MEMPCPY + +/* Define if the variable exists (usually provided by the linker). */ +#undef HAVE_PROGRAM_INVOCATION_NAME + +/* Define if the variable exists (usually provided by the linker). */ +#undef HAVE_PROGRAM_INVOCATION_SHORT_NAME + +/* Define to 1 if you have the `putc_unlocked' function. */ +#undef HAVE_PUTC_UNLOCKED + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strchrnul' function. */ +#undef HAVE_STRCHRNUL + +/* Define to 1 if you have the `strdup' function. */ +#undef HAVE_STRDUP + +/* Define to 1 if you have the `strerror' function. */ +#undef HAVE_STRERROR + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strndup' function. */ +#undef HAVE_STRNDUP + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the `vprintf' function. */ +#undef HAVE_VPRINTF + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at run-time. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +#undef STACK_DIRECTION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define as `__inline' if that's what the C compiler calls it, or to nothing + if it is not supported. */ +#undef inline + +/* Define to `unsigned' if does not define. */ +#undef size_t diff --git a/argp/configure b/argp/configure new file mode 100755 index 0000000..363308e --- /dev/null +++ b/argp/configure @@ -0,0 +1,5696 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.54 for argp standalone-1.1. +# +# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +# Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in LANG LANGUAGE LC_ALL LC_COLLATE LC_CTYPE LC_NUMERIC LC_MESSAGES LC_TIME +do + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conftest.sh + echo "exit 0" >>conftest.sh + chmod +x conftest.sh + if (PATH="/nonexistent;."; conftest.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conftest.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_config_libobj_dir=. +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME='argp' +PACKAGE_TARNAME='argp' +PACKAGE_VERSION='standalone-1.1' +PACKAGE_STRING='argp standalone-1.1' +PACKAGE_BUGREPORT='' + +ac_unique_file="argp-ba.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO AMTAR install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM AWK SET_MAKE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE RANLIB ac_ct_RANLIB CPP EGREP ALLOCA LIBOBJS LTLIBOBJS' +ac_subst_files='' + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +ac_prev= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_option in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures argp standalone-1.1 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +_ACEOF + + cat <<_ACEOF +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of argp standalone-1.1:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-dependency-tracking Speeds up one-time builds + --enable-dependency-tracking Do not reject slow dependency extractors + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style configure. + if test -f $ac_srcdir/configure.gnu; then + echo + $SHELL $ac_srcdir/configure.gnu --help=recursive + elif test -f $ac_srcdir/configure; then + echo + $SHELL $ac_srcdir/configure --help=recursive + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd $ac_popdir + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF +argp configure standalone-1.1 +generated by GNU Autoconf 2.54 + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit 0 +fi +exec 5>config.log +cat >&5 <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by argp $as_me standalone-1.1, which was +generated by GNU Autoconf 2.54. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" +done + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell meta-characters. +ac_configure_args= +ac_sep= +for ac_arg +do + case $ac_arg in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n ) continue ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + continue ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " +done + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------- ## +## Output files. ## +## ------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + sed "/^$/d" confdefs.h | sort + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core core.* *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" + eval ac_new_val="\$ac_env_${ac_var}_value" + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + + + + + + + + + + + + + +am__api_version="1.6" +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f $ac_dir/shtool; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&5 +echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&2;} + { (exit 1); exit 1; }; } + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! +Check your system clock" >&5 +echo "$as_me: error: newly created file is older than distributed files! +Check your system clock" >&2;} + { (exit 1); exit 1; }; } +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +test "$program_prefix" != NONE && + program_transform_name="s,^,$program_prefix,;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s,\$,$program_suffix,;$program_transform_name" +# Double any \ or $. echo might interpret backslashes. +# By default was `s,x,x', remove it if useless. +cat <<\_ACEOF >conftest.sed +s/[\\$]/&&/g;s/;s,x,x,$// +_ACEOF +program_transform_name=`echo $program_transform_name | sed -f conftest.sed` +rm conftest.sed + + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 +echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AWK+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + echo "$as_me:$LINENO: result: $AWK" >&5 +echo "${ECHO_T}$AWK" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$AWK" && break +done + +echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +all: + @echo 'ac_maketemp="${MAKE}"' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + + # test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { (exit 1); exit 1; }; } +fi + +# Define the identity of the package. + PACKAGE=argp + VERSION=standalone-1.1 + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +install_sh=${install_sh-"$am_aux_dir/install-sh"} + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +echo "${ECHO_T}$ac_ct_STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + STRIP=$ac_ct_STRIP +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. + + + +# Add the stamp file to the list of files AC keeps track of, +# along with our hook. + ac_config_headers="$ac_config_headers config.h" + + + + +# GNU libc defaults to supplying the ISO C library functions only. The +# _GNU_SOURCE define enables these extensions, in particular we want +# errno.h to declare program_invocation_name. Enable it on all +# systems; no problems have been reported with it so far. + +CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE" + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH" >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH" >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +echo "$as_me:$LINENO: checking for C compiler default output" >&5 +echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. + +# Be careful to initialize this variable, since it used to be cached. +# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. +ac_cv_exeext= +for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + a.out ) # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool --akim. + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +check \`config.log' for details." >&5 +echo "$as_me: error: C compiler cannot create executables +check \`config.log' for details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_exeext +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link" >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link" >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile" >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile" >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_compiler_gnu=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_prog_cc_g=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + ''\ + '#include ' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +#include +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +continue +fi +rm -f conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +rm -f .deps 2>/dev/null +mkdir .deps 2>/dev/null +if test -d .deps; then + DEPDIR=.deps +else + # MS-DOS does not allow filenames that begin with a dot. + DEPDIR=_deps +fi +rmdir .deps 2>/dev/null + + + ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +doit: + @echo done +END +# If we don't find an include directive, just comment out the code. +echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | fgrep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi + + +echo "$as_me:$LINENO: result: $_am_result" >&5 +echo "${ECHO_T}$_am_result" >&6 +rm -f confinc confmf + +# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then + enableval="$enable_dependency_tracking" + +fi; +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + + +if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + + +depcc="$CC" am_compiler_list= + +echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + echo '#include "conftest.h"' > conftest.c + echo 'int i;' > conftest.h + echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=conftest.c object=conftest.o \ + depfile=conftest.Po tmpdepfile=conftest.TPo \ + $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 && + grep conftest.h conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + +echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +all: + @echo 'ac_maketemp="${MAKE}"' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + RANLIB=$ac_ct_RANLIB +else + RANLIB="$ac_cv_prog_RANLIB" +fi + + + + + +echo "$as_me:$LINENO: checking for ${CC-cc} option to accept ANSI C" >&5 +echo $ECHO_N "checking for ${CC-cc} option to accept ANSI C... $ECHO_C" >&6 +if test "${am_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + am_cv_prog_cc_stdc=no +ac_save_CC="$CC" +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; + +int +main () +{ + +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + am_cv_prog_cc_stdc="$ac_arg"; break +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext +done +CC="$ac_save_CC" + +fi + +if test -z "$am_cv_prog_cc_stdc"; then + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 +else + echo "$as_me:$LINENO: result: $am_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$am_cv_prog_cc_stdc" >&6 +fi +case "x$am_cv_prog_cc_stdc" in + x|xno) ;; + *) CC="$CC $am_cv_prog_cc_stdc" ;; +esac + + +if test "x$am_cv_prog_cc_stdc" = xno ; then + { { echo "$as_me:$LINENO: error: the C compiler doesn't handle ANSI-C" >&5 +echo "$as_me: error: the C compiler doesn't handle ANSI-C" >&2;} + { (exit 1); exit 1; }; } +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +#include + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6 +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +#include + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check" >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_prog_egrep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 +echo "${ECHO_T}$ac_cv_prog_egrep" >&6 + EGREP=$ac_cv_prog_egrep + + +echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +#include +#include +#include +#include + +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_header_stdc=no +fi +rm -f conftest.err conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + exit(2); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +eval "$as_ac_Header=no" +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + + +for ac_header in limits.h malloc.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; + no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 +echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 +if test "${ac_cv_c_const+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset x; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *ccp; + char **p; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + ccp = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++ccp; + p = (char**) ccp; + ccp = (char const *const *) p; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + } +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_const=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_c_const=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 +echo "${ECHO_T}$ac_cv_c_const" >&6 +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\_ACEOF +#define const +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for inline" >&5 +echo $ECHO_N "checking for inline... $ECHO_C" >&6 +if test "${ac_cv_c_inline+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_inline=$ac_kw; break +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext +done + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 +echo "${ECHO_T}$ac_cv_c_inline" >&6 +case $ac_cv_c_inline in + inline | yes) ;; + no) +cat >>confdefs.h <<\_ACEOF +#define inline +_ACEOF + ;; + *) cat >>confdefs.h <<_ACEOF +#define inline $ac_cv_c_inline +_ACEOF + ;; +esac + +echo "$as_me:$LINENO: checking for size_t" >&5 +echo $ECHO_N "checking for size_t... $ECHO_C" >&6 +if test "${ac_cv_type_size_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +$ac_includes_default +int +main () +{ +if ((size_t *) 0) + return 0; +if (sizeof (size_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_size_t=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_type_size_t=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 +echo "${ECHO_T}$ac_cv_type_size_t" >&6 +if test $ac_cv_type_size_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned +_ACEOF + +fi + + +# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works +# for constant arguments. Useless! +echo "$as_me:$LINENO: checking for working alloca.h" >&5 +echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6 +if test "${ac_cv_working_alloca_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +#include +int +main () +{ +char *p = (char *) alloca (2 * sizeof (int)); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_working_alloca_h=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_working_alloca_h=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_working_alloca_h" >&5 +echo "${ECHO_T}$ac_cv_working_alloca_h" >&6 +if test $ac_cv_working_alloca_h = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_ALLOCA_H 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for alloca" >&5 +echo $ECHO_N "checking for alloca... $ECHO_C" >&6 +if test "${ac_cv_func_alloca_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# ifdef _MSC_VER +# include +# define alloca _alloca +# else +# if HAVE_ALLOCA_H +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char *alloca (); +# endif +# endif +# endif +# endif +#endif + +int +main () +{ +char *p = (char *) alloca (1); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_alloca_works=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_func_alloca_works=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_alloca_works" >&5 +echo "${ECHO_T}$ac_cv_func_alloca_works" >&6 + +if test $ac_cv_func_alloca_works = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_ALLOCA 1 +_ACEOF + +else + # The SVR3 libPW and SVR4 libucb both contain incompatible functions +# that cause trouble. Some versions do not even contain alloca or +# contain a buggy version. If you still want to use their alloca, +# use ar to extract alloca.o from them instead of compiling alloca.c. + +ALLOCA=alloca.$ac_objext + +cat >>confdefs.h <<\_ACEOF +#define C_ALLOCA 1 +_ACEOF + + +echo "$as_me:$LINENO: checking whether \`alloca.c' needs Cray hooks" >&5 +echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6 +if test "${ac_cv_os_cray+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +#if defined(CRAY) && ! defined(CRAY2) +webecray +#else +wenotbecray +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "webecray" >/dev/null 2>&1; then + ac_cv_os_cray=yes +else + ac_cv_os_cray=no +fi +rm -f conftest* + +fi +echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5 +echo "${ECHO_T}$ac_cv_os_cray" >&6 +if test $ac_cv_os_cray = yes; then + for ac_func in _getb67 GETB67 getb67; do + as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. */ +#include +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +char (*f) (); + +int +main () +{ +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +f = $ac_func; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +eval "$as_ac_var=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + +cat >>confdefs.h <<_ACEOF +#define CRAY_STACKSEG_END $ac_func +_ACEOF + + break +fi + + done +fi + +echo "$as_me:$LINENO: checking stack direction for C alloca" >&5 +echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6 +if test "${ac_cv_c_stack_direction+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_c_stack_direction=0 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +int +find_stack_direction () +{ + static char *addr = 0; + auto char dummy; + if (addr == 0) + { + addr = &dummy; + return find_stack_direction (); + } + else + return (&dummy > addr) ? 1 : -1; +} + +int +main () +{ + exit (find_stack_direction () < 0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_stack_direction=1 +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +( exit $ac_status ) +ac_cv_c_stack_direction=-1 +fi +rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_c_stack_direction" >&5 +echo "${ECHO_T}$ac_cv_c_stack_direction" >&6 + +cat >>confdefs.h <<_ACEOF +#define STACK_DIRECTION $ac_cv_c_stack_direction +_ACEOF + + +fi + + +for ac_func in vprintf +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. */ +#include +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +char (*f) (); + +int +main () +{ +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +f = $ac_func; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +eval "$as_ac_var=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +echo "$as_me:$LINENO: checking for _doprnt" >&5 +echo $ECHO_N "checking for _doprnt... $ECHO_C" >&6 +if test "${ac_cv_func__doprnt+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char _doprnt (); below. */ +#include +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char _doprnt (); +char (*f) (); + +int +main () +{ +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub__doprnt) || defined (__stub____doprnt) +choke me +#else +f = _doprnt; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func__doprnt=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_func__doprnt=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func__doprnt" >&5 +echo "${ECHO_T}$ac_cv_func__doprnt" >&6 +if test $ac_cv_func__doprnt = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_DOPRNT 1 +_ACEOF + +fi + +fi +done + + + +for ac_func in strerror +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. */ +#include +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +char (*f) (); + +int +main () +{ +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +f = $ac_func; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +eval "$as_ac_var=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + + + +for ac_func in mempcpy strndup strchrnul +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. */ +#include +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +char (*f) (); + +int +main () +{ +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +f = $ac_func; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +eval "$as_ac_var=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +else + LIBOBJS="$LIBOBJS $ac_func.$ac_objext" +fi +done + + + + +for ac_func in flockfile putc_unlocked +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. */ +#include +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +char (*f) (); + +int +main () +{ +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +f = $ac_func; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +eval "$as_ac_var=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + +for ac_func in fputs_unlocked fwrite_unlocked +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. */ +#include +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +char (*f) (); + +int +main () +{ +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +f = $ac_func; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +eval "$as_ac_var=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + + +for ac_func in strdup asprintf +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. */ +#include +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +char (*f) (); + +int +main () +{ +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +f = $ac_func; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +eval "$as_ac_var=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + + + + + + echo "$as_me:$LINENO: checking for program_invocation_name" >&5 +echo $ECHO_N "checking for program_invocation_name... $ECHO_C" >&6 +if test "${lsh_cv_var_program_invocation_name+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +#include +int +main () +{ +void *p = (void *) &program_invocation_name; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + lsh_cv_var_program_invocation_name=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +lsh_cv_var_program_invocation_name=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $lsh_cv_var_program_invocation_name" >&5 +echo "${ECHO_T}$lsh_cv_var_program_invocation_name" >&6 + if eval "test \"`echo '$lsh_cv_var_'program_invocation_name`\" = yes"; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_`echo program_invocation_name | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` 1 +_ACEOF + + fi + + echo "$as_me:$LINENO: checking for program_invocation_short_name" >&5 +echo $ECHO_N "checking for program_invocation_short_name... $ECHO_C" >&6 +if test "${lsh_cv_var_program_invocation_short_name+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +#include +int +main () +{ +void *p = (void *) &program_invocation_short_name; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + lsh_cv_var_program_invocation_short_name=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +lsh_cv_var_program_invocation_short_name=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $lsh_cv_var_program_invocation_short_name" >&5 +echo "${ECHO_T}$lsh_cv_var_program_invocation_short_name" >&6 + if eval "test \"`echo '$lsh_cv_var_'program_invocation_short_name`\" = yes"; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_`echo program_invocation_short_name | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` 1 +_ACEOF + + fi + + +# Set these flags *last*, or else the test programs won't compile +if test x$GCC = xyes ; then + # Using -ggdb3 makes (some versions of) Redhat's gcc-2.96 dump core + if "$CC" --version | grep '^2\.96$' 1>/dev/null 2>&1; then + true + else + CFLAGS="$CFLAGS -ggdb3" + fi + CFLAGS="$CFLAGS -Wall -W \ + -Wmissing-prototypes -Wmissing-declarations -Wstrict-prototypes \ + -Waggregate-return \ + -Wpointer-arith -Wbad-function-cast -Wnested-externs" +fi + +CPPFLAGS="$CPPFLAGS -I$srcdir" + + ac_config_files="$ac_config_files Makefile" +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if cmp -s $cache_file confcache; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in LANG LANGUAGE LC_ALL LC_COLLATE LC_CTYPE LC_NUMERIC LC_MESSAGES LC_TIME +do + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conftest.sh + echo "exit 0" >>conftest.sh + chmod +x conftest.sh + if (PATH="/nonexistent;."; conftest.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conftest.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by argp $as_me standalone-1.1, which was +generated by GNU Autoconf 2.54. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +argp config.status standalone-1.1 +configured by $0, generated by GNU Autoconf 2.54, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +INSTALL="$INSTALL" +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_shift=: + ;; + -*) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion" + exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;; +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +# +# INIT-COMMANDS section. +# + +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. +: ${TMPDIR=/tmp} +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/cs$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@PACKAGE@,$PACKAGE,;t t +s,@VERSION@,$VERSION,;t t +s,@ACLOCAL@,$ACLOCAL,;t t +s,@AUTOCONF@,$AUTOCONF,;t t +s,@AUTOMAKE@,$AUTOMAKE,;t t +s,@AUTOHEADER@,$AUTOHEADER,;t t +s,@MAKEINFO@,$MAKEINFO,;t t +s,@AMTAR@,$AMTAR,;t t +s,@install_sh@,$install_sh,;t t +s,@STRIP@,$STRIP,;t t +s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t +s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t +s,@AWK@,$AWK,;t t +s,@SET_MAKE@,$SET_MAKE,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@DEPDIR@,$DEPDIR,;t t +s,@am__include@,$am__include,;t t +s,@am__quote@,$am__quote,;t t +s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t +s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t +s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t +s,@CCDEPMODE@,$CCDEPMODE,;t t +s,@RANLIB@,$RANLIB,;t t +s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t +s,@CPP@,$CPP,;t t +s,@EGREP@,$EGREP,;t t +s,@ALLOCA@,$ALLOCA,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@abs_srcdir@,$ac_abs_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t +s,@builddir@,$ac_builddir,;t t +s,@abs_builddir@,$ac_abs_builddir,;t t +s,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + +# +# CONFIG_HEADER section. +# + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='[ ].*$,\1#\2' +ac_dC=' ' +ac_dD=',;t' +# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='$,\1#\2define\3' +ac_uC=' ' +ac_uD=',;t' + +for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } + # Remove the trailing spaces. + sed 's/[ ]*$//' $ac_file_inputs >$tmp/in + +_ACEOF + +# Transform confdefs.h into two sed scripts, `conftest.defines' and +# `conftest.undefs', that substitutes the proper values into +# config.h.in to produce config.h. The first handles `#define' +# templates, and the second `#undef' templates. +# And first: Protect against being on the right side of a sed subst in +# config.status. Protect against being in an unquoted here document +# in config.status. +rm -f conftest.defines conftest.undefs +# Using a here document instead of a string reduces the quoting nightmare. +# Putting comments in sed scripts is not portable. +# +# `end' is used to avoid that the second main sed command (meant for +# 0-ary CPP macros) applies to n-ary macro definitions. +# See the Autoconf documentation for `clear'. +cat >confdef2sed.sed <<\_ACEOF +s/[\\&,]/\\&/g +s,[\\$`],\\&,g +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp +t end +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp +: end +_ACEOF +# If some macros were called several times there might be several times +# the same #defines, which is useless. Nevertheless, we may not want to +# sort them, since we want the *last* AC-DEFINE to be honored. +uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines +sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs +rm -f confdef2sed.sed + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >>conftest.undefs <<\_ACEOF +s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, +_ACEOF + +# Break up conftest.defines because some shells have a limit on the size +# of here documents, and old seds have small limits too (100 cmds). +echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS +echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS +echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS +echo ' :' >>$CONFIG_STATUS +rm -f conftest.tail +while grep . conftest.defines >/dev/null +do + # Write a limited-size here document to $tmp/defines.sed. + echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#define' lines. + echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS + echo 'CEOF + sed -f $tmp/defines.sed $tmp/in >$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in +' >>$CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail + rm -f conftest.defines + mv conftest.tail conftest.defines +done +rm -f conftest.defines +echo ' fi # grep' >>$CONFIG_STATUS +echo >>$CONFIG_STATUS + +# Break up conftest.undefs because some shells have a limit on the size +# of here documents, and old seds have small limits too (100 cmds). +echo ' # Handle all the #undef templates' >>$CONFIG_STATUS +rm -f conftest.tail +while grep . conftest.undefs >/dev/null +do + # Write a limited-size here document to $tmp/undefs.sed. + echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#undef' + echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS + echo 'CEOF + sed -f $tmp/undefs.sed $tmp/in >$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in +' >>$CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail + rm -f conftest.undefs + mv conftest.tail conftest.undefs +done +rm -f conftest.undefs + +cat >>$CONFIG_STATUS <<\_ACEOF + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + echo "/* Generated by configure. */" >$tmp/config.h + else + echo "/* $ac_file. Generated by configure. */" >$tmp/config.h + fi + cat $tmp/in >>$tmp/config.h + rm -f $tmp/in + if test x"$ac_file" != x-; then + if cmp -s $ac_file $tmp/config.h 2>/dev/null; then + { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +echo "$as_me: $ac_file is unchanged" >&6;} + else + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + rm -f $ac_file + mv $tmp/config.h $ac_file + fi + else + cat $tmp/config.h + rm -f $tmp/config.h + fi + # Run the commands associated with the file. + case $ac_file in + config.h ) # update the timestamp +echo 'timestamp for config.h' >"./stamp-h1" + ;; + esac +done +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + +# +# CONFIG_COMMANDS section. +# +for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue + ac_dest=`echo "$ac_file" | sed 's,:.*,,'` + ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_dir=`(dirname "$ac_dest") 2>/dev/null || +$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_dest" : 'X\(//\)[^/]' \| \ + X"$ac_dest" : 'X\(//\)$' \| \ + X"$ac_dest" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_dest" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + + { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 +echo "$as_me: executing $ac_dest commands" >&6;} + case $ac_dest in + depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`(dirname "$mf") 2>/dev/null || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + else + continue + fi + grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue + # Extract the definition of DEP_FILES from the Makefile without + # running `make'. + DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` + test -z "$DEPDIR" && continue + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n -e '/^U = / s///p' < "$mf"` + test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" + # We invoke sed twice because it is the simplest approach to + # changing $(DEPDIR) to its actual value in the expansion. + for file in `sed -n -e ' + /^DEP_FILES = .*\\\\$/ { + s/^DEP_FILES = // + :loop + s/\\\\$// + p + n + /\\\\$/ b loop + p + } + /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`(dirname "$file") 2>/dev/null || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p $dirpart/$fdir + else + as_dir=$dirpart/$fdir + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 +echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} + { (exit 1); exit 1; }; }; } + + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done + ;; + esac +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + exec 5>/dev/null + $SHELL $CONFIG_STATUS || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi + diff --git a/argp/configure.ac b/argp/configure.ac new file mode 100644 index 0000000..fe1efee --- /dev/null +++ b/argp/configure.ac @@ -0,0 +1,74 @@ +dnl Process this file with autoconf to produce a configure script. + +dnl This configure.in is only for building a standalone argp library. + +AC_INIT([argp], [standalone-1.1]) +AC_CONFIG_SRCDIR([argp-ba.c]) +AM_INIT_AUTOMAKE +AM_CONFIG_HEADER([config.h]) + +# GNU libc defaults to supplying the ISO C library functions only. The +# _GNU_SOURCE define enables these extensions, in particular we want +# errno.h to declare program_invocation_name. Enable it on all +# systems; no problems have been reported with it so far. + +CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE" + +dnl Checks for programs. +AC_PROG_CC +AC_PROG_MAKE_SET +AC_PROG_RANLIB +AM_PROG_CC_STDC + +if test "x$am_cv_prog_cc_stdc" = xno ; then + AC_ERROR([the C compiler doesn't handle ANSI-C]) +fi + +dnl Checks for libraries. + +dnl Checks for header files. +AC_HEADER_STDC +AC_CHECK_HEADERS(limits.h malloc.h unistd.h) + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_C_INLINE +AC_TYPE_SIZE_T + +dnl Checks for library functions. +AC_FUNC_ALLOCA +AC_FUNC_VPRINTF +AC_CHECK_FUNCS(strerror) + +AC_REPLACE_FUNCS(mempcpy strndup strchrnul) +AC_CHECK_FUNCS(flockfile putc_unlocked) +AC_CHECK_FUNCS(fputs_unlocked fwrite_unlocked) + +dnl Used only by argp-test.c, so don't use AC_REPLACE_FUNCS. +AC_CHECK_FUNCS(strdup asprintf) + +AH_TEMPLATE([HAVE_PROGRAM_INVOCATION_NAME], + [Define if the variable exists (usually provided by the linker).]) +AH_TEMPLATE([HAVE_PROGRAM_INVOCATION_SHORT_NAME], + [Define if the variable exists (usually provided by the linker).]) + +ARGP_CHECK_VAR(program_invocation_name, [#include ]) +ARGP_CHECK_VAR(program_invocation_short_name, [#include ]) + +# Set these flags *last*, or else the test programs won't compile +if test x$GCC = xyes ; then + # Using -ggdb3 makes (some versions of) Redhat's gcc-2.96 dump core + if "$CC" --version | grep '^2\.96$' 1>/dev/null 2>&1; then + true + else + CFLAGS="$CFLAGS -ggdb3" + fi + CFLAGS="$CFLAGS -Wall -W \ + -Wmissing-prototypes -Wmissing-declarations -Wstrict-prototypes \ + -Waggregate-return \ + -Wpointer-arith -Wbad-function-cast -Wnested-externs" +fi + +CPPFLAGS="$CPPFLAGS -I$srcdir" + +AC_OUTPUT(Makefile) diff --git a/argp/depcomp b/argp/depcomp new file mode 100755 index 0000000..3480ce4 --- /dev/null +++ b/argp/depcomp @@ -0,0 +1,436 @@ +#! /bin/sh + +# depcomp - compile a program generating dependencies as side-effects +# Copyright 1999, 2000 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi +# `libtool' can also be set to `yes' or `no'. + +if test -z "$depfile"; then + base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'` + dir=`echo "$object" | sed 's,/.*$,/,'` + if test "$dir" = "$object"; then + dir= + fi + # FIXME: should be _deps on DOS. + depfile="$dir.deps/$base" +fi + +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. + "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> $depfile + echo >> $depfile + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> $depfile + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. This file always lives in the current directory. + # Also, the AIX compiler puts `$object:' at the start of each line; + # $object doesn't have directory information. + stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'` + tmpdepfile="$stripped.u" + outname="$stripped.o" + if test "$libtool" = yes; then + "$@" -Wc,-M + else + "$@" -M + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + + if test -f "$tmpdepfile"; then + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" + sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + + base=`echo "$object" | sed -e 's/\.o$//' -e 's/\.lo$//'` + tmpdepfile1="$base.o.d" + tmpdepfile2="$base.d" + if test "$libtool" = yes; then + "$@" -Wc,-MD + else + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + if test -f "$tmpdepfile1"; then + tmpdepfile="$tmpdepfile1" + else + tmpdepfile="$tmpdepfile2" + fi + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a space and a tab in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the proprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + test -z "$dashmflag" && dashmflag=-M + ( IFS=" " + case " $* " in + *" --mode=compile "*) # this is libtool, let us make it quiet + for arg + do # cycle over the arguments + case "$arg" in + "--mode=compile") + # insert --quiet before "--mode=compile" + set fnord "$@" --quiet + shift # fnord + ;; + esac + set fnord "$@" "$arg" + shift # fnord + shift # "$arg" + done + ;; + esac + "$@" $dashmflag | sed 's:^[^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + ) & + proc=$! + "$@" + stat=$? + wait "$proc" + if test "$stat" != 0; then exit $stat; fi + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + # X makedepend + ( + shift + cleared=no + for arg in "$@"; do + case $cleared in no) + set ""; shift + cleared=yes + esac + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift;; + -*) + ;; + *) + set fnord "$@" "$arg"; shift;; + esac + done + obj_suffix="`echo $object | sed 's/^.*\././'`" + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} 2>/dev/null -o"$obj_suffix" -f"$tmpdepfile" "$@" + ) & + proc=$! + "$@" + stat=$? + wait "$proc" + if test "$stat" != 0; then exit $stat; fi + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the proprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + ( IFS=" " + case " $* " in + *" --mode=compile "*) + for arg + do # cycle over the arguments + case $arg in + "--mode=compile") + # insert --quiet before "--mode=compile" + set fnord "$@" --quiet + shift # fnord + ;; + esac + set fnord "$@" "$arg" + shift # fnord + shift # "$arg" + done + ;; + esac + "$@" -E | + sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + ) & + proc=$! + "$@" + stat=$? + wait "$proc" + if test "$stat" != 0; then exit $stat; fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the proprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + ( IFS=" " + case " $* " in + *" --mode=compile "*) + for arg + do # cycle over the arguments + case $arg in + "--mode=compile") + # insert --quiet before "--mode=compile" + set fnord "$@" --quiet + shift # fnord + ;; + esac + set fnord "$@" "$arg" + shift # fnord + shift # "$arg" + done + ;; + esac + for arg + do + case "$arg" in + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" + ) & + proc=$! + "$@" + stat=$? + wait "$proc" + if test "$stat" != 0; then exit $stat; fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 diff --git a/argp/install-sh b/argp/install-sh new file mode 100755 index 0000000..398a88e --- /dev/null +++ b/argp/install-sh @@ -0,0 +1,251 @@ +#!/bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5 (mit/util/scripts/install.sh). +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + : +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + chmodcmd="" + else + instcmd=$mkdirprog + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + : + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + : + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + : + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' + ' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + : + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + : + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/argp/libargp.m4 b/argp/libargp.m4 new file mode 100644 index 0000000..33efc78 --- /dev/null +++ b/argp/libargp.m4 @@ -0,0 +1,159 @@ +# Try to execute a main program, and if it fails, try adding some +# -R flag. +# LSH_RPATH_FIX +AC_DEFUN([LSH_RPATH_FIX], +[if test $cross_compiling = no -a "x$RPATHFLAG" != x ; then + ac_success=no + AC_TRY_RUN([int main(int argc, char **argv) { return 0; }], + ac_success=yes, ac_success=no, :) + + if test $ac_success = no ; then + AC_MSG_CHECKING([Running simple test program failed. Trying -R flags]) +dnl echo RPATH_CANDIDATE_DIRS = $RPATH_CANDIDATE_DIRS + ac_remaining_dirs='' + ac_rpath_save_LDFLAGS="$LDFLAGS" + for d in $RPATH_CANDIDATE_DIRS ; do + if test $ac_success = yes ; then + ac_remaining_dirs="$ac_remaining_dirs $d" + else + LDFLAGS="$RPATHFLAG$d $LDFLAGS" +dnl echo LDFLAGS = $LDFLAGS + AC_TRY_RUN([int main(int argc, char **argv) { return 0; }], + [ac_success=yes + ac_rpath_save_LDFLAGS="$LDFLAGS" + AC_MSG_RESULT([adding $RPATHFLAG$d]) + ], + [ac_remaining_dirs="$ac_remaining_dirs $d"], :) + LDFLAGS="$ac_rpath_save_LDFLAGS" + fi + done + RPATH_CANDIDATE_DIRS=$ac_remaining_dirs + fi + if test $ac_success = no ; then + AC_MSG_RESULT(failed) + fi +fi +]) + +# AC_LIB_ARGP(ACTION-IF-OK, ACTION-IF-BAD) +AC_DEFUN([AC_LIB_ARGP], +[ ac_argp_save_LIBS="$LIBS" + ac_argp_save_LDFLAGS="$LDFLAGS" + ac_argp_ok=no + # First check if we can link with argp. + AC_SEARCH_LIBS(argp_parse, argp, + [ LSH_RPATH_FIX + AC_CACHE_CHECK([for working argp], + lsh_cv_lib_argp_works, + [ AC_TRY_RUN( +[#include +#include + +static const struct argp_option +options[] = +{ + { NULL, 0, NULL, 0, NULL, 0 } +}; + +struct child_state +{ + int n; +}; + +static error_t +child_parser(int key, char *arg, struct argp_state *state) +{ + struct child_state *input = (struct child_state *) state->input; + + switch(key) + { + default: + return ARGP_ERR_UNKNOWN; + case ARGP_KEY_END: + if (!input->n) + input->n = 1; + break; + } + return 0; +} + +const struct argp child_argp = +{ + options, + child_parser, + NULL, NULL, NULL, NULL, NULL +}; + +struct main_state +{ + struct child_state child; + int m; +}; + +static error_t +main_parser(int key, char *arg, struct argp_state *state) +{ + struct main_state *input = (struct main_state *) state->input; + + switch(key) + { + default: + return ARGP_ERR_UNKNOWN; + case ARGP_KEY_INIT: + state->child_inputs[0] = &input->child; + break; + case ARGP_KEY_END: + if (!input->m) + input->m = input->child.n; + + break; + } + return 0; +} + +static const struct argp_child +main_children[] = +{ + { &child_argp, 0, "", 0 }, + { NULL, 0, NULL, 0} +}; + +static const struct argp +main_argp = +{ options, main_parser, + NULL, + NULL, + main_children, + NULL, NULL +}; + +int main(int argc, char **argv) +{ + struct main_state input = { { 0 }, 0 }; + char *v[2] = { "foo", NULL }; + + argp_parse(&main_argp, 1, v, 0, NULL, &input); + + if ( (input.m == 1) && (input.child.n == 1) ) + return 0; + else + return 1; +} +], lsh_cv_lib_argp_works=yes, + lsh_cv_lib_argp_works=no, + lsh_cv_lib_argp_works=no)]) + + if test x$lsh_cv_lib_argp_works = xyes ; then + ac_argp_ok=yes + else + # Reset link flags + LIBS="$ac_argp_save_LIBS" + LDFLAGS="$ac_argp_save_LDFLAGS" + fi]) + + if test x$ac_argp_ok = xyes ; then + ifelse([$1],, true, [$1]) + else + ifelse([$2],, true, [$2]) + fi +]) diff --git a/argp/mempcpy.c b/argp/mempcpy.c new file mode 100644 index 0000000..6fa228b --- /dev/null +++ b/argp/mempcpy.c @@ -0,0 +1,18 @@ +/* strndup.c + * + */ + +/* Written by Niels Möller + * + * This file is hereby placed in the public domain. + */ + +#include + +void * +mempcpy (void *to, const void *from, size_t size) +{ + memcpy(to, from, size); + return (char *) to + size; +} + diff --git a/argp/missing b/argp/missing new file mode 100755 index 0000000..dd58370 --- /dev/null +++ b/argp/missing @@ -0,0 +1,336 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. +# Copyright 1996, 1997, 1999, 2000 Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +case "$1" in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case "$1" in + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch]" + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing 0.4 - GNU automake" + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + + aclocal*) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case "$f" in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. You might have modified some files without having the + proper tools for further handling them. + You can get \`$1Help2man' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` + test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if [ ! -f y.tab.h ]; then + echo >y.tab.h + fi + if [ ! -f y.tab.c ]; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if [ ! -f lex.yy.c ]; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` + fi + if [ -f "$file" ]; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit 1 + fi + ;; + + makeinfo) + if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then + # We have makeinfo, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` + fi + touch $file + ;; + + tar) + shift + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + fi + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar ${1+"$@"} && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar ${1+"$@"} && exit 0 + fi + firstarg="$1" + if shift; then + case "$firstarg" in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" ${1+"$@"} && exit 0 + ;; + esac + case "$firstarg" in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" ${1+"$@"} && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequirements for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 diff --git a/argp/mkinstalldirs b/argp/mkinstalldirs new file mode 100755 index 0000000..6b3b5fc --- /dev/null +++ b/argp/mkinstalldirs @@ -0,0 +1,40 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +# $Id$ + +errstatus=0 + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# mkinstalldirs ends here diff --git a/argp/strchrnul.c b/argp/strchrnul.c new file mode 100644 index 0000000..af1b4bb --- /dev/null +++ b/argp/strchrnul.c @@ -0,0 +1,21 @@ +/* strchrnul.c + * + */ + +/* Written by Niels Möller + * + * This file is hereby placed in the public domain. + */ + +/* FIXME: What is this function supposed to do? My guess is that it is + * like strchr, but returns a pointer to the NUL character, not a NULL + * pointer, if the character isn't found. */ + +char *strchrnul(const char *s, int c) +{ + const char *p = s; + while (*p && (*p != c)) + p++; + + return (char *) p; +} diff --git a/argp/strndup.c b/argp/strndup.c new file mode 100644 index 0000000..f01065a --- /dev/null +++ b/argp/strndup.c @@ -0,0 +1,31 @@ +/* strndup.c + * + */ + +/* Written by Niels Möller + * + * This file is hereby placed in the public domain. + */ + +#include +#include + +char * +strndup (const char *s, size_t size) +{ + char *r; + char *end = memchr(s, 0, size); + + if (end) + /* Length + 1 */ + size = end - s + 1; + + r = malloc(size); + + if (size) + { + memcpy(r, s, size-1); + r[size-1] = '\0'; + } + return r; +} diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..b73167c --- /dev/null +++ b/autogen.sh @@ -0,0 +1,27 @@ +#!/bin/sh +set -x +ACLOCAL=${ACLOCAL:-aclocal-1.6}; export ACLOCAL +AUTOMAKE=${AUTOMAKE:-automake-1.6}; export AUTOMAKE +AUTOCONF=${AUTOCONF:-autoconf}; export AUTOCONF +LIBTOOLIZE=${LIBTOOLIZE:-libtoolize}; export LIBTOOLIZE +AUTOHEADER=${AUTOHEADER:-autoheader}; export AUTOHEADER +GETTEXTIZE=${GETTEXTIZE:-gettextize}; export GETTEXTIZE + +cd argp && +rm -vf config.cache && +rm -rvf autom4te.cache && +$ACLOCAL && +$AUTOCONF && +$AUTOMAKE --add-missing && +$AUTOHEADER && +cd .. && +rm -vf config.cache && +rm -rvf autom4te.cache && +$GETTEXTIZE --intl --force && +$ACLOCAL -I m4 -I argp +$LIBTOOLIZE --force --automake +$ACLOCAL -I m4 -I argp +$AUTOCONF +$AUTOMAKE --gnits --add-missing +$AUTOHEADER +: 'You can now run CFLAGS="-g -pedantic -Wall" ./configure --enable-maintainer-mode and then make.' diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..4049e03 --- /dev/null +++ b/configure.ac @@ -0,0 +1,238 @@ +dnl Process this file with autoconf to produce a configure script. +AC_PREREQ(2.50) +AC_INIT(libgsasl, 0.0.0, bug-libgsasl@josefsson.org) + +# Interfaces removed: CURRENT++, AGE=0, REVISION=0 +# Interfaces added: CURRENT++, AGE++, REVISION=0 +# No interfaces changed: REVISION++ +LT_CURRENT=0 +LT_AGE=0 +LT_REVISION=0 +AC_SUBST(LT_CURRENT) +AC_SUBST(LT_AGE) +AC_SUBST(LT_REVISION) + +AM_INIT_AUTOMAKE +AM_CONFIG_HEADER(config.h) + +# Checks for programs. +AM_GNU_GETTEXT(use-libtool) +AC_PROG_LIBTOOL +AC_PROG_CC +AC_PROG_CXX +AC_PROG_CPP +AC_PROG_INSTALL +AC_PROG_LN_S +AC_PROG_RANLIB +AM_MISSING_PROG(PERL, perl, $missing_dir) +AM_MISSING_PROG(HELP2MAN, help2man, $missing_dir) +AM_MISSING_PROG(TEXI2PDF, texi2pdf, $missing_dir) +AM_MISSING_PROG(DOCBOOK2TXT, docbook2txt, $missing_dir) +AM_MISSING_PROG(DOCBOOK2HTML, docbook2html, $missing_dir) +AM_MISSING_PROG(DOCBOOK2PS, docbook2ps, $missing_dir) +AM_MISSING_PROG(DOCBOOK2PDF, docbook2pdf, $missing_dir) + +# ANONYMOUS +AC_ARG_ENABLE(anonymous, + AC_HELP_STRING([--disable-anonymous], [don't use the ANONYMOUS mechanism]), + anonymous=$enableval) +if test "$anonymous" != "no" ; then + anonymous=yes + AC_DEFINE(USE_ANONYMOUS, 1, [Define to 1 if you want ANONYMOUS.]) +fi +AC_MSG_CHECKING([if ANONYMOUS should be used]) +AC_MSG_RESULT($anonymous) + +# EXTERNAL +AC_ARG_ENABLE(external, + AC_HELP_STRING([--disable-external], [don't use the EXTERNAL mechanism]), + external=$enableval) +if test "$external" != "no" ; then + external=yes + AC_DEFINE(USE_EXTERNAL, 1, [Define to 1 if you want EXTERNAL.]) +fi +AC_MSG_CHECKING([if EXTERNAL should be used]) +AC_MSG_RESULT($external) + +# PLAIN +AC_ARG_ENABLE(plain, + AC_HELP_STRING([--disable-plain], [don't use the PLAIN mechanism]), + plain=$enableval) +if test "$plain" != "no" ; then + plain=yes + AC_DEFINE(USE_PLAIN, 1, [Define to 1 if you want PLAIN.]) +fi +AC_MSG_CHECKING([if PLAIN should be used]) +AC_MSG_RESULT($plain) + +# LOGIN +AC_ARG_ENABLE(login, + AC_HELP_STRING([--disable-login], [don't use the LOGIN mechanism]), + login=$enableval) +if test "$login" != "no" ; then + login=yes + AC_DEFINE(USE_LOGIN, 1, [Define to 1 if you want LOGIN.]) +fi +AC_MSG_CHECKING([if LOGIN should be used]) +AC_MSG_RESULT($login) + +# SECURID +AC_ARG_ENABLE(securid, + AC_HELP_STRING([--disable-securid], [don't use the SECURID mechanism]), + securid=$enableval) +if test "$securid" != "no" ; then + securid=yes + AC_DEFINE(USE_SECURID, 1, [Define to 1 if you want SECURID.]) +fi +AC_MSG_CHECKING([if SECURID should be used]) +AC_MSG_RESULT($securid) + +# NTLM +AM_PATH_LIBNTLM(0.3.0, [have_ntlm=yes]) +AC_ARG_ENABLE(ntlm, + AC_HELP_STRING([--disable-ntlm], [don't use the NTLM mechanism]), + ntlm=$enableval) +if test "$ntlm" != "no" ; then + if test "$have_ntlm" != "yes" ; then + ntlm=no + AC_MSG_WARN([libntlm not found, disabling NTLM]) + else + ntlm=yes + AC_DEFINE(USE_NTLM, 1, [Define to 1 if you want NTLM.]) + fi +fi +AC_MSG_CHECKING([if NTLM should be used]) +AC_MSG_RESULT($ntlm) + +# CRAM-MD5 +AC_ARG_ENABLE(cram-md5, + AC_HELP_STRING([--disable-cram-md5], [don't use the CRAM-MD5 mechanism]), + cram_md5=$enableval) +AM_PATH_LIBGCRYPT(1.1.7, [have_gcrypt=yes]) +if test "$cram_md5" != "no" ; then + if test "$have_gcrypt" != "yes" ; then + cram_md5=no + AC_MSG_WARN([libgcrypt not found, disabling CRAM-MD5]) + else + cram_md5=yes + AC_DEFINE(USE_CRAM_MD5, 1, [Define to 1 if you want CRAM-MD5.]) + fi +fi +AC_MSG_CHECKING([if CRAM-MD5 should be used]) +AC_MSG_RESULT($cram_md5) + +# DIGEST-MD5 +AC_ARG_ENABLE(digest-md5, + AC_HELP_STRING([--disable-digest-md5], [don't use the DIGEST-MD5 mechanism]), + digest_md5=$enableval) +if test "$digest_md5" != "no" ; then + if test "$have_gcrypt" != "yes" ; then + digest_md5=no + AC_MSG_WARN([libgcrypt not found, disabling DIGEST-MD5]) + else + digest_md5=yes + AC_DEFINE(USE_DIGEST_MD5, 1, [Define to 1 if you want DIGEST-MD5.]) + fi +fi +AC_MSG_CHECKING([if DIGEST-MD5 should be used]) +AC_MSG_RESULT($digest_md5) + +# SRP +#AC_ARG_ENABLE(srp, +# AC_HELP_STRING([--disable-srp], [don't use the SRP mechanism]), +# srp=$enableval) +#if test "$srp" != "no" ; then +# if test "$have_gcrypt" != "yes" ; then +# srp=no +# AC_MSG_WARN([libgcrypt not found, disabling SRP]) +# else +# srp=yes +# AC_DEFINE(USE_SRP, 1, [Define to 1 if you want SRP.]) +# fi +#fi +#AC_MSG_CHECKING([if SRP should be used]) +#AC_MSG_RESULT($srp) + +# GSSAPI (tests partially stolen from mailutils and fetchmail) +AC_ARG_ENABLE(gssapi, + AC_HELP_STRING([--disable-gssapi], [don't use the GSSAPI mechanism]), + gssapi=$enableval) +if test "$gssapi" != "no" ; then + AC_PATH_PROG(KRB5_CONFIG, krb5-config, no) + if test "$KRB5_CONFIG" != "no" ; then + GSSAPI_CFLAGS=`$KRB5_CONFIG --cflags` + GSSAPI_LIBS=`$KRB5_CONFIG --libs gssapi` + save_CPPFLAGS=$CPPFLAGS + CPPFLAGS=$GSSAPI_CFLAGS + AC_CHECK_HEADERS(gssapi.h gssapi/gssapi.h gssapi/gssapi_generic.h) + CPPFLAGS=$save_CPPFLAGS + if test "$ac_cv_header_gssapi_h" = "yes"; then + AC_EGREP_HEADER(GSS_C_NT_HOSTBASED_SERVICE, gssapi.h, AC_DEFINE(HAVE_GSS_C_NT_HOSTBASED_SERVICE, 1, [Define to 1 if you have GSS_C_NT_HOSTBASED_SERVICE.])) + else + AC_EGREP_HEADER(GSS_C_NT_HOSTBASED_SERVICE, gssapi/gssapi.h, AC_DEFINE(HAVE_GSS_C_NT_HOSTBASED_SERVICE, 1, [Define to 1 if you have GSS_C_NT_HOSTBASED_SERVICE.])) + fi + AC_SUBST(GSSAPI_CFLAGS) + AC_SUBST(GSSAPI_LIBS) + gssapi=yes + AC_DEFINE(USE_GSSAPI, 1, [Define to 1 if you want GSSAPI.]) + else + gssapi=no + AC_MSG_WARN([krb5-config not found, disabling GSSAPI]) + fi +fi +AC_MSG_CHECKING([if GSSAPI should be used]) +AC_MSG_RESULT($gssapi) + +# Checks for header files. +AC_HEADER_STDC +AC_CHECK_HEADERS([stdlib.h string.h strings.h sys/socket.h unistd.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_C_INLINE +AC_C_BIGENDIAN +AC_PROG_GCC_TRADITIONAL +AC_TYPE_SIZE_T +AC_TYPE_UID_T +AC_HEADER_TIME +AC_HEADER_STDC +AC_CHECK_HEADERS(getopt.h unistd.h strings.h netdb.h math.h) +AC_CHECK_HEADERS(sys/poll.h sys/time.h sys/types.h sys/select.h sys/socket.h) +AC_CHECK_HEADERS(argp.h netinet/in.h iconv.h) + +# Checks for library functions. +AC_CHECK_FUNCS(gethostname \ + memmove memset \ + bcopy bzero \ + select \ + strchr strdup \ + strerror getsubopt) +AC_SEARCH_LIBS(gethostbyname, xnet) + +# Test if the libc includes a good enough argp. +AC_ARG_WITH(system-argp, + AC_HELP_STRING([--without-system-argp], [don't use the system's argp]),, + [with_system_argp=yes]) +if test x$with_system_argp = xyes ; then + AC_LIB_ARGP(,with_system_argp=no) +fi +LIBARGP="" +if test x$with_system_argp = xno ; then + LIBARGP="\$(top_builddir)/argp/libargp.a" +fi +AC_SUBST(LIBARGP) +AC_CONFIG_SUBDIRS(argp) + +# Generate src/libgsasl-config.in +LIBGSASL_CFLAGS="$CFLAGS $LIBGCRYPT_CFLAGS $LIBNTLM_CFLAGS $GSSAPI_CFLAGS -I${includedir}" +LIBGSASL_LIBS="$LIBS $LIBGCRYPT_LIBS $LIBNTLM_LIBS $GSSAPI_LIBS -L${libdir} -lgsasl" +AC_SUBST(LIBGSASL_LIBS) +AC_SUBST(LIBGSASL_CFLAGS) +AC_CONFIG_COMMANDS([chmod],[[chmod +x src/libgsasl-config]]) + +AC_CONFIG_FILES(Makefile po/Makefile.in m4/Makefile intl/Makefile \ + doc/Makefile lib/gsasl.h lib/Makefile \ + src/libgsasl-config src/libcharset/Makefile src/Makefile \ + tests/Makefile) + +AC_OUTPUT diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..1a1f28f --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,145 @@ +## Process this file with automake to produce Makefile.in +# Copyright (C) 2002 Simon Josefsson. +# +# This file is part of Libgsasl. +# +# Libgsasl is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of +# the License, or (at your option) any later version. +# +# Libgsasl 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 program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +gsasl_texi_auto_deps = gsasl-api-version.texi gsasl-api-global.texi \ + gsasl-api-session.texi gsasl-api-callback.texi gsasl-api-utils.texi \ + gsasl-api-error.texi + +# gsasl.xml gsasl-db.txt gsasl-db.html gsasl-db.ps gsasl-db.pdf + +generated = gsasl.txt gsasl.html gsasl.ps gsasl.pdf \ + gsasl.info gsasl.info-1 gsasl.info-2 gsasl.info-3 gsasl.info-4 \ + $(gsasl_texi_auto_deps) + +man_MANS = gsasl.1 + +MAINTAINERCLEANFILES = $(generated) + +DISTCLEANFILES = $(man_MANS) + +EXTRA_DIST = gdoc gsasl-example1.c $(man_MANS) $(generated) + +info_TEXINFOS = gsasl.texi +gsasl_TEXINFOS = lgpl.texi gpl.texi fdl.texi $(gsasl_texi_auto_deps) \ + gsasl-callback-password.texi gsasl-callback-authorization.texi \ + gsasl-callback-authentication.texi gsasl-callback-validate.texi \ + gsasl-callback-retrieve.texi gsasl-callback-cram-md5.texi \ + gsasl-callback-digest-md5.texi gsasl-callback-passcode.texi \ + gsasl-callback-gssapi.texi gsasl-callback-securid.texi \ + gsasl-callback-client-service.texi gsasl-callback-server-service.texi + +gsasl_api_version_deps = $(top_srcdir)/lib/version.c + +gsasl_api_global_deps = $(top_srcdir)/lib/init.c \ + $(top_srcdir)/lib/done.c \ + $(top_srcdir)/lib/listmech.c \ + $(top_srcdir)/lib/supportp.c \ + $(top_srcdir)/lib/suggest.c + +gsasl_api_callback_deps = $(top_srcdir)/lib/callback.c + +gsasl_api_session_deps = $(top_srcdir)/lib/xstart.c \ + $(top_srcdir)/lib/xstep.c \ + $(top_srcdir)/lib/xfinish.c + +gsasl_api_utils_deps = $(top_srcdir)/lib/base64.c \ + $(top_srcdir)/lib/hexdump.c \ + $(top_srcdir)/lib/md5pwd.c + +gsasl_api_error_deps = $(top_srcdir)/lib/error.c + +gsasl-api-global.texi: $(gsasl_api_global_deps) + $(PERL) $(srcdir)/gdoc -texinfo $^ > $@ + +gsasl-api-version.texi: $(gsasl_api_version_deps) + $(PERL) $(srcdir)/gdoc -texinfo $^ > $@ + +gsasl-api-session.texi: $(gsasl_api_session_deps) + $(PERL) $(srcdir)/gdoc -texinfo $^ > $@ + +gsasl-api-callback.texi: $(gsasl_api_callback_deps) + $(PERL) $(srcdir)/gdoc -texinfo $^ > $@ + +gsasl-api-utils.texi: $(gsasl_api_utils_deps) + $(PERL) $(srcdir)/gdoc -texinfo $^ > $@ + +gsasl-api-error.texi: $(gsasl_api_error_deps) + $(PERL) $(srcdir)/gdoc -texinfo $^ > $@ + +# Man page: + +gsasl.1: $(top_srcdir)/src/gsasl.c $(top_builddir)/src/gsasl + $(HELP2MAN) \ + --name="SASL library command line interface" \ + --output=$@ $(top_builddir)/src/gsasl + +# Texinfo: + +gsasl.txt: gsasl.texi + $(MAKEINFO) --no-header $< > $@ + +gsasl.html: gsasl.texi + $(MAKEINFO) --html --no-split --number-sections $< +# $(TEXI2HTML) -nosec_nav $< + +gsasl.ps: gsasl.texi + +gsasl.pdf: gsasl.texi + $(TEXI2PDF) $< + +# Docbook: + +gsasl.xml: gsasl.texi + $(MAKEINFO) --docbook $< + +gsasl-db.txt: gsasl.xml + mkdir db.tmp && \ + cp $< db.tmp && \ + cd db.tmp && \ + $(DOCBOOK2TXT) --nochunks $< && \ + cd .. && \ + mv db.tmp/gsasl.txt gsasl-db.txt && \ + rm -rf db.tmp + +gsasl-db.html: gsasl.xml + mkdir db.tmp && \ + cp $< db.tmp && \ + cd db.tmp && \ + $(DOCBOOK2HTML) --nochunks $< && \ + cd .. && \ + mv db.tmp/gsasl.html gsasl-db.html && \ + rm -rf db.tmp + +gsasl-db.ps: gsasl.xml + mkdir db.tmp && \ + cp $< db.tmp && \ + cd db.tmp && \ + $(DOCBOOK2PS) $< && \ + cd .. && \ + mv db.tmp/gsasl.ps gsasl-db.ps && \ + rm -rf db.tmp + +gsasl-db.pdf: gsasl.xml + mkdir db.tmp && \ + cp $< db.tmp && \ + cd db.tmp && \ + $(DOCBOOK2PDF) $< && \ + cd .. && \ + mv db.tmp/gsasl.pdf gsasl-db.pdf && \ + rm -rf db.tmp diff --git a/doc/fdl.texi b/doc/fdl.texi new file mode 100644 index 0000000..361f90f --- /dev/null +++ b/doc/fdl.texi @@ -0,0 +1,403 @@ + +@node GNU Free Documentation License +@appendixsec GNU Free Documentation License + +@cindex FDL, GNU Free Documentation License +@center Version 1.1, March 2000 + +@display +Copyright @copyright{} 2000 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307, USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +@end display + +@enumerate 0 +@item +PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +written document @dfn{free} in the sense of freedom: to assure everyone +the effective freedom to copy and redistribute it, with or without +modifying it, either commercially or noncommercially. Secondarily, +this License preserves for the author and publisher a way to get +credit for their work, while not being considered responsible for +modifications made by others. + +This License is a kind of ``copyleft'', which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + +@item +APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work that contains a +notice placed by the copyright holder saying it can be distributed +under the terms of this License. The ``Document'', below, refers to any +such manual or work. Any member of the public is a licensee, and is +addressed as ``you''. + +A ``Modified Version'' of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A ``Secondary Section'' is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall subject +(or to related matters) and contains nothing that could fall directly +within that overall subject. (For example, if the Document is in part a +textbook of mathematics, a Secondary Section may not explain any +mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The ``Invariant Sections'' are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. + +The ``Cover Texts'' are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. + +A ``Transparent'' copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, whose contents can be viewed and edited directly and +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup has been designed to thwart or discourage +subsequent modification by readers is not Transparent. A copy that is +not ``Transparent'' is called ``Opaque''. + +Examples of suitable formats for Transparent copies include plain +@sc{ascii} without markup, Texinfo input format, La@TeX{} input format, +@acronym{SGML} or @acronym{XML} using a publicly available +@acronym{DTD}, and standard-conforming simple @acronym{HTML} designed +for human modification. Opaque formats include PostScript, +@acronym{PDF}, proprietary formats that can be read and edited only by +proprietary word processors, @acronym{SGML} or @acronym{XML} for which +the @acronym{DTD} and/or processing tools are not generally available, +and the machine-generated @acronym{HTML} produced by some word +processors for output purposes only. + +The ``Title Page'' means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, ``Title Page'' means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +@item +VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + +@item +COPYING IN QUANTITY + +If you publish printed copies of the Document numbering more than 100, +and the Document's license notice requires Cover Texts, you must enclose +the copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a publicly-accessible computer-network location containing a complete +Transparent copy of the Document, free of added material, which the +general network-using public has access to download anonymously at no +charge using public-standard network protocols. If you use the latter +option, you must take reasonably prudent steps, when you begin +distribution of Opaque copies in quantity, to ensure that this +Transparent copy will remain thus accessible at the stated location +until at least one year after the last time you distribute an Opaque +copy (directly or through your agents or retailers) of that edition to +the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + +@item +MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +@enumerate A +@item +Use in the Title Page (and on the covers, if any) a title distinct +from that of the Document, and from those of previous versions +(which should, if there were any, be listed in the History section +of the Document). You may use the same title as a previous version +if the original publisher of that version gives permission. + +@item +List on the Title Page, as authors, one or more persons or entities +responsible for authorship of the modifications in the Modified +Version, together with at least five of the principal authors of the +Document (all of its principal authors, if it has less than five). + +@item +State on the Title page the name of the publisher of the +Modified Version, as the publisher. + +@item +Preserve all the copyright notices of the Document. + +@item +Add an appropriate copyright notice for your modifications +adjacent to the other copyright notices. + +@item +Include, immediately after the copyright notices, a license notice +giving the public permission to use the Modified Version under the +terms of this License, in the form shown in the Addendum below. + +@item +Preserve in that license notice the full lists of Invariant Sections +and required Cover Texts given in the Document's license notice. + +@item +Include an unaltered copy of this License. + +@item +Preserve the section entitled ``History'', and its title, and add to +it an item stating at least the title, year, new authors, and +publisher of the Modified Version as given on the Title Page. If +there is no section entitled ``History'' in the Document, create one +stating the title, year, authors, and publisher of the Document as +given on its Title Page, then add an item describing the Modified +Version as stated in the previous sentence. + +@item +Preserve the network location, if any, given in the Document for +public access to a Transparent copy of the Document, and likewise +the network locations given in the Document for previous versions +it was based on. These may be placed in the ``History'' section. +You may omit a network location for a work that was published at +least four years before the Document itself, or if the original +publisher of the version it refers to gives permission. + +@item +In any section entitled ``Acknowledgments'' or ``Dedications'', +preserve the section's title, and preserve in the section all the +substance and tone of each of the contributor acknowledgments +and/or dedications given therein. + +@item +Preserve all the Invariant Sections of the Document, +unaltered in their text and in their titles. Section numbers +or the equivalent are not considered part of the section titles. + +@item +Delete any section entitled ``Endorsements''. Such a section +may not be included in the Modified Version. + +@item +Do not retitle any existing section as ``Endorsements'' +or to conflict in title with any Invariant Section. +@end enumerate + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section entitled ``Endorsements'', provided it contains +nothing but endorsements of your Modified Version by various +parties---for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + +@item +COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections entitled ``History'' +in the various original documents, forming one section entitled +``History''; likewise combine any sections entitled ``Acknowledgments'', +and any sections entitled ``Dedications''. You must delete all sections +entitled ``Endorsements.'' + +@item +COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + +@item +AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, does not as a whole count as a Modified Version +of the Document, provided no compilation copyright is claimed for the +compilation. Such a compilation is called an ``aggregate'', and this +License does not apply to the other self-contained works thus compiled +with the Document, on account of their being thus compiled, if they +are not themselves derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one quarter +of the entire aggregate, the Document's Cover Texts may be placed on +covers that surround only the Document within the aggregate. +Otherwise they must appear on covers around the whole aggregate. + +@item +TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License provided that you also include the +original English version of this License. In case of a disagreement +between the translation and the original English version of this +License, the original English version will prevail. + +@item +TERMINATION + +You may not copy, modify, sublicense, or distribute the Document except +as expressly provided for under this License. Any other attempt to +copy, modify, sublicense or distribute the Document is void, and will +automatically terminate your rights under this License. However, +parties who have received copies, or rights, from you under this +License will not have their licenses terminated so long as such +parties remain in full compliance. + +@item +FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +@uref{http://www.gnu.org/copyleft/}. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License ``or any later version'' applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. +@end enumerate + +@page +@appendixsubsec ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + +@smallexample +@group + Copyright (C) @var{year} @var{your name}. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.1 + or any later version published by the Free Software Foundation; + with the Invariant Sections being @var{list their titles}, with the + Front-Cover Texts being @var{list}, and with the Back-Cover Texts being @var{list}. + A copy of the license is included in the section entitled ``GNU + Free Documentation License''. +@end group +@end smallexample + +If you have no Invariant Sections, write ``with no Invariant Sections'' +instead of saying which ones are invariant. If you have no +Front-Cover Texts, write ``no Front-Cover Texts'' instead of +``Front-Cover Texts being @var{list}''; likewise for Back-Cover Texts. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. + +@c Local Variables: +@c ispell-local-pdict: "ispell-dict" +@c End: + diff --git a/doc/gdoc b/doc/gdoc new file mode 100755 index 0000000..0fb0335 --- /dev/null +++ b/doc/gdoc @@ -0,0 +1,747 @@ +#!/usr/bin/perl + +## Copyright (c) 1998 Michael Zucchi, All Rights Reserved ## +## hacked to allow -tex option --nmav ## +## hacked to allow -texinfo option --jas ## +## ## +## This software falls under the GNU Public License. Please read ## +## the COPYING file for more information ## + +# +# This will read a 'c' file and scan for embedded comments in the +# style of gnome comments (+minor extensions - see below). +# +# This program is modified by Nikos Mavroyanopoulos, for the gnutls +# project. + +# Note: This only supports 'c'. + +# usage: +# gdoc [ -docbook | -html | -text | -man | -tex | -texinfo ] +# [ -function funcname [ -function funcname ...] ] c file(s)s > outputfile +# +# Set output format using one of -docbook -html -text -man -tex or +# -texinfo. Default is man. +# +# -function funcname +# If set, then only generate documentation for the given +# function(s). All other functions are ignored. +# +# c files - list of 'c' files to process +# +# All output goes to stdout, with errors to stderr. + +# +# format of comments. +# In the following table, (...)? signifies optional structure. +# (...)* signifies 0 or more structure elements +# /** +# * function_name(:)? (- short description)? +# (* @parameterx: (description of parameter x)?)* +# (* a blank line)? +# * (Description:)? (Description of function)? +# * (section header: (section description)? )* +# (*)?*/ +# +# So .. the trivial example would be: +# +# /** +# * my_function +# **/ +# +# If the Description: header tag is ommitted, then there must be a blank line +# after the last parameter specification. +# e.g. +# /** +# * my_function - does my stuff +# * @my_arg: its mine damnit +# * +# * Does my stuff explained. +# */ +# +# or, could also use: +# /** +# * my_function - does my stuff +# * @my_arg: its mine damnit +# * Description: Does my stuff explained. +# */ +# etc. +# +# All descriptions can be multiline, apart from the short function description. +# +# All descriptive text is further processed, scanning for the following special +# patterns, which are highlighted appropriately. +# +# 'funcname()' - function +# '$ENVVAR' - environmental variable +# '&struct_name' - name of a structure +# '@parameter' - name of a parameter +# '%CONST' - name of a constant. + +# +# Extensions for LaTeX: +# +# 1. the symbol '->' will be replaced with a rightarrow +# 2. x^y with ${x}^{y}$. +# 3. xxx\: with xxx: + + +# match expressions used to find embedded type information +$type_constant = "\\\%(\\w+)"; +#$type_func = "(\\w+\\(\\))"; +$type_func = "(\\(w||\\\\)+\\(\\))"; +$type_param = "\\\@(\\w+)"; +$type_struct = "\\\&(\\w+)"; +$type_env = "(\\\$\\w+)"; + + +# Output conversion substitutions. +# One for each output format + +# these work fairly well +%highlights_html = ( $type_constant, "\$1", + $type_func, "\$1", + $type_struct, "\$1", + $type_param, "\$1" ); +$blankline_html = "

"; + +%highlights_texinfo = ( $type_constant, "\@var{\$1}", + $type_func, "\@code{\$1}", + $type_struct, "\@code{\$1}", + $type_param, "\@code{\$1}" ); +$blankline_texinfo = ""; + +%highlights_tex = ( $type_constant, "{\\\\it \$1}", + $type_func, "{\\\\bf \$1}", + $type_struct, "{\\\\it \$1}", + $type_param, "{\\\\bf \$1}" ); +$blankline_tex = "\\par"; + +# sgml, docbook format +%highlights_sgml = ( $type_constant, "\$1", + $type_func, "\$1", + $type_struct, "\$1", + $type_env, "\$1", + $type_param, "\$1" ); +$blankline_sgml = "\n"; + +# these are pretty rough +%highlights_man = ( $type_constant, "\\n.I \\\"\$1\\\"\\n", + $type_func, "\\n.B \\\"\$1\\\"\\n", + $type_struct, "\\n.I \\\"\$1\\\"\\n", + $type_param."([\.\, ]*)\n?", "\\n.I \\\"\$1\$2\\\"\\n" ); +$blankline_man = ""; + +# text-mode +%highlights_text = ( $type_constant, "\$1", + $type_func, "\$1", + $type_struct, "\$1", + $type_param, "\$1" ); +$blankline_text = ""; + + +sub usage { + print "Usage: $0 [ -v ] [ -docbook | -html | -text | -man | -tex | -texinfo ]\n"; + print " [ -function funcname [ -function funcname ...] ]\n"; + print " c source file(s) > outputfile\n"; + exit 1; +} + +# read arguments +if ($#ARGV==-1) { + usage(); +} + +$verbose = 0; +$output_mode = "man"; +%highlights = %highlights_man; +$blankline = $blankline_man; +$modulename = "API Documentation"; +$function_only = 0; +while ($ARGV[0] =~ m/^-(.*)/) { + $cmd = shift @ARGV; + if ($cmd eq "-html") { + $output_mode = "html"; + %highlights = %highlights_html; + $blankline = $blankline_html; + } elsif ($cmd eq "-man") { + $output_mode = "man"; + %highlights = %highlights_man; + $blankline = $blankline_man; + } elsif ($cmd eq "-tex") { + $output_mode = "tex"; + %highlights = %highlights_tex; + $blankline = $blankline_tex; + } elsif ($cmd eq "-texinfo") { + $output_mode = "texinfo"; + %highlights = %highlights_texinfo; + $blankline = $blankline_texinfo; + } elsif ($cmd eq "-text") { + $output_mode = "text"; + %highlights = %highlights_text; + $blankline = $blankline_text; + } elsif ($cmd eq "-docbook") { + $output_mode = "sgml"; + %highlights = %highlights_sgml; + $blankline = $blankline_sgml; + } elsif ($cmd eq "-module") { # not needed for sgml, inherits from calling document + $modulename = shift @ARGV; + } elsif ($cmd eq "-function") { # to only output specific functions + $function_only = 1; + $function = shift @ARGV; + $function_table{$function} = 1; + } elsif ($cmd eq "-v") { + $verbose = 1; + } elsif (($cmd eq "-h") || ($cmd eq "--help")) { + usage(); + } +} + + +# generate a sequence of code that will splice in highlighting information +# using the s// operator. +$dohighlight = ""; +foreach $pattern (keys %highlights) { +# print STDERR "scanning pattern $pattern ($highlights{$pattern})\n"; + $dohighlight .= "\$contents =~ s:$pattern:$highlights{$pattern}:gs;\n"; +} + +## +# dumps section contents to arrays/hashes intended for that purpose. +# +sub dump_section { + my $name = shift @_; + my $contents = join "\n", @_; + + if ($name =~ m/$type_constant/) { + $name = $1; +# print STDERR "constant section '$1' = '$contents'\n"; + $constants{$name} = $contents; + } elsif ($name =~ m/$type_param/) { +# print STDERR "parameter def '$1' = '$contents'\n"; + $name = $1; + $parameters{$name} = $contents; + } else { +# print STDERR "other section '$name' = '$contents'\n"; + $sections{$name} = $contents; + push @sectionlist, $name; + } +} + +## +# output function +# +# parameters, a hash. +# function => "function name" +# parameterlist => @list of parameters +# parameters => %parameter descriptions +# sectionlist => @list of sections +# sections => %descriont descriptions +# + +sub output_highlight { + my $contents = join "\n", @_; + my $line; + + eval $dohighlight; + foreach $line (split "\n", $contents) { + if ($line eq ""){ + print $lineprefix, $blankline; + } else { + print $lineprefix, $line; + } + print "\n"; + } +} + +# output in texinfo +sub output_texinfo { + my %args = %{$_[0]}; + my ($parameter, $section); + my $count; + + print "\@deftypefun {"; + print $args{'functiontype'}; + print "} ".$args{'function'}." "; + print "("; + $count = 0; + foreach $parameter (@{$args{'parameterlist'}}) { + print $args{'parametertypes'}{$parameter}." \@var{".$parameter."}"; + if ($count != $#{$args{'parameterlist'}}) { + $count++; + print ", "; + } + } + print ")\n\n"; + foreach $parameter (@{$args{'parameterlist'}}) { + if ($args{'parameters'}{$parameter}) { + print "\@var{".$parameter."}: "; + output_highlight($args{'parameters'}{$parameter}); + print "\n"; + } + } + foreach $section (@{$args{'sectionlist'}}) { + output_highlight($args{'sections'}{$section}); + print "\n"; + } + print "\@end deftypefun\n\n"; +} + +# output in html +sub output_html { + my %args = %{$_[0]}; + my ($parameter, $section); + my $count; + print "\n\n 

Function

\n"; + + print "".$args{'functiontype'}."\n"; + print "".$args{'function'}."\n"; + print "("; + $count = 0; + foreach $parameter (@{$args{'parameterlist'}}) { + print "".$args{'parametertypes'}{$parameter}." ".$parameter."\n"; + if ($count != $#{$args{'parameterlist'}}) { + $count++; + print ", "; + } + } + print ")\n"; + + print "

Arguments

\n"; + print "
\n"; + foreach $parameter (@{$args{'parameterlist'}}) { + print "
".$args{'parametertypes'}{$parameter}." ".$parameter."\n"; + print "
"; + output_highlight($args{'parameters'}{$parameter}); + } + print "
\n"; + foreach $section (@{$args{'sectionlist'}}) { + print "

$section

\n"; + print "
    \n"; + output_highlight($args{'sections'}{$section}); + print "
\n"; + } + print "
\n"; +} + +# output in tex +sub output_tex { + my %args = %{$_[0]}; + my ($parameter, $section); + my $count; + my $func = $args{'function'}; + my $param; + my $param2; + my $sec; + my $check; + my $type; + + $func =~ s/_/\\_/g; + + print "\n\n\\subsection{". $func . "}\n\\label{" . $args{'function'} . "}\n"; + + $type = $args{'functiontype'}; + $type =~ s/_/\\_/g; + + print "{\\it ".$type."}\n"; + print "{\\bf ".$func."}\n"; + print "(\n"; + $count = 0; + foreach $parameter (@{$args{'parameterlist'}}) { + $param = $args{'parametertypes'}{$parameter}; + $param2 = $parameter; + $param =~ s/_/\\_/g; + $param2 =~ s/_/\\_/g; + + print "{\\it ".$param."} {\\bf ".$param2."}\n"; + if ($count != $#{$args{'parameterlist'}}) { + $count++; + print ", "; + } + } + print ")\n"; + + print "\n{\\large{Arguments}}\n"; + + print "\\begin{itemize}\n"; + $check=0; + foreach $parameter (@{$args{'parameterlist'}}) { + $param1 = $args{'parametertypes'}{$parameter}; + $param1 =~ s/_/\\_/g; + $param2 = $parameter; + $param2 =~ s/_/\\_/g; + + $check = 1; + print "\\item {\\it ".$param1."} {\\bf ".$param2."}: \n"; +# print "\n"; + + $param3 = $args{'parameters'}{$parameter}; + $param3 =~ s/_/\\_/g; + $param3 =~ s/&([a-zA-Z\_]+)/{\\it \1}/g; + + output_highlight($param3); + } + if ($check==0) { + print "\\item void\n"; + } + print "\\end{itemize}\n"; + + foreach $section (@{$args{'sectionlist'}}) { + $sec = $section; + $sec =~ s/_/\\_/g; + $sec =~ s/&([a-zA-Z\_]+)/{\\it \1}/g; + + print "\n\\par{\\large{$sec}}\\par\n"; + print "\\begin{rmfamily}\n"; + + $sec = $args{'sections'}{$section}; + $sec =~ s/_/\\_/g; + $sec =~ s/\\:/:/g; + $sec =~ s/&([a-zA-Z\_]+)/{\\it \1}/g; + $sec =~ s/->/\$\\rightarrow\$/g; + $sec =~ s/([0-9]+)\^([0-9]+)/\$\{\1\}\^\{\2\}\$/g; + + output_highlight($sec); + print "\\end{rmfamily}\n"; + } + print "\n"; +} + + +# output in sgml DocBook +sub output_sgml { + my %args = %{$_[0]}; + my ($parameter, $section); + my $count; + my $id; + + $id = $args{'module'}."-".$args{'function'}; + $id =~ s/[^A-Za-z0-9]/-/g; + + print "\n"; + print "\n"; + print "".$args{'function'}."\n"; + print "\n"; + print "\n"; + print " ".$args{'function'}."\n"; + print " \n"; + print " ".$args{'purpose'}."\n"; + print " \n"; + print "\n"; + + print "\n"; + print " Synopsis\n"; + print " \n"; + print " ".$args{'functiontype'}." "; + print "".$args{'function'}." "; + print "\n"; + +# print "\n"; +# print " Synopsis\n"; +# print " \n"; +# print " ".$args{'functiontype'}." "; +# print "".$args{'function'}." "; +# print "\n"; + + $count = 0; + if ($#{$args{'parameterlist'}} >= 0) { + foreach $parameter (@{$args{'parameterlist'}}) { + print " ".$args{'parametertypes'}{$parameter}; + print " $parameter\n"; + } + } else { + print " \n"; + } + print " \n"; + print "\n"; +# print "\n"; + + # print parameters + print "\n Arguments\n"; +# print "\nArguments\n"; + if ($#{$args{'parameterlist'}} >= 0) { + print " \n"; + foreach $parameter (@{$args{'parameterlist'}}) { + print " \n $parameter\n"; + print " \n \n"; + $lineprefix=" "; + output_highlight($args{'parameters'}{$parameter}); + print " \n \n \n"; + } + print " \n"; + } else { + print " \n None\n \n"; + } + print "\n"; + + # print out each section + $lineprefix=" "; + foreach $section (@{$args{'sectionlist'}}) { + print "\n $section\n \n"; +# print "\n$section\n"; + if ($section =~ m/EXAMPLE/i) { + print "\n"; + } + output_highlight($args{'sections'}{$section}); +# print ""; + if ($section =~ m/EXAMPLE/i) { + print "\n"; + } + print " \n\n"; + } + + print "\n\n"; +} + +## +# output in man +sub output_man { + my %args = %{$_[0]}; + my ($parameter, $section); + my $count; + + print ".TH \"$args{'module'}\" \"$args{'function'}\" \"25 May 1998\" \"API Manual\" GNOME\n"; + + print ".SH Function\n"; + + print ".I \"".$args{'functiontype'}."\"\n"; + print ".B \"".$args{'function'}."\"\n"; + print "(\n"; + $count = 0; + foreach $parameter (@{$args{'parameterlist'}}) { + print ".I \"".$args{'parametertypes'}{$parameter}."\"\n.B \"".$parameter."\"\n"; + if ($count != $#{$args{'parameterlist'}}) { + $count++; + print ",\n"; + } + } + print ")\n"; + + print ".SH Arguments\n"; + foreach $parameter (@{$args{'parameterlist'}}) { + print ".IP \"".$args{'parametertypes'}{$parameter}." ".$parameter."\" 12\n"; + output_highlight($args{'parameters'}{$parameter}); + } + foreach $section (@{$args{'sectionlist'}}) { + print ".SH \"$section\"\n"; + output_highlight($args{'sections'}{$section}); + } +} + +## +# output in text +sub output_text { + my %args = %{$_[0]}; + my ($parameter, $section); + + print "Function = ".$args{'function'}."\n"; + print " return type: ".$args{'functiontype'}."\n\n"; + foreach $parameter (@{$args{'parameterlist'}}) { + print " ".$args{'parametertypes'}{$parameter}." ".$parameter."\n"; + print " -> ".$args{'parameters'}{$parameter}."\n"; + } + foreach $section (@{$args{'sectionlist'}}) { + print " $section:\n"; + print " -> "; + output_highlight($args{'sections'}{$section}); + } +} + +## +# generic output function - calls the right one based +# on current output mode. +sub output_function { +# output_html(@_); + eval "output_".$output_mode."(\@_);"; +} + + +## +# takes a function prototype and spits out all the details +# stored in the global arrays/hsahes. +sub dump_function { + my $prototype = shift @_; + + if ($prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ || + $prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ || + $prototype =~ m/^(\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ || + $prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ || + $prototype =~ m/^(\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/) { + $return_type = $1; + $function_name = $2; + $args = $3; + +# print STDERR "ARGS = '$args'\n"; + + foreach $arg (split ',', $args) { + # strip leading/trailing spaces + $arg =~ s/^\s*//; + $arg =~ s/\s*$//; +# print STDERR "SCAN ARG: '$arg'\n"; + @args = split('\s', $arg); + +# print STDERR " -> @args\n"; + $param = pop @args; +# print STDERR " -> @args\n"; + if ($param =~ m/^(\*+)(.*)/) { + $param = $2; + push @args, $1; + } + $type = join " ", @args; + + if ($parameters{$param} eq "" && $param != "void") { + $parameters{$param} = "-- undescribed --"; + print STDERR "Warning($lineno): Function parameter '$param' not described in '$function_name'\n"; + } + + push @parameterlist, $param; + $parametertypes{$param} = $type; + +# print STDERR "param = '$param', type = '$type'\n"; + } + } else { + print STDERR "Error($lineno): cannot understand prototype: '$prototype'\n"; + return; + } + + if ($function_only==0 || defined($function_table{$function_name})) { + output_function({'function' => $function_name, + 'module' => $modulename, + 'functiontype' => $return_type, + 'parameterlist' => \@parameterlist, + 'parameters' => \%parameters, + 'parametertypes' => \%parametertypes, + 'sectionlist' => \@sectionlist, + 'sections' => \%sections, + 'purpose' => $function_purpose + }); + } +} + +###################################################################### +# main +# states +# 0 - normal code +# 1 - looking for function name +# 2 - scanning field start. +# 3 - scanning prototype. +$state = 0; +$section = ""; + +$doc_special = "\@\%\$\&"; + +$doc_start = "^/\\*\\*\$"; +$doc_end = "\\*/"; +$doc_com = "\\s*\\*\\s*"; +$doc_func = $doc_com."(\\w+):?"; +$doc_sect = $doc_com."([".$doc_special."]?[\\w ]+):(.*)"; +$doc_content = $doc_com."(.*)"; + +%constants = (); +%parameters = (); +@parameterlist = (); +%sections = (); +@sectionlist = (); + +$contents = ""; +$section_default = "Description"; # default section +$section = $section_default; + +$lineno = 0; +foreach $file (@ARGV) { + if (!open(IN,"<$file")) { + print STDERR "Error: Cannot open file $file\n"; + next; + } + while () { + $lineno++; + + if ($state == 0) { + if (/$doc_start/o) { + $state = 1; # next line is always the function name + } + } elsif ($state == 1) { # this line is the function name (always) + if (/$doc_func/o) { + $function = $1; + $state = 2; + if (/-(.*)/) { + $function_purpose = $1; + } else { + $function_purpose = ""; + } + if ($verbose) { + print STDERR "Info($lineno): Scanning doc for $function\n"; + } + } else { + print STDERR "WARN($lineno): Cannot understand $_ on line $lineno", + " - I thought it was a doc line\n"; + $state = 0; + } + } elsif ($state == 2) { # look for head: lines, and include content + if (/$doc_sect/o) { + $newsection = $1; + $newcontents = $2; + + if ($contents ne "") { + dump_section($section, $contents); + $section = $section_default; + } + + $contents = $newcontents; + if ($contents ne "") { + $contents .= "\n"; + } + $section = $newsection; + } elsif (/$doc_end/) { + + if ($contents ne "") { + dump_section($section, $contents); + $section = $section_default; + $contents = ""; + } + +# print STDERR "end of doc comment, looking for prototype\n"; + $prototype = ""; + $state = 3; + } elsif (/$doc_content/) { + # miguel-style comment kludge, look for blank lines after + # @parameter line to signify start of description + if ($1 eq "" && $section =~ m/^@/) { + dump_section($section, $contents); + $section = $section_default; + $contents = ""; + } else { + $contents .= $1."\n"; + } + } else { + # i dont know - bad line? ignore. + print STDERR "WARNING($lineno): bad line: $_"; + } + } elsif ($state == 3) { # scanning for function { (end of prototype) + if (m#\s*/\*\s+MACDOC\s*#io) { + # do nothing + } + elsif (/([^\{]*)/) { + $prototype .= $1; + } + if (/\{/) { + $prototype =~ s@/\*.*?\*/@@gos; # strip comments. + $prototype =~ s@[\r\n]+@ @gos; # strip newlines/cr's. + $prototype =~ s@^ +@@gos; # strip leading spaces + dump_function($prototype); + + $function = ""; + %constants = (); + %parameters = (); + %parametertypes = (); + @parameterlist = (); + %sections = (); + @sectionlist = (); + $prototype = ""; + + $state = 0; + } + } + } +} + diff --git a/doc/gpl.texi b/doc/gpl.texi new file mode 100644 index 0000000..c9ea84b --- /dev/null +++ b/doc/gpl.texi @@ -0,0 +1,394 @@ +@node Copying +@appendix GNU GENERAL PUBLIC LICENSE + +@cindex GPL, General Public License +@center Version 2, June 1991 + +@c This file is intended to be included in another file. + +@display +Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc. +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +@end display + +@appendixsec Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software---to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + +@iftex +@appendixsec TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +@end iftex +@ifinfo +@center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +@end ifinfo + +@enumerate 0 +@item +This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The ``Program'', below, +refers to any such program or work, and a ``work based on the Program'' +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term ``modification''.) Each licensee is addressed as ``you''. + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +@item +You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +@item +You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +@enumerate a +@item +You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +@item +You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +@item +If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) +@end enumerate + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +@item +You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +@enumerate a +@item +Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +@item +Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +@item +Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) +@end enumerate + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +@item +You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +@item +You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +@item +Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +@item +If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +@item +If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +@item +The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and ``any +later version'', you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +@item +If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +@iftex +@heading NO WARRANTY +@end iftex +@ifinfo +@center NO WARRANTY +@end ifinfo + +@item +BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +@item +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. +@end enumerate + +@iftex +@heading END OF TERMS AND CONDITIONS +@end iftex +@ifinfo +@center END OF TERMS AND CONDITIONS +@end ifinfo + +@page +@appendixsec How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the ``copyright'' line and a pointer to where the full notice is found. + +@smallexample +@var{one line to give the program's name and a brief idea of what it does.} +Copyright (C) @var{yyyy} @var{name of author} + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program 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 General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +@end smallexample + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +@smallexample +Gnomovision version 69, Copyright (C) 19@var{yy} @var{name of author} +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. +@end smallexample + +The hypothetical commands @samp{show w} and @samp{show c} should show +the appropriate parts of the General Public License. Of course, the +commands you use may be called something other than @samp{show w} and +@samp{show c}; they could even be mouse-clicks or menu items---whatever +suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a ``copyright disclaimer'' for the program, if +necessary. Here is a sample; alter the names: + +@example +Yoyodyne, Inc., hereby disclaims all copyright interest in the program +`Gnomovision' (which makes passes at compilers) written by James Hacker. + +@var{signature of Ty Coon}, 1 April 1989 +Ty Coon, President of Vice +@end example + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/doc/gsasl-callback-authentication.texi b/doc/gsasl-callback-authentication.texi new file mode 100644 index 0000000..c8774f4 --- /dev/null +++ b/doc/gsasl-callback-authentication.texi @@ -0,0 +1,20 @@ +@deftypefn Prototype int (*Gsasl_client_callback_authentication_id) (Gsasl_session_ctx * @var{ctx}, char * @var{out}, size_t * @var{outlen}) + +@var{ctx}: libgsasl handle. + +@var{out}: output array with authentication identity. + +@var{outlen}: on input the maximum size of the output array, on output +contains the actual size of the output array. + +Type of callback function the application implements. It should +populate the output array with authentiction identity of user and set +the output array length, and return @code{GSASL_OK}, or fail with an +error code. The authentication identity must be encoded in UTF-8, but +need not be normalized in any way. + +If OUT is NULL, the function should only populate the output length +field with the length, and return GSASL_OK. This usage may be used by +the caller to allocate the proper buffer size. + +@end deftypefn diff --git a/doc/gsasl-callback-authorization.texi b/doc/gsasl-callback-authorization.texi new file mode 100644 index 0000000..f48cb5a --- /dev/null +++ b/doc/gsasl-callback-authorization.texi @@ -0,0 +1,20 @@ +@deftypefn Prototype int (*Gsasl_client_callback_authorization_id) (Gsasl_session_ctx * @var{ctx}, char * @var{out}, size_t * @var{outlen}) + +@var{ctx}: libgsasl handle. + +@var{out}: output array with authorization identity. + +@var{outlen}: on input the maximum size of the output array, on output +contains the actual size of the output array. + +Type of callback function the application implements. It should +populate the output array with authorization identity of user and set +the output array length, and return @code{GSASL_OK}, or fail with an +error code. The authorization identity must be encoded in UTF-8, but +need not be normalized in any way. + +If OUT is NULL, the function should only populate the output length +field with the length, and return GSASL_OK. This usage may be used by +the caller to allocate the proper buffer size. + +@end deftypefn diff --git a/doc/gsasl-callback-client-service.texi b/doc/gsasl-callback-client-service.texi new file mode 100644 index 0000000..866e7b1 --- /dev/null +++ b/doc/gsasl-callback-client-service.texi @@ -0,0 +1,39 @@ +@deftypefn Prototype int (*Gsasl_client_callback_service) (Gsasl_session_ctx * @var{ctx}, char * @var{service}, size_t * @var{servicelen}, char * @var{hostname}, size_t * @var{hostnamelen}, char * @var{servicename}, size_t * @var{servicenamelen}) + +@var{ctx}: libgsasl handle. + +@var{service}: output array with name of service. + +@var{servicelen}: on input the maximum size of the service output array, +on output contains the actual size of the service output array. + +@var{hostname}: output array with hostname of server. + +@var{hostnamelen}: on input the maximum size of the hostname output +array, on output contains the actual size of the hostname output +array. + +@var{servicename}: output array with generic name of server in case of +replication (DIGEST-MD5 only). + +@var{servicenamelen}: on input the maximum size of the servicename +output array, on output contains the actual size of the servicename +output array. + +Type of callback function the application implements. It should +retrieve the service (which should be a registered GSSAPI host based +service name, such as ``imap'') on the server, hostname of server +(usually canoncial DNS hostname) and optionally generic service name +of server in case of replication (e.g. ``mail.example.org'' when the +hostname is ``mx42.example.org'', see the RFC 2831 for more +information). It should return GSASL_OK, or an error such as +GSASL_AUTHENTICATION_ERROR if it fails. + +If SERVICE, HOSTNAME or SERVICENAME is NULL, the function should only +populate SERVICELEN, HOSTNAMELEN or SERVICENAMELEN with the output +length of the respective field, and return GSASL_OK. This usage may +be used by the caller to allocate the proper buffer size. +Furthermore, SERVICENAMELEN may also be NULL, indicating that the +mechanism is not interested in this field. + +@end deftypefn diff --git a/doc/gsasl-callback-cram-md5.texi b/doc/gsasl-callback-cram-md5.texi new file mode 100644 index 0000000..b0b637d --- /dev/null +++ b/doc/gsasl-callback-cram-md5.texi @@ -0,0 +1,17 @@ +@deftypefn Prototype int (*Gsasl_server_callback_cram_md5) (Gsasl_session_ctx * @var{ctx}, char * @var{username}, char * @var{challenge}, char * @var{response}) + +@var{ctx}: libgsasl handle. + +@var{username}: input array with username. + +@var{challenge}: input array with CRAM-MD5 challenge. + +@var{response}: input array with CRAM-MD5 response. + +Type of callback function the application implements. It should +return GSASL_OK if and only if the validation of the provided +credential was succesful. GSASL_AUTHENTICATION_ERROR is a good +failure if authentication failed, but any available return code may be +used. + +@end deftypefn diff --git a/doc/gsasl-callback-digest-md5.texi b/doc/gsasl-callback-digest-md5.texi new file mode 100644 index 0000000..31ddcc6 --- /dev/null +++ b/doc/gsasl-callback-digest-md5.texi @@ -0,0 +1,18 @@ +@deftypefn Prototype int (*Gsasl_server_callback_digest_md5) (Gsasl_session_ctx * @var{ctx}, char * @var{username}, char * @var{realm}, char * @var{secrethash}) + +@var{ctx}: libgsasl handle. + +@var{username}: input array with authentication identity of user. + +@var{realm}: input array with realm of user. + +@var{secrethash}: output array that should contain hash of username, +realm and password as described for the DIGEST-MD5 mechanism. + +Type of callback function the application implements. It should +retrieve the secret hash for the given user in given realm and return +GSASL_OK, or an error such as GSASL_AUTHENTICATION_ERROR if it fails. +The secrethash buffer is guaranteed to have size for the fixed length +MD5 hash. + +@end deftypefn diff --git a/doc/gsasl-callback-gssapi.texi b/doc/gsasl-callback-gssapi.texi new file mode 100644 index 0000000..0b0b4f6 --- /dev/null +++ b/doc/gsasl-callback-gssapi.texi @@ -0,0 +1,39 @@ +@deftypefn Prototype int (*Gsasl_server_callback_gssapi) (Gsasl_session_ctx * @var{ctx}, char * @var{clientname}, char * @var{authentication_id}) + +@var{ctx}: libgsasl handle. + +@var{clientname}: input array with GSSAPI client name. + +@var{authentication_id}: input array with authentication identity. + +Type of callback function the application implements. It should +return GSASL_OK if and only if the GSSAPI user is authorized to log on +as the given authentication_id. GSASL_AUTHENTICATION_ERROR is a good +failure if authentication failed, but any available return code may be +used. This callback is usually implemented in the application as a +call to krb5_kuserok(), such as: + +@example +int +callback_gssapi (Gsasl_session_ctx *ctx, + char *clientname, + char *authentication_id) +@{ + int rc = GSASL_AUTHENTICATION_ERROR; + + krb5_principal p; + krb5_context kcontext; + + krb5_init_context (&kcontext); + + if (krb5_parse_name (kcontext, clientname, &p) != 0) + return -1; + if (krb5_kuserok (kcontext, p, authentication_id)) + rc = GSASL_OK; + krb5_free_principal (kcontext, p); + + return rc; +@} +@end example + +@end deftypefn diff --git a/doc/gsasl-callback-passcode.texi b/doc/gsasl-callback-passcode.texi new file mode 100644 index 0000000..3f94c1d --- /dev/null +++ b/doc/gsasl-callback-passcode.texi @@ -0,0 +1,18 @@ +@deftypefn Prototype int (*Gsasl_client_callback_passcode) (Gsasl_session_ctx * @var{ctx}, char * @var{out}, size_t * @var{outlen}) + +@var{ctx}: libgsasl handle. + +@var{out}: output array with passcode. + +@var{outlen}: on input the maximum size of the output array, on output +contains the actual size of the output array. + +Type of callback function the application implements. It should +populate the output array with passcode of user and set the output +array length, and return @code{GSASL_OK}, or fail with an error code. + +If OUT is NULL, the function should only populate the output length +field with the length, and return GSASL_OK. This usage may be used by +the caller to allocate the proper buffer size. + +@end deftypefn diff --git a/doc/gsasl-callback-password.texi b/doc/gsasl-callback-password.texi new file mode 100644 index 0000000..9664299 --- /dev/null +++ b/doc/gsasl-callback-password.texi @@ -0,0 +1,20 @@ +@deftypefn Prototype int (*Gsasl_client_callback_password) (Gsasl_session_ctx * @var{ctx}, char * @var{out}, size_t * @var{outlen}) + +@var{ctx}: libgsasl handle. + +@var{out}: output array with password. + +@var{outlen}: on input the maximum size of the output array, on output +contains the actual size of the output array. + +Type of callback function the application implements. It should +populate the output array with password of user and set the output +array length, and return @code{GSASL_OK}, or fail with an error +code. The password must be encoded in UTF-8, but need not be +normalized in any way. + +If OUT is NULL, the function should only populate the output length +field with the length, and return GSASL_OK. This usage may be used by +the caller to allocate the proper buffer size. + +@end deftypefn diff --git a/doc/gsasl-callback-retrieve.texi b/doc/gsasl-callback-retrieve.texi new file mode 100644 index 0000000..47ee43f --- /dev/null +++ b/doc/gsasl-callback-retrieve.texi @@ -0,0 +1,25 @@ +@deftypefn Prototype int (*Gsasl_server_callback_retrieve) (Gsasl_session_ctx * @var{ctx}, char * @var{authentication_id}, char * @var{authorization_id}, char * @var{realm}, char * @var{key}, size_t * @var{keylen}) + +@var{ctx}: libgsasl handle. + +@var{authentication_id}: input array with authentication identity. + +@var{authorization_id}: input array with authorization identity, or NULL. + +@var{realm}: input array with realm of user, or NULL. + +@var{key}: output array with key for authentication identity. + +@var{keylen}: on input the maximum size of the key output array, on +output contains the actual size of the key output array. + +Type of callback function the application implements. It should +retrieve the password for the indicated user and return GSASL_OK, or +an error code such as GSASL_AUTHENTICATION_ERROR. The key must be +encoded in UTF-8, but need not be normalized in any way. + +If KEY is NULL, the function should only populate the KEYLEN output +length field with the length, and return GSASL_OK. This usage may be +used by the caller to allocate the proper buffer size. + +@end deftypefn diff --git a/doc/gsasl-callback-securid.texi b/doc/gsasl-callback-securid.texi new file mode 100644 index 0000000..c0a3833 --- /dev/null +++ b/doc/gsasl-callback-securid.texi @@ -0,0 +1,35 @@ +@deftypefn Prototype int (*Gsasl_server_callback_validate) (Gsasl_session_ctx * @var{ctx}, char * @var{authentication_id}, char * @var{authorization_id}, char * @var{passcode}, char * @var{pin}, char * @var{suggestpin}, size_t * @var{suggestpinlen}) + +@var{ctx}: libgsasl handle. + +@var{authorization_id}: input array with authorization identity. + +@var{authentication_id}: input array with authentication identity. + +@var{passcode}: input array with passcode. + +@var{pin}: input array with new pin (this may be NULL). + +@var{suggestpin}: output array with new suggested PIN. + +@var{suggestpinlen}: on input the maximum size of the output array, on +output contains the actual size of the output array. + +Type of callback function the application implements. It should +return GSASL_OK if and only if the validation of the provided +credential was succesful. GSASL_AUTHENTICATION_ERROR is a good +failure if authentication failed, but any available return code may be +used. + +Two SECURID specific error codes also exists. The function can return +GSASL_SECURID_SERVER_NEED_ADDITIONAL_PASSCODE to request that the +client generate a new passcode. It can also return +GSASL_SECURID_SERVER_NEED_NEW_PIN to request that the client generate +a new PIN. If the server wishes to suggest a new PIN it can populate +the SUGGESTPIN field. + +If SUGGESTPIN is NULL, the function should only populate the output +length field with the length, and return GSASL_OK. This usage may be +used by the caller to allocate the proper buffer size. + +@end deftypefn diff --git a/doc/gsasl-callback-server-service.texi b/doc/gsasl-callback-server-service.texi new file mode 100644 index 0000000..23aea32 --- /dev/null +++ b/doc/gsasl-callback-server-service.texi @@ -0,0 +1,27 @@ +@deftypefn Prototype int (*Gsasl_server_callback_service) (Gsasl_session_ctx * @var{ctx}, char * @var{service}, size_t * @var{servicelen}, char * @var{hostname}, size_t * @var{hostnamelen}) + +@var{ctx}: libgsasl handle. + +@var{service}: output array with name of service. + +@var{servicelen}: on input the maximum size of the service output array, +on output contains the actual size of the service output array. + +@var{hostname}: output array with hostname of server. + +@var{hostnamelen}: on input the maximum size of the hostname output +array, on output contains the actual size of the hostname output +array. + +Type of callback function the application implements. It should +retrieve the service (which should be a registered GSSAPI host based +service name, such as ``imap'') the server provides and hostname of +server (usually canoncial DNS hostname). It should return GSASL_OK, +or an error such as GSASL_AUTHENTICATION_ERROR if it fails. + +If SERVICE or HOSTNAME is NULL, the function should only populate +SERVICELEN or HOSTNAMELEN with the output length of the respective +field, and return GSASL_OK. This usage may be used by the caller to +allocate the proper buffer size. + +@end deftypefn diff --git a/doc/gsasl-callback-validate.texi b/doc/gsasl-callback-validate.texi new file mode 100644 index 0000000..6ab91d8 --- /dev/null +++ b/doc/gsasl-callback-validate.texi @@ -0,0 +1,17 @@ +@deftypefn Prototype int (*Gsasl_server_callback_validate) (Gsasl_session_ctx * @var{ctx}, char * @var{authorization_id}, char * @var{authentication_id}, char * @var{password}) + +@var{ctx}: libgsasl handle. + +@var{authorization_id}: input array with authorization identity. + +@var{authentication_id}: input array with authentication identity. + +@var{password}: input array with password. + +Type of callback function the application implements. It should +return GSASL_OK if and only if the validation of the provided +credential was succesful. GSASL_AUTHENTICATION_ERROR is a good +failure if authentication failed, but any available return code may be +used. + +@end deftypefn diff --git a/doc/gsasl-example1.c b/doc/gsasl-example1.c new file mode 100644 index 0000000..0a71b10 --- /dev/null +++ b/doc/gsasl-example1.c @@ -0,0 +1,37 @@ +#include +#include +#include + +/* Build using the following command: + * gcc -o foo foo.c `libgsasl-config --cflags --libs` + */ + +int +main (int argc, char *argv[]) +@{ + Gsasl_ctx *ctx; + int res; + + setlocale (LC_ALL, ""); + + if (gsasl_check_version(GSASL_VERSION) == NULL) + @{ + fprintf(stderr, "Libgsasl is %s expected %s\n", + gsasl_check_version(NULL), GSASL_VERSION); + return 1; + @} + + res = gsasl_init (&ctx); + if (res != GSASL_OK) + @{ + fprintf(stderr, "Cannot initialize libgsasl: %s\n", + gsasl_strerror(res)); + return 1; + @} + + /* Do things here ... */ + + gsasl_done(ctx); + + return 0; +@} diff --git a/doc/gsasl.texi b/doc/gsasl.texi new file mode 100644 index 0000000..e705a58 --- /dev/null +++ b/doc/gsasl.texi @@ -0,0 +1,944 @@ +\input texinfo @c -*- Texinfo -*- +@c Copyright (C) 2002 Simon Josefsson +@c +@c This file is part of the libgsasl +@c Permission is granted to copy, distribute and/or modify this document +@c under the terms of the GNU Free Documentation License, Version 1.1 +@c or any later version published by the Free Software Foundation; +@c with the Invariant Sections being with no Invariant Sections, with the +@c no Front-Cover Texts, and with the no Back-Cover Texts. +@c A copy of the license is included in the section entitled ``GNU +@c Free Documentation License'' in the file 'fdl.texi'. +@c +@setfilename gsasl.info +@include version.texi +@settitle The Libgsasl Reference Manual + +@c Unify some of the indices. +@syncodeindex tp fn +@syncodeindex pg fn + +@copying +This is @cite{The Libgsasl Reference Manual}, last updated +@value{UPDATED}, for Version @value{VERSION} of the @acronym{Libgsasl} +library. + +Copyright @copyright{} 2002 Simon Josefsson. + +@quotation +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.1 or +any later version published by the Free Software Foundation; with no +Invariant Sections, with the Front-Cover texts being ``A GNU Manual,'' +and with the Back-Cover Texts as in (a) below. A copy of the license +is included in the section entitled ``GNU Free Documentation +License.'' + +(a) The FSF's Back-Cover Text is: ``You have freedom to copy and +modify this GNU Manual, like GNU software. Copies published by the +Free Software Foundation raise funds for GNU development.'' +@end quotation +@end copying + +@dircategory GNU Libraries +@direntry +* libgsasl: (gsasl). Simple Authentication and Security Layer Library. +@end direntry + +@titlepage +@title The Libgsasl Reference Manual +@subtitle for version @value{VERSION}, @value{UPDATED} +@author Simon Josefsson (@email{bug-libgsasl@@josefsson.org}) +@page +@vskip 0pt plus 1filll +@insertcopying +@end titlepage + +@contents + +@ifnottex +@node Top +@top Libgsasl +@insertcopying +@end ifnottex + +@menu +* Introduction:: How to use this manual. +* Preparation:: What you should do before using the library. +* Using the Library:: High level overview of how to use the library. +* Mechanisms:: Mechanism specific information. +* Global Functions:: Functions to use in global context. +* Callback Functions:: Functions to set and get callbacks. +* Session Functions:: Functions to perform the actual authentication. +* Utilities:: Functions for various odd things. +* Error Handling:: Error codes and such. +* Examples:: Example code. +* Acknowledgements:: Whom to blame. + +Appendices + +* Copying This Manual:: How you can copy and share this manual. +* Library Copying:: How you can copy and share the library. +* Copying:: How you can copy and share the tools. + +Indices + +* Concept Index:: Index of concepts and programs. +* Function and Data Index:: Index of functions, variables and data types. +@end menu + +@c ********************************************************** +@c ******************* Introduction *********************** +@c ********************************************************** +@node Introduction +@chapter Introduction + +`Libgsasl' is a library that provides a Simple Authentication and +Security Layer (SASL) interface for applications. Included are also a +set of well known SASL mechanisms. + +@menu +* Getting Started:: +* Features:: +* SASL Overview:: +@end menu + +@node Getting Started +@section Getting Started + +This manual documents the `Libgsasl' library programming interface. +All functions and data types provided by the library are explained. + +The reader is assumed to possess basic familiarity with SASL. + +This manual can be used in several ways. If read from the beginning +to the end, it gives a good introduction into the library and how it +can be used in an application. Forward references are included where +necessary. Later on, the manual can be used as a reference manual to +get just the information needed about any particular interface of the +library. Experienced programmers might want to start looking at the +examples at the end of the manual, and then only read up those parts +of the interface which are unclear. + +@node Features +@section Features + +`Libgsasl' might have a couple of advantages over other libraries doing +a similar job. + +@table @asis +@item It's Free Software +Anybody can use, modify, and redistribute it under the terms of the GNU +Lesser General Public License (@pxref{Library Copying}). + +@item It's thread-safe +No global variables are used and multiple library handles and session +handles may be used in parallell. + +@item It's internationalized +It handles non-ASCII username and passwords and user visible strings +used in the library (error messages) can be translated into the users' +language. + +@item It's portable +It should work on all Unix like operating systems, including Windows. + +@end table + +Note that the library do not implement any policy to decide whether a +certain user is ``authenticated'' or not. Rather, it uses callbacks +back into the application to answer these questions. + +@node SASL Overview +@section SASL Overview + +This section describes SASL from a protocol point of view@footnote{The +text is a lightly adapted version of the introduction section from RFC +2222 by John G. Myers, copyright 1997 by The Internet Society.}. + +The Simple Authentication and Security Layer (SASL) is a method for +adding authentication support to connection-based protocols. A +protocol includes a command for identifying and authenticating a user +to a server and for optionally negotiating a security layer for +subsequent protocol interactions. + +The command has a required argument identifying a SASL mechanism. +SASL mechanisms are named by strings, from 1 to 20 characters in +length, consisting of upper-case letters, digits, hyphens, and/or +underscores. + +If a server supports the requested mechanism, it initiates an +authentication protocol exchange. This consists of a series of +server challenges and client responses that are specific to the +requested mechanism. The challenges and responses are defined by the +mechanisms as binary tokens of arbitrary length. The protocol's +profile then specifies how these binary tokens are then encoded for +transfer over the connection. + +After receiving the authentication command or any client response, a +server may issue a challenge, indicate failure, or indicate +completion. The protocol's profile specifies how the server +indicates which of the above it is doing. + +After receiving a challenge, a client may issue a response or abort +the exchange. The protocol's profile specifies how the client +indicates which of the above it is doing. + +During the authentication protocol exchange, the mechanism performs +authentication, transmits an authorization identity (frequently known +as a userid) from the client to server, and negotiates the use of a +mechanism-specific security layer. If the use of a security layer is +agreed upon, then the mechanism must also define or negotiate the +maximum cipher-text buffer size that each side is able to receive. + +The transmitted authorization identity may be different than the +identity in the client's authentication credentials. This permits +agents such as proxy servers to authenticate using their own +credentials, yet request the access privileges of the identity for +which they are proxying. With any mechanism, transmitting an +authorization identity of the empty string directs the server to +derive an authorization identity from the client's authentication +credentials. + +If use of a security layer is negotiated, it is applied to all +subsequent data sent over the connection. The security layer takes +effect immediately following the last response of the authentication +exchange for data sent by the client and the completion indication +for data sent by the server. Once the security layer is in effect, +the protocol stream is processed by the security layer into buffers +of cipher-text. Each buffer is transferred over the connection as a +stream of octets prepended with a four octet field in network byte +order that represents the length of the following buffer. The length +of the cipher-text buffer must be no larger than the maximum size +that was defined or negotiated by the other side. + +@c ********************************************************** +@c ******************* Preparation ************************ +@c ********************************************************** +@node Preparation +@chapter Preparation + +To use `Libgsasl', you have to perform some changes to your sources and +the build system. The necessary changes are small and explained in the +following sections. At the end of this chapter, it is described how the +library is initialized, and how the requirements of the library are +verified. + +A faster way to find out how to adapt your application for use with +`Libgsasl' may be to look at the examples at the end of this manual +(@pxref{Examples}). + +@menu +* Header:: +* Initialization:: +* Version Check:: +* Building the source:: +@end menu + +@node Header +@section Header + +All interfaces (data types and functions) of the library are defined +in the header file `gsasl.h'. You must include this in all programs +using the library, either directly or through some other header file, +like this: + +@example +#include +@end example + +The name space of `Libgsasl' is @code{gsasl_*} for function names, +@code{Gsasl*} for data types and @code{GSASL_*} for other symbols. In +addition the same name prefixes with one prepended underscore are +reserved for internal use and should never be used by an application. + +@node Initialization +@section Initialization + +`Libgsasl' must be initialized before it can be used. The library is +initialized by calling @code{gsasl_init()} (@pxref{Global Functions}). +The resources allocated by the initialization process can be released +if the application no longer has a need to call `Libgsasl' functions, +this is done by calling @code{gsasl_done()}. + +In order to take advantage of the internationalisation features in +`Libgsasl', such as translated error messages, the application must +set the current locale using @code{setlocale()} before initializing +`Libgsasl'. + +@node Version Check +@section Version Check + +It is often desirable to check that the version of `Libgsasl' used is +indeed one which fits all requirements. Even with binary compatibility +new features may have been introduced but due to problem with the +dynamic linker an old version is actually used. So you may want to +check that the version is okay right after program startup. + +@include gsasl-api-version.texi + +@node Building the source +@section Building the source +@cindex Compiling your application + +If you want to compile a source file including the `gsasl.h' header +file, you must make sure that the compiler can find it in the +directory hierarchy. This is accomplished by adding the path to the +directory in which the header file is located to the compilers include +file search path (via the @option{-I} option). + +However, the path to the include file is determined at the time the +source is configured. To solve this problem, `Libgsasl' ships with a small +helper program @command{libgsasl-config} that knows the path to the +include file and other configuration options. The options that need +to be added to the compiler invocation at compile time are output by +the @option{--cflags} option to @command{libgsasl-config}. The following +example shows how it can be used at the command line: + +@example +gcc -c foo.c `libgsasl-config --cflags` +@end example + +Adding the output of @samp{libgsasl-config --cflags} to the compilers +command line will ensure that the compiler can find the `Libgsasl' header +file. + +A similar problem occurs when linking the program with the library. +Again, the compiler has to find the library files. For this to work, +the path to the library files has to be added to the library search path +(via the @option{-L} option). For this, the option @option{--libs} to +@command{libgsasl-config} can be used. For convenience, this option +also outputs all other options that are required to link the program +with the `Libgsasl' libararies (in particular, the @samp{-lgsasl} +option). The example shows how to link @file{foo.o} with the `Libgsasl' +library to a program @command{foo}. + +@example +gcc -o foo foo.o `libgsasl-config --libs` +@end example + +Of course you can also combine both examples to a single command by +specifying both options to @command{libgsasl-config}: + +@example +gcc -o foo foo.c `libgsasl-config --cflags --libs` +@end example + + +@c ********************************************************** +@c ***************** Using the Library ******************** +@c ********************************************************** +@node Using the Library +@chapter Using the Library + +After initialization of the library, the core part of the library is +run within a loop until it has finished. The library is handed input +from the other protocol entity and results in output which is to be +sent to the other entity, or an error code. The library does not send +data to the server itself, but only return it in buffers. The main +interface to the library uses binary data, but since many common +protocols uses Base 64 encoded data, a wrapper around the main +function is also provided. + +The following pseudo code illustrates how the library is used in a +simple client. All the functions used are explained later on in this +manual. + +@example +main() +@{ + Gsasl_ctx *ctx; + Gsasl_session_ctx *cctx; + char *input, output[BUFFERSIZE]; + size_t output_len; + int rc; + + rc = gsasl_init (&ctx); + if (rc != GSASL_OK) + die(gsasl_strerror(rc)); + + /* XXX Set callbacks here */ + + /* Read supported SASL mechanism from server */ + input = read_from_client(); + + /* Select a good mechanism */ + mech = gsasl_client_suggest_mechanism (ctx, input); + if (mech == NULL) + die("Cannot find any commonly agreed SASL mechanism..."); + + /* Start to use it */ + res = gsasl_client_start (ctx, mech, &cctx); + if (res != GSASL_OK) + die(gsasl_strerror (rc)); + + input = NULL; + do + @{ + /* Do one SASL step and unless we're done, send the output to + server and read new data from server */ + + rc = gsasl_client_step_base64 (cctx, input, output, BUFFERSIZE); + if (rc != GSASL_NEEDS_MORE) + break; + + write_to_client(output); + + input = read_from_client(); + @} + while (rc == GSASL_NEEDS_MORE); + + if (rc != GSASL_OK) + die("Authentication failed... %s\n", gsasl_strerror(rc); + + /* Client is now authenticated -- proceed with actual protocol... */ + + gsasl_client_finish (cctx); + gsasl_done (ctx); +@} +@end example + +Notice the XXX comment that said you should specify the callbacks to +use there. `Libgsasl' depend on callbacks to implement user +interaction (in the client) and user validation (in the server). If +you don't specify any callbacks, very few mechanisms will be supported +(like EXTERNAL that don't need any additional information, +@pxref{EXTERNAL}). Since we are building a simple client, we define +callbacks which are used by several SASL mechanisms to get username +and password. We start by defining the function for querying the +username, following the prototype for +@code{Gsasl_client_callback_authentication_id} for the LOGIN mechanism +(@pxref{LOGIN}) . + +@example +int +callback_username (Gsasl_session_ctx *ctx, + char *out, + size_t *outlen) +@{ + char username[BUFFERSIZE]; + + if (out == NULL) + *outlen = BUFFERSIZE; + else + @{ + fprintf(stdout, "Enter username: "); + fgets(username, BUFFERSIZE, stdin); + *outlen = strlen(BUFFERSIZE); + @} + + return GSASL_OK; +@} +@end example + +As you can see, this is a simplistic function that reads a username +from the user. The callback for entering the password is similar and +follows the @code{Gsasl_client_callback_password} prototype: + +@example +int +callback_password (Gsasl_session_ctx *ctx, + char *out, + size_t *outlen) +@{ + char password[BUFFERSIZE]; + + if (out == NULL) + *outlen = BUFFERSIZE; + else + @{ + fprintf(stdout, "Enter password: "); + fgets(password, BUFFERSIZE, stdin); + *outlen = strlen(BUFFERSIZE); + @} + + return GSASL_OK; +@} +@end example + +In reality, the program should probably inhibit echo of the password +to the terminal, but that is left as an exercise for the reader. + +Now having implemented the callbacks, we are ready to replace the XXX +comment with real code that set the callbacks (@pxref{Callback +Functions}). The following does it. + +@example + gsasl_client_callback_authentication_id_set(ctx, callback_username); + gsasl_client_callback_authorization_id_set(ctx, callback_username); + gsasl_client_callback_password_set(ctx, callback_password); +@end example + +Notice that we use the same callback for the authentication identity +and the authorization identity. In reality, this may be too +simplistic, but will do for an example. + +The simple client is now complete, and will be able to support SASL +mechanisms such as PLAIN and CRAM-MD5. + +Implementing a server is very similar to the client, the only +difference is that you use gsasl_server_*() functions instead of +gsasl_client_*() and instead of implementing Gsasl_client_* callbacks +implement some Gsasl_server_* callbacks. See each mechanism +(@pxref{Mechanisms}) for details on which callbacks are required and +their prototype. + +A note for server authors is in place, on the optional initial client +output (discussed in section 5.1 of RFC 2222). In a server looking +similar to the code above, the first call to +@code{gsasl_server_step_base64} would have a @var{input} set to NULL. +The mechanisms interprete this as your protocol do not support initial +client output. If the protocol in which you implement SASL supports +initial client output, the first call to +@code{gsasl_server_step_base64} should include a real buffer with the +initial client data. + +One note for client authors is in place. The code above aborts +processing if `Libgsasl' did not come out of the loop with a GSASL_OK +exit code. It is a mistake to not require this, and instead only look +at what the server is sending you. Even if the server said you are +authenticated, it does not always mean that the SASL mechanism is +satisfied. This is specifically true for SASL client mechanisms which +perform server authentication. Thus, if you only trust what the +server replied instead of requireing a GSASL_OK result, you may open +up for fake servers. Don't shortcut the loop with a positive server +response. + +@c ********************************************************** +@c ******************* Mechanisms ************************* +@c ********************************************************** +@node Mechanisms +@chapter Mechanisms + +Different SASL mechanisms have different requirements on the +application using it. Some simpler mechanisms, such as LOGIN and +PLAIN, are straight forward to hook into existing authentication +systems (such as @file{/etc/passwd} via PAM). The client callback for +these mechanisms is easy to implement, the user is simply queried for +the username and password. The server callbacks pass on the username +and password into the policy deciding authentication system +(e.g. PAM). + +Other mechanism like CRAM-MD5, DIGEST-MD5, and SRP uses hashed +passwords. The client callback are the same as for PLAIN and LOGIN. +However, the server do not receive the plaintext password via the +network but rather a hash of it. Existing policy deciding systems +like PAM cannot handle this, so the server callback for these +mechanisms are more complicated. + +Further mechanisms like GSSAPI (Kerberos 5) assume a specific +authentication system. In theory this means that `Libgsasl' would not +need to interact with the application, but rather call this specific +authentication system directly. However, some callbacks are supported +anyway, to modify the behaviour of how the specific authentication +system is used. + +Special mechanisms like EXTERNAL and ANONYMOUS are entirely dependent +on callbacks. + +@menu +* EXTERNAL:: Authentication via out of band information. +* ANONYMOUS:: Mechanism for anonymous access to resources. +* PLAIN:: Clear text username and password. +* LOGIN:: Non-standard clear text username and password. +* CRAM-MD5:: Challenge-Response Authentication Mechanism. +* DIGEST-MD5:: Digest Authentication. +* NTLM:: Microsoft NTLM authentication. +* SECURID:: Authentication using tokens. +* GSSAPI:: GSSAPI (Kerberos 5) authentication. +@end menu + +@node EXTERNAL +@section The EXTERNAL mechanism + +The EXTERNAL mechanism is used to authenticate a user to SASL when +SASL is used in an environment which has already authenticated the +user. It is often used within TLS or IPSEC protected channels. + +This mechanism is only enabled in the server if you implement the +callback below and set them in the library (@pxref{Callback +Functions}). It is always enabled in the client as there are no +client callbacks. + +@deftypefn Prototype int (*Gsasl_server_callback_external) (Gsasl_session_ctx * @var{ctx}) + +@var{ctx}: libgsasl handle. + +Type of callback function the application implements. It should +return @code{GSASL_OK} if user is authenticated by out of band means, +otherwise @code{GSASL_AUTHENTICATION_ERROR}. + +@end deftypefn + +@node ANONYMOUS +@section The ANONYMOUS mechanism + +The ANONYMOUS mechanism is used to ``authenticate'' clients to +anonymous services; or rather just indicate that the client wishes to +use the service anonymously. The client sends a token, usually her +email address. + +This mechanism is only enabled in the client and server if you +implement the respectively callbacks below and set them in the library +(@pxref{Callback Functions}). + +@deftypefn Prototype int (*Gsasl_client_callback_anonymous) (Gsasl_session_ctx * @var{ctx}, char * @var{out}, size_t * @var{outlen}) + +@var{ctx}: libgsasl handle. + +@var{out}: output array with client token. + +@var{outlen}: on input the maximum size of the output array, on output +contains the actual size of the output array. + +Type of callback function the application implements. It should +populate the output array with some input from the user and set the +output array length, and return @code{GSASL_OK}, or fail with an error +code. + +If OUT is NULL, the function should only populate the output length +field with the length, and return GSASL_OK. This usage may be used by +the caller to allocate the proper buffer size. + +@end deftypefn + +@deftypefn Prototype int (*Gsasl_server_callback_anonymous) (Gsasl_session_ctx * @var{ctx}, const char * @var{token}) + +@var{ctx}: libgsasl handle. + +@var{ctx}: output array with client token. + +@var{ctx}: on input the maximum size of the output array, on output +contains the actual size of the output array. If OUT is + +Type of callback function the application implements. It should +return @code{GSASL_OK} if user should be permitted anonymous access, +otherwise @code{GSASL_AUTHENTICATION_ERROR}. + +@end deftypefn + +@node PLAIN +@section The PLAIN mechanism + +The PLAIN mechanism uses username (authentication identity and +authorization identity) and password to authenticate users. Two ways +of validating the user is provided, either by having the SASL +mechanism retrieve the raw password from the application and perform +the validation internally, or by calling the application with +authentication identity, authorization identity and password and let +it decide. If both the validating and the retrieving callbacks are +specified by the application, the validating one will be used. + +This mechanism is only enabled in the client and server if you +implement the respectively callbacks below and set them in the library +(@pxref{Callback Functions}). + +@include gsasl-callback-authorization.texi + +@include gsasl-callback-authentication.texi + +@include gsasl-callback-password.texi + +@include gsasl-callback-validate.texi + +@include gsasl-callback-retrieve.texi + + +@node LOGIN +@section The LOGIN mechanism + +The LOGIN mechanism uses username (authorization identity only) and +password to authenticate users. Two ways of validating the user is +provided, either by having the SASL mechanism retrieve the raw +password from the application and perform the validation internally, +or by calling the application with authorization identity and password +and let it decide. If both the validating and the retrieving +callbacks are specified by the application, the validating one will be +used. + +This mechanism is only enabled in the client and server if you +implement the respectively callbacks below and set them in the library +(@pxref{Callback Functions}). + +@include gsasl-callback-authorization.texi + +@include gsasl-callback-password.texi + +@include gsasl-callback-validate.texi + +@include gsasl-callback-retrieve.texi + +@node CRAM-MD5 +@section The CRAM-MD5 mechanism + +The CRAM-MD5 mechanism uses username (authorization identity only) and +password to authenticate users. Only a hashed password is transfered, +which means that you cannot use normal policy deciding authentication +systems such as PAM which do not support extraction of passwords. Two +ways of validating the user is provided, either by having the SASL +mechanism retrieve the raw password from the application and perform +the validation internally, or by calling the application with the +CRAM-MD5 challenge and response and let it decide. If both the +validating and the retrieving callbacks are specified by the +application, the validating one will be used. + +While not documented in the original CRAM-MD5 specification, this +implementation normalizes the username and the authorization identity +using the Unicode 3.2 NFKC form according to the proposed update of +CRAM-MD5. + +This mechanism is only enabled in the client and server if you +implement the respectively callbacks below and set them in the library +(@pxref{Callback Functions}). + +@include gsasl-callback-authorization.texi + +@include gsasl-callback-password.texi + +@include gsasl-callback-retrieve.texi + +@include gsasl-callback-cram-md5.texi + +@node DIGEST-MD5 +@section The DIGEST-MD5 mechanism + +The DIGEST-MD5 mechanism is based on the same cryptographic operation +as CRAM-MD5 but supports more features, such as an authorization +identity (proxy authentication) and cryptographic protection of data. +Like CRAM-MD5, only a hashed password is transfered, which means that +you cannot use e.g. PAM as a backend since it does not support +extraction of passwords. Two ways of validating the user is provided, +either by having the SASL mechanism retrieve the raw password from the +application and perform the validation internally, or by having the +SASL mechanism retrieve a hashed version of the secret. The advantage +of using the latter method is that you do not need to store plain text +user passwords on the server, but rather a one-way hash of the +username, realm and password. Still, this one-way hash of the secret +should be handled the same way as a clear text password. The +advantage is that if someone steals the one-way hash she cannot +immediately read users' password. If both the callbacks are specified +by the application, the one which retrieve the secret hash will be +used. + +While not documented in the original DIGEST-MD5 specification, this +implementation normalizes the username and the authentication identity +using the Unicode 3.2 NFKC form according to the proposed update of +DIGEST-MD5. + +This mechanism is only enabled in the client and server if you +implement the respectively callbacks below and set them in the library +(@pxref{Callback Functions}). + +@include gsasl-callback-authentication.texi + +@include gsasl-callback-authorization.texi + +@include gsasl-callback-password.texi + +@include gsasl-callback-client-service.texi + +@include gsasl-callback-retrieve.texi + +@include gsasl-callback-digest-md5.texi + +@node NTLM +@section The NTLM mechanism + +The NTLM mechanism uses username (authorization identity only) and +password to authenticate users. Only the client side is implemented. +This mechanism is only enabled in the client if you implement the +callbacks below and set them in the library (@pxref{Callback +Functions}). + +Note: Libntlm uses assert() in some places, it may thus crash your +client if it is given bad input. + +@include gsasl-callback-authorization.texi + +@include gsasl-callback-password.texi + +@node SECURID +@section The SECURID mechanism + +The SECURID mechanism uses authentication and authorization identity +and a passcode from a hardware token to authenticate users. This +mechanism is only enabled in the client and server if you implement +the respectively callbacks below and set them in the library +(@pxref{Callback Functions}). + +@include gsasl-callback-authentication.texi + +@include gsasl-callback-authorization.texi + +@include gsasl-callback-passcode.texi + +@include gsasl-callback-securid.texi + +@node GSSAPI +@section The GSSAPI mechanism + +The GSSAPI mechanism uses a framework similar to SASL for +authenticating the user. While GSSAPI can be implemented using many +techniques, libgsasl currently links with MIT's GSSAPI Kerberos 5 +library and is limited to Kerberos 5 only. The GSSAPI client +mechanism assumes the user acquired credentials (kerberos tickets) +before it is invoked (it will fail if this has not been done). The +client need (via callbacks) the name of the service and the name of +the user. The server needs the name of the service and a function +that authorizes a user. This mechanism is only enabled in the client +and server if you implement the respectively callbacks below and set +them in the library (@pxref{Callback Functions}). + +@include gsasl-callback-authentication.texi + +@include gsasl-callback-client-service.texi + +@include gsasl-callback-server-service.texi + +@include gsasl-callback-gssapi.texi + +@c ********************************************************** +@c ***************** Global Functions ********************* +@c ********************************************************** +@node Global Functions +@chapter Global Functions + +@include gsasl-api-global.texi + +@c ********************************************************** +@c ****************** Callback Functions ****************** +@c ********************************************************** +@node Callback Functions +@chapter Callback Functions +@cindex Callbacks + +@include gsasl-api-callback.texi + +@c ********************************************************** +@c ***************** Session Functions ******************** +@c ********************************************************** +@node Session Functions +@chapter Session Functions +@cindex SASL sessions + +@include gsasl-api-session.texi + +@c ********************************************************** +@c ******************* Utilities ************************** +@c ********************************************************** +@node Utilities +@chapter Utilities + +@include gsasl-api-utils.texi + +@c ********************************************************** +@c ******************* Errors **************************** +@c ********************************************************** +@node Error Handling +@chapter Error Handling +@cindex Error Handling + +Most functions in `Libgsasl' are returning an error if they fail. For +this reason, the application should always catch the error condition and +take appropriate measures, for example by releasing the resources and +passing the error up to the caller, or by displaying a descriptive +message to the user and cancelling the operation. + +Some error values do not indicate a system error or an error in the +operation, but the result of an operation that failed properly. + +@menu +* Error values:: A list of all error values used. +* Error strings:: How to get a descriptive string from a value. +@end menu + +@node Error values +@section Error values + +Errors are returned as an @code{int}. Except for the OK case an +application should always use the constants instead of their numeric +value. Applications are encouraged to use the constants even for OK +as it improves readability. Possible values are: + +@table @code +@item GSASL_OK +This value indicates success. The value of this error is guaranteed +to always be @code{0}. + +@end table + +@node Error strings +@section Error strings + +@include gsasl-api-error.texi + +@c ********************************************************** +@c *********************** Examples *********************** +@c ********************************************************** +@node Examples +@chapter Examples +@cindex Examples + +This chapter contains example code which illustrate how `Libgsasl' can +be used when writing your own application. + +@menu +* Example 1:: +@end menu + +@node Example 1 +@section Example 1 + +This is the minimal program which uses `Libgsasl' (including +internationalization features) without doing anything. + +@example +@include gsasl-example1.c +@end example + +@c ********************************************************** +@c ******************* Acknowledgements ******************* +@c ********************************************************** +@node Acknowledgements +@chapter Acknowledgements + +Simon Josefsson created the library autumn 2002 when he really should +have been studying mathematics. + +The makefiles, manuals, etc borrowed much from Libgcrypt written by +Werner Koch. + +Cryptographic functions for some SASL mechanisms uses Libgcrypt +written by Werner Koch. The NTLM mechanism uses Libntlm written by +Grant Edwards and uses code from Samba written by Andrew Tridgell. + +@c ********************************************************** +@c ******************* Appendices ************************* +@c ********************************************************** + +@node Copying This Manual +@appendix Copying This Manual + +@menu +* GNU Free Documentation License:: License for copying this manual. +@end menu + +@include fdl.texi + +@include lgpl.texi + +@include gpl.texi + +@node Concept Index +@unnumbered Concept Index + +@printindex cp + +@node Function and Data Index +@unnumbered Function and Data Index + +@printindex fn + +@summarycontents +@contents +@bye diff --git a/doc/lgpl.texi b/doc/lgpl.texi new file mode 100644 index 0000000..1f821eb --- /dev/null +++ b/doc/lgpl.texi @@ -0,0 +1,565 @@ +@node Library Copying +@appendix GNU LESSER GENERAL PUBLIC LICENSE + +@cindex LGPL, Lesser General Public License +@center Version 2.1, February 1999 + +@display +Copyright @copyright{} 1991, 1999 Free Software Foundation, Inc. +59 Temple Place -- Suite 330, Boston, MA 02111-1307, USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts +as the successor of the GNU Library Public License, version 2, hence the +version number 2.1.] +@end display + +@appendixsec Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software---to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software---typically libraries---of the Free +Software Foundation and other authors who decide to use it. You can use +it too, but we suggest you first think carefully about whether this +license or the ordinary General Public License is the better strategy to +use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of it +in new free programs; and that you are informed that you can do these +things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the @dfn{Lesser} General Public License because it +does @emph{Less} to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +``work based on the library'' and a ``work that uses the library''. The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + +@iftex +@appendixsec TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +@end iftex +@ifinfo +@center GNU LESSER GENERAL PUBLIC LICENSE +@center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +@end ifinfo + +@enumerate 0 +@item +This License Agreement applies to any software library or other program +which contains a notice placed by the copyright holder or other +authorized party saying it may be distributed under the terms of this +Lesser General Public License (also called ``this License''). Each +licensee is addressed as ``you''. + + A ``library'' means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The ``Library'', below, refers to any such software library or work +which has been distributed under these terms. A ``work based on the +Library'' means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term ``modification''.) + + ``Source code'' for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + +@item +You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + +@item +You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +@enumerate a +@item +The modified work must itself be a software library. + +@item +You must cause the files modified to carry prominent notices +stating that you changed the files and the date of any change. + +@item +You must cause the whole of the work to be licensed at no +charge to all third parties under the terms of this License. + +@item +If a facility in the modified Library refers to a function or a +table of data to be supplied by an application program that uses +the facility, other than as an argument passed when the facility +is invoked, then you must make a good faith effort to ensure that, +in the event an application does not supply such function or +table, the facility still operates, and performs whatever part of +its purpose remains meaningful. + +(For example, a function in a library to compute square roots has +a purpose that is entirely well-defined independent of the +application. Therefore, Subsection 2d requires that any +application-supplied function or table used by this function must +be optional: if the application does not supply it, the square +root function must still compute square roots.) +@end enumerate + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +@item +You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + +@item +You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + +@item +A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a ``work that uses the Library''. Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a ``work that uses the Library'' with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a ``work that uses the +library''. The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a ``work that uses the Library'' uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + +@item +As an exception to the Sections above, you may also combine or +link a ``work that uses the Library'' with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + +@enumerate a +@item +Accompany the work with the complete corresponding +machine-readable source code for the Library including whatever +changes were used in the work (which must be distributed under +Sections 1 and 2 above); and, if the work is an executable linked +with the Library, with the complete machine-readable ``work that +uses the Library'', as object code and/or source code, so that the +user can modify the Library and then relink to produce a modified +executable containing the modified Library. (It is understood +that the user who changes the contents of definitions files in the +Library will not necessarily be able to recompile the application +to use the modified definitions.) + +@item +Use a suitable shared library mechanism for linking with the Library. A +suitable mechanism is one that (1) uses at run time a copy of the +library already present on the user's computer system, rather than +copying library functions into the executable, and (2) will operate +properly with a modified version of the library, if the user installs +one, as long as the modified version is interface-compatible with the +version that the work was made with. + +@item +Accompany the work with a written offer, valid for at +least three years, to give the same user the materials +specified in Subsection 6a, above, for a charge no more +than the cost of performing this distribution. + +@item +If distribution of the work is made by offering access to copy +from a designated place, offer equivalent access to copy the above +specified materials from the same place. + +@item +Verify that the user has already received a copy of these +materials or that you have already sent this user a copy. +@end enumerate + + For an executable, the required form of the ``work that uses the +Library'' must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies the +executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + +@item +You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + +@enumerate a +@item +Accompany the combined library with a copy of the same work +based on the Library, uncombined with any other library +facilities. This must be distributed under the terms of the +Sections above. + +@item +Give prominent notice with the combined library of the fact +that part of it is a work based on the Library, and explaining +where to find the accompanying uncombined form of the same work. +@end enumerate + +@item +You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + +@item +You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + +@item +Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + +@item +If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +@item +If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + +@item +The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +``any later version'', you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + +@item +If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + +@iftex +@heading NO WARRANTY +@end iftex +@ifinfo +@center NO WARRANTY +@end ifinfo + +@item +BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY ``AS IS'' WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +@item +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. +@end enumerate + +@iftex +@heading END OF TERMS AND CONDITIONS +@end iftex +@ifinfo +@center END OF TERMS AND CONDITIONS +@end ifinfo + +@page +@appendixsec How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +``copyright'' line and a pointer to where the full notice is found. + +@smallexample +@var{one line to give the library's name and an idea of what it does.} +Copyright (C) @var{year} @var{name of author} + +This library is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at +your option) any later version. + +This library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, +USA. +@end smallexample + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a ``copyright disclaimer'' for the library, if +necessary. Here is a sample; alter the names: + +@smallexample +Yoyodyne, Inc., hereby disclaims all copyright interest in the library +`Frob' (a library for tweaking knobs) written by James Random Hacker. + +@var{signature of Ty Coon}, 1 April 1990 +Ty Coon, President of Vice +@end smallexample + +That's all there is to it! diff --git a/doc/specification/draft-burdis-cat-srp-sasl-06.txt b/doc/specification/draft-burdis-cat-srp-sasl-06.txt new file mode 100644 index 0000000..09da695 --- /dev/null +++ b/doc/specification/draft-burdis-cat-srp-sasl-06.txt @@ -0,0 +1,1848 @@ + + +Network Working Group K.R. Burdis +Internet-Draft Rhodes University +Expires: July 13, 2002 R. Naffah + Forge Research + January 12, 2002 + + + Secure Remote Password SASL Mechanism + draft-burdis-cat-srp-sasl-06 + +Status of this Memo + + This document is an Internet-Draft and is in full conformance with + all provisions of Section 10 of RFC2026. + + Internet-Drafts are working documents of the Internet Engineering + Task Force (IETF), its areas, and its working groups. Note that + other groups may also distribute working documents as + Internet-Drafts. + + Internet-Drafts are draft documents valid for a maximum of six + months and may be updated, replaced, or obsoleted by other documents + at any time. It is inappropriate to use Internet-Drafts as reference + material or to cite them other than as "work in progress." + + The list of current Internet-Drafts can be accessed at + http://www.ietf.org/ietf/1id-abstracts.txt. + + The list of Internet-Draft Shadow Directories can be accessed at + http://www.ietf.org/shadow.html. + + This Internet-Draft will expire on July 13, 2002. + +Copyright Notice + + Copyright (C) The Internet Society (2002). All Rights Reserved. + +Abstract + + This document describes a SASL mechanism based on the Secure Remote + Password protocol. This mechanism performs mutual authentication + and can provide a security layer with replay detection, integrity + protection and/or confidentiality protection. + + + + + + + + + +Burdis & Naffah Expires July 13, 2002 [Page 1] + +Internet-Draft SRP SASL Mechanism January 2002 + + +Table of Contents + + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3 + 2. Conventions Used in this Document . . . . . . . . . . . . . . 4 + 3. Data Element Formats . . . . . . . . . . . . . . . . . . . . . 5 + 3.1 Scalar numbers . . . . . . . . . . . . . . . . . . . . . . . . 5 + 3.2 Multi-Precision Integers . . . . . . . . . . . . . . . . . . . 5 + 3.3 Octet Sequences . . . . . . . . . . . . . . . . . . . . . . . 6 + 3.4 Extended Octet Sequences . . . . . . . . . . . . . . . . . . . 6 + 3.5 Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 + 3.6 Buffers . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 + 3.7 Data Element Size Limits . . . . . . . . . . . . . . . . . . . 7 + 4. Protocol Description . . . . . . . . . . . . . . . . . . . . . 8 + 4.1 Client sends its identity . . . . . . . . . . . . . . . . . . 9 + 4.2 Server sends initial protocol elements . . . . . . . . . . . . 9 + 4.3 Client sends its ephemeral public key . . . . . . . . . . . . 11 + 4.4 Server sends its ephemeral public key . . . . . . . . . . . . 11 + 4.5 Client sends its evidence . . . . . . . . . . . . . . . . . . 12 + 4.6 Server sends its evidence . . . . . . . . . . . . . . . . . . 13 + 5. Security Layer . . . . . . . . . . . . . . . . . . . . . . . . 14 + 5.1 Confidentiality Protection . . . . . . . . . . . . . . . . . . 15 + 5.2 Replay Detection . . . . . . . . . . . . . . . . . . . . . . . 16 + 5.3 Integrity Protection . . . . . . . . . . . . . . . . . . . . . 17 + 5.4 Summary of Security Layer Output . . . . . . . . . . . . . . . 17 + 6. Example . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 + 7. Discussion . . . . . . . . . . . . . . . . . . . . . . . . . . 22 + 7.1 Mandatory Algorithms . . . . . . . . . . . . . . . . . . . . . 22 + 7.2 Modulus and generator values . . . . . . . . . . . . . . . . . 22 + 7.3 Replay detection sequence number counters . . . . . . . . . . 22 + 7.4 SASL Profile Considerations . . . . . . . . . . . . . . . . . 23 + 8. Security Considerations . . . . . . . . . . . . . . . . . . . 25 + 9. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 26 + References . . . . . . . . . . . . . . . . . . . . . . . . . . 27 + Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . 29 + A. Modulus and Generator values . . . . . . . . . . . . . . . . . 30 + B. Changes since the previous draft . . . . . . . . . . . . . . . 32 + Full Copyright Statement . . . . . . . . . . . . . . . . . . . 33 + + + + + + + + + + + + + + +Burdis & Naffah Expires July 13, 2002 [Page 2] + +Internet-Draft SRP SASL Mechanism January 2002 + + +1. Introduction + + The Secure Remote Password (SRP) is a password-based, + zero-knowledge, authentication and key-exchange protocol developed + by Thomas Wu. It has good performance, is not plaintext-equivalent + and maintains perfect forward secrecy. It provides authentication + (optionally mutual authentication) and the negotiation of a session + key [SRP]. + + The mechanism described herein is based on the optimised SRP + protocol described at the end of section 3 in [RFC-2945], since this + reduces the total number of messages exchanged by grouping together + pieces of information that do not depend on earlier messages. Due + to the design of the mechanism, mutual authentication is MANDATORY. + + The SASL mechanism name associated with this protocol is "SRP". + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires July 13, 2002 [Page 3] + +Internet-Draft SRP SASL Mechanism January 2002 + + +2. Conventions Used in this Document + + o A hex digit is an element of the set: + + {0, 1, 2, 3, 4, 5, 6, 7, 8 , 9, A, B, C, D, E, F} + + A hex digit is the representation of a 4-bit string. Examples: + + 7 = 0111 + + A = 1010 + + o An octet is an 8-bit string. In this document an octet may be + written as a pair of hex digits. Examples: + + 7A = 01111010 + + 02 = 00000010 + + o All data is encoded and sent in network byte order (big-endian). + + o The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL + NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + [RFC-2119]. + + + + + + + + + + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires July 13, 2002 [Page 4] + +Internet-Draft SRP SASL Mechanism January 2002 + + +3. Data Element Formats + + This section describes the encoding of the data elements used by the + SASL mechanism described in this document. + +3.1 Scalar numbers + + Scalar numbers are unsigned quantities. Using b[k] to refer to the + k-th octet being processed, the value of a two-octet scalar is: + + ((b[0] << 8) + b[1]), + + where << is the bit left-shift operator. The value of a four-octet + scalar is: + + ((b[0] << 24) + (b[1] << 16) + (b[2] << 8) + b[3]). + +3.2 Multi-Precision Integers + + Multi-Precision Integers, or MPIs, are positive integers used to + hold large integers used in cryptographic computations. + + MPIs are encoded using a scheme inspired by that used by OpenPGP - + [RFC-2440] (section 3.2) - for encoding such entities: + + The encoded form of an MPI SHALL consist of two pieces: a + two-octet scalar that represents the length of the entity, in + octets, followed by a sequence of octets that contain the actual + integer. + + These octets form a big-endian number; A big-endian number can be + encoded by prefixing it with the appropriate length. + + Examples: (all numbers are in hexadecimal) + + The sequence of octets [00 01 01] encodes an MPI with the + value 1, while the sequence [00 02 01 FF] encodes an MPI with + the value of 511. + + Additional rule: + + * The length field of an encoded MPI describes the octet count + starting from the MPI's first non-zero octet, containing the + most significant non-zero bit. Thus, the encoding [00 02 01] + is not formed correctly; It should be [00 01 01]. + + We shall use the syntax mpi(A) to denote the encoded form of the + multi-precision integer A. Furthermore, we shall use the syntax + bytes(A) to denote the big-endian sequence of octets forming the + + +Burdis & Naffah Expires July 13, 2002 [Page 5] + +Internet-Draft SRP SASL Mechanism January 2002 + + + multi-precision integer with the most significant octet being the + first non-zero octet containing the most significant bit of A. + +3.3 Octet Sequences + + This mechanism generates, uses and exchanges sequences of octets; + e.g. output values of message digest algorithm functions. When such + entities travel on the wire, they shall be preceded by a one-octet + scalar quantity representing the count of following octets. + + We shall use the syntax os(s) to denote the encoded form of the + octet sequence. Furthermore, we shall use the syntax bytes(s) to + denote the sequence of octets s, in big-endian order. + +3.4 Extended Octet Sequences + + Extended sequences of octets are exchanged when using the security + layer. When these sequences travel on the wire, they shall be + preceded by a four-octet scalar quantity representing the count of + following octets. + + We shall use the syntax eos(s) to denote the encoded form of the + extended octet sequence. Furthermore, we shall use the syntax + bytes(s) to denote the sequence of octets s, in big-endian order. + +3.5 Text + + The only character set for text is the UTF-8 encoding [RFC-2279] of + Unicode characters [ISO-10646]. + + We shall use the syntax utf8(L) to denote the string L in UTF-8 + encoding, preceded by a two-octet scalar quantity representing the + count of following octets. Furthermore, we shall use the syntax + bytes(L) to denote the sequence of octets representing the UTF-8 + encoding of L, in big-endian order. + +3.6 Buffers + + In this SASL mechanism data is exchanged between the client and + server using buffers. A buffer acts as an envelope for the sequence + of data elements sent by one end-point of the exchange, and expected + by the other. + + A buffer MAY NOT contain other buffers. It may only contain zero, + one or more data elements. + + A buffer shall be encoded as two fields: a four-octet scalar + quantity representing the count of following octets, and the + concatenation of the octets of the data element(s) contained in the + + +Burdis & Naffah Expires July 13, 2002 [Page 6] + +Internet-Draft SRP SASL Mechanism January 2002 + + + buffer. + + We shall use the syntax {A|B|C} to denote a buffer containing A, B + and C in that order. For example: + + { mpi(N) | mpi(g) | utf8(L) } + + is a buffer containing, in the designated order, the encoded forms + of an MPI N, an MPI g and a Text L. + +3.7 Data Element Size Limits + + The following table details the size limit, in number of octets, for + each of the SASL data element encodings described earlier. + + Data element type Header Size limit in octets + (octets) (excluding header) + ------------------------------------------------------------ + Octet Sequence 1 255 + MPI 2 65,535 + Text 2 65,535 + Extended Octet Sequence 4 2,147,483,383 + Buffer 4 2,147,483,643 + + An implementation MUST signal an exception if any size constraint is + violated. + + + + + + + + + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires July 13, 2002 [Page 7] + +Internet-Draft SRP SASL Mechanism January 2002 + + +4. Protocol Description + + The following sections describe the sequence of data transmitted + between the client and server for the SRP SASL mechanism, as well as + the extra control information exchanged to enable a client to + request whether or not replay detection, integrity protection and/or + confidentiality protection should be provided by a security layer. + + Mechanism data exchanges, during the authentication phase, are shown + below: + + Client Server + + --- { utf8(U) | utf8(I) } ------------------------> + + <-------- { mpi(N) | mpi(g) | os(s) | utf8(L) } --- + + --- { mpi(A) | utf8(o) } -------------------------> + + <----------------------------------- { mpi(B) } --- + + --- { os(M1) } -----------------------------------> + + ( optionally ) + + <----------------------------------- { os(M2) } --- + + where: + + U is the authentication identity (username), + + I is the authorisation identity, + + N is the safe prime modulus, + + g is the generator, + + s is the user's password salt, + + L is the options list indicating available security services, + + A is the client's ephemeral public key, + + o is the options list indicating chosen security services, + + B is the server's ephemeral public key, + + M1 is the client's evidence that the shared key K is known, + + + +Burdis & Naffah Expires July 13, 2002 [Page 8] + +Internet-Draft SRP SASL Mechanism January 2002 + + + M2 is the server's evidence that the shared key K is known. + +4.1 Client sends its identity + + The client determines its authentication identity U and + authorisation identity I, encodes them and sends them to the server. + + The client sends: + + { utf8(U) | utf8(I) } + +4.2 Server sends initial protocol elements + + The server receives U, and looks up the safe prime modulus N, the + generator g, and the salt s to be used for that identity. + + The server also creates an options list L, which consists of a + comma-separated list of option strings that specify the options the + server supports. This options list MUST NOT be interpreted in a + case-sensitive manner, and whitespace characters MUST be ignored. + + The following option strings are defined: + + o "mda=" indicates that the server + supports the designated hash function as the underlying Message + Digest Algorithm for the designated user to be used for all SRP + calculations - to compute both client-side and server-side + digests. The specified algorithm MUST meet the requirements + specified in section 3.2 of [RFC-2945]: + + "Any hash function used with SRP should produce an output of + at least 16 bytes and have the property that small changes in + the input cause significant nonlinear changes in the output." + + Note that in the interests of interoperability between client and + server implementations and with other SRP-based tools, both the + client and the server MUST support SHA-160 as an underlying + Message Digest Algorithm. While the server is not required to + list SHA-160 as an available underlying Message Digest Algorithm, + it must be able to do so. + + o "integrity=HMAC-" indicates that the server supports + integrity protection using the HMAC algorithm [RFC-2104] with + as the underlying Message Digest Algorithm. + Acceptable MDA names are chosen from [SCAN] under the + MessageDigest section. A server SHOULD send such an option + string for each HMAC algorithm it supports. Note that in the + interest of interoperability, if the server offers integrity + protection it MUST, as a minimum, send the option string + + +Burdis & Naffah Expires July 13, 2002 [Page 9] + +Internet-Draft SRP SASL Mechanism January 2002 + + + "integrity=HMAC-SHA-160" since support for this algorithm is then + MANDATORY. + + o "replay detection" indicates that the server supports replay + detection using sequence numbers. Replay detection SHALL NOT be + activated without also activating integrity protection. If the + replay detection option is offered (by the server) and/or chosen + (by the client) without explicitely specifying an integrity + protection option, then the default integrity protection option + "integrity=HMAC-SHA-160" is implied and shall be activated. + + o "confidentiality=" indicates that the server + supports confidentiality protection using the symmetric block + cipher algorithm . The server SHOULD send such an + option string for each confidentiality protection algorithm it + supports. Note that in the interest of interoperability, if the + server offers confidentiality protection, it MUST send the option + string "confidentiality=aes" since it is then MANDATORY for it to + provide support for this algorithm. (Rijndael [RIJNDAEL] is + synonymous with AES [AES].) + + o "mandatory=[integrity|replay detection|confidentiality]" is an + option only available to the server that indicates that the + specified security layer option is MANDATORY and MUST be chosen + by the client for use in the resulting security layer. If a + server specifies an option as mandatory in this way, it MUST + abort the connection if the specified option is not chosen by the + client. It doesn't make sense for the client to send this option + since it is only able to choose options that the server + advertises. The client SHOULD abort the connection if the server + does not offer an option that it requires. If this option is not + specified then this implies that no options are mandatory. + + o "maxbuffersize=" indicates to the peer the + maximum number of raw bytes (excluding the SASL buffer 4-byte + length header) to be processed by the security layer at a time, + if one is negotiated. The value of MUST NOT + exceed the Buffer size limit defined in section 3.7. If this + option is not detected by a client or server mechanism, then it + shall operate its security layer on the assumption that the + maximum number of bytes that may be sent, to the peer server or + client mechanism respectively, is the Buffer data size limit + indicated in section 3.7. On the other hand, if a recipient + detects this option, it shall break any octet-sequence longer + than the designated limit into two or more fragments, each + wrapped in a SASL buffer, before sending them, in sequence, to + the peer. + + For example, if the server supports integrity protection using the + + +Burdis & Naffah Expires July 13, 2002 [Page 10] + +Internet-Draft SRP SASL Mechanism January 2002 + + + HMAC-SHA-160 and HMAC-MD5 algorithms, replay detection and no + confidentiality protection, the options list would be: + + mda=SHA-1,integrity=HMAC-SHA-160,integrity=HMAC-MD5,replay + detection + + The server sends: + + { mpi(N) | mpi(g) | os(s) | utf8(L) } + +4.3 Client sends its ephemeral public key + + The client receives the options list L from the server that + specifies the Message Digest Algorithm(s) available to be used for + all SRP calculations, the security service options the server + supports, and the maximum buffer size the server can handle. The + client selects options from this list and creates a new options list + o that specifies the selected Message Digest Algorithm to be used + for SRP calculations and the security services that will be used in + the security layer. At most one available Message Digest Algorithm + name, one available integrity protection algorithm and one available + confidentiality protection algorithm may be selected. The client + MUST include any option specified by the mandatory option. + + The client generates its ephemeral public key A as follows: + + a = prng(); + + A = g**a % N; + + where: + + prng() is a random number generation function, + + a is the MPI that will act as the client's private key, + + ** is the exponentiation operator, + + % is the modulus operator, + + The client sends: + + { mpi(A) | utf8(o) } + +4.4 Server sends its ephemeral public key + + The server reads the client's verifier v, calculates the shared + context key K and generates its ephemeral public key B as follows: + + + +Burdis & Naffah Expires July 13, 2002 [Page 11] + +Internet-Draft SRP SASL Mechanism January 2002 + + + b = prng(); + + B = (v + g**b) % N; + + K = H2((A * v**u) ** b % N); + + where: + + b is the MPI that will act as the server's private key, + + v is the stored password verifier value, + + u is a 32-bit unsigned integer which takes its value from the + first 32 bits of the hash of B, MSB first, + + H2() is the "Interleaved SHA" function, as described in + [RFC-2945], but generalised to any message digest algorithm, and + applied using the underlying Message Digest Algorithm (see + Section 4.2). + + The server sends: + + { mpi(B) } + +4.5 Client sends its evidence + + The client calculates the shared context key K, and calculates the + evidence M1 that proves to the server that it knows the shared + context key K, including I and L as part of the calculation. K, on + the client's side is computed as follows: + + x = H(s | H(U | ":" | p)); + + K = H2((B - g**x) ** (a + u * x) % N); + + where: + + H() is the result of digesting the designated input/data with the + underlying Message Digest Algorithm function (see Section 4.2). + + p is the password value. + + M1 is computed as: + + + + + + + + +Burdis & Naffah Expires July 13, 2002 [Page 12] + +Internet-Draft SRP SASL Mechanism January 2002 + + + H( bytes(H( bytes(N) )) ^ bytes( H( bytes(g) )) + | bytes(H( bytes(U) )) + | bytes(s) + | bytes(A) + | bytes(B) + | bytes(K) + | bytes(H( bytes(I) ) + | bytes(H( bytes(L) )) + ) + + where: + + ^ is the bitwise XOR operator. + + The client sends: + + { os(M1) } + +4.6 Server sends its evidence + + When the Confidentiality Protection service is requested and + approved, the server MUST NOT send M2 but instead conclude the SASL + exchange with the reception and verification of the client's M1. + Otherwise, M2 MUST be sent. + + When the server has to send its evidence M2, which proves to the + client that it knows the shared context key K, as well as U, I and + o, it shall compute it as follows: + + H( bytes(A) + | bytes(M1) + | bytes(K) + | bytes(H( bytes(U) )) + | bytes(H( bytes(I) )) + | bytes(H( bytes(o) )) + ) + + The server OPTIONALLY sends: + + { os(M2) } + + + + + + + + + + + +Burdis & Naffah Expires July 13, 2002 [Page 13] + +Internet-Draft SRP SASL Mechanism January 2002 + + +5. Security Layer + + Depending on the options offered by the server and specified by the + client, the security layer may provide integrity protection, replay + detection, and/or confidentiality protection. + + The security layer can be thought of as a three-stage filter through + which the data flows from the output of one stage to the input of + the following one. The first input is the original data, while the + last output is the data after being subject to the transformations + of this filter. + + The data always passes through this three-stage filter, though any + of the stages may be inactive. Only when a stage is active would + the output be different from the input. In other words, if a stage + is inactive, the octet sequence at the output side is an exact + duplicate of the same sequence at the input side. + + Schematically, the three-stage filter security layer appears as + follows: + + +----------------------------+ + | | I/ p1 + p1 --->| Confidentiality protection |---+ + | | | A/ c + +----------------------------+ | + | + +------------------------------------+ + | + | +----------------------------+ + | | | I/ p2 + p2 +-->| Replay detection |---+ + | | | A/ p2 | q + +----------------------------+ | + | + +------------------------------------+ + | + | +----------------------------+ + | | | I/ p3 + p3 +-->| Integrity protection |---> + | | A/ p3 | C + +----------------------------+ + + where: + + p1, p2 and p3 are the input octet sequences at each stage, + + I/ denotes the output at the end of one stage if/when the stage + is inactive or disabled, + + +Burdis & Naffah Expires July 13, 2002 [Page 14] + +Internet-Draft SRP SASL Mechanism January 2002 + + + A/ denotes the output at the end of one stage if/when the stage + is active or enabled, + + c is the encrypted (sender-side) or decrypted (receiver-side) + octet sequence. c1 shall denote the value computed by the + sender, while c2 shall denote the value computed by the receiver. + + q is a four-octet scalar quantity representing a sequence number, + + C is the Message Authentication Code. C1 shall denote the value + of the MAC as computed by the sender, while C2 shall denote the + value computed by the receiver. + + The following paragraphs detail each of the transformations + mentioned above. + +5.1 Confidentiality Protection + + The plaintext data octet sequence p1 is encrypted using the chosen + confidentiality algorithm (CALG) initialised for encryption with the + shared context key K. + + c1 = CALG(K, ENCRYPTION)( bytes(p1) ) + + On the receiving side, the ciphertext data octet sequence p1 is + decrypted using the chosen confidentiality algorithm (CALG) + initialised for decryption, with the shared context key K. + + c2 = CALG(K, DECRYPTION)( bytes(p1) ) + + The designated CALG block cipher should be used in OFB (Output + Feedback Block) mode in the ISO variant, as described in [HAC], + algorithm 7.20. + + Let k be the block size of the chosen symmetric cipher algorithm; + e.g. for AES this is 128 bits or 16 octets. The OFB mode used shall + be of length/size k. + + It is recommended that Block ciphers operating in OFB mode be used + with an Initial Vector (the mode's IV). For the SASL mechanism + described in this document, the IV shall be an all-zero octet + sequence of size k. + + In such a mode of operation - OFB with key re-use - the IV, which + need not be secret, must be changed. Otherwise an identical + keystream results; and, by XORing corresponding ciphertexts, an + adversary may reduce cryptanalysis to that of a running-key cipher + with one plaintext as the running key. To counter the effect of + fixing the IV to an all-zero octet sequence, the sender should use a + + +Burdis & Naffah Expires July 13, 2002 [Page 15] + +Internet-Draft SRP SASL Mechanism January 2002 + + + one k-octet sequence as the value of its first block, constructed as + follows: + + o the first (most significant) (k-2) octets are random, + + o the octets at position #k-1 and #k, assuming the first octet is + at position #1, are exact copies of those at positions #1 and #2 + respectively. + + The input data to the confidentiality protection algorithm shall be + a multiple of the symmetric cipher block size k. When the input + length is not a multiple of k octets, the data shall be padded + according to the following scheme (described in [PKCS7] which itself + is based on [RFC-1423]): + + Assuming the length of the input is l octets, (k - (l mod k)) + octets, all having the value (k - (l mod k)), shall be appended + to the original data. In other words, the input is padded at the + trailing end with one of the following sequences: + + 01 -- if l mod k = k-1 + 02 02 -- if l mod k = k-2 + ... + ... + ... + k k ... k k -- if l mod k = 0 + + The padding can be removed unambiguously since all input is + padded and no padding sequence is a suffix of another. This + padding method is well-defined if and only if k < 256 octets, + which is the case with symmetric block ciphers today, and in the + forseeable future. + + The output of this stage, when it is active, is: + + at the sending side: CALG(K, ENCRYPT)( bytes(p1) ) + + at the receiving side: CALG(K, DECRYPT)( bytes(p1) ) + + If the receiver, after decrypting the first block, finds that the + last two octets do not match the value of the first two, it MUST + signal an exception and abort the exchange. + +5.2 Replay Detection + + A sequence number q is incremented every time a message is sent to + the peer. + + The output of this stage, when it is active, is: + + +Burdis & Naffah Expires July 13, 2002 [Page 16] + +Internet-Draft SRP SASL Mechanism January 2002 + + + p2 | q + + At the other end, the receiver increments its copy of the sequence + number. This new value of the sequence number is then used in the + integrity protection transformation, which must also be active as + described in Section 4.2. See Section 7.3 for more details. + +5.3 Integrity Protection + + When the Integrity Protection stage is active, a message + authentication code C is computed using the chosen integrity + protection algorithm (IALG) as follows: + + o the IALG is initialised (once) with the shared context key K, + + o the IALG is updated with every exchange of the sequence p3, + yielding the value C and a new IALG context for use in the + following exchange. + + At the other end, the receiver computes its version of C, using the + same transformation, and checks that its value is equal to that + received. If the two values do not agree, the receiver must signal + an exception and abort. + + The output of this stage, when it is active, is then: + + IALG(K)( bytes(p3) ) + +5.4 Summary of Security Layer Output + + The following table shows the data exchanged by the security layer + peers, depending on the possible legal combinations of the three + security services in operation: + + CP IP RD Peer sends/receives + + I I I { eos(p) } + I A I { eos(p) | os( IALG(K)( bytes(p) ) ) } + I A A { eos(p) | os( IALG(K)( bytes(p) | bytes(q)) ) } + A I I { eos(c) } + A A I { eos(c) | os( IALG(K)( bytes(c) ) ) } + A A A { eos(c) | os( IALG(K)((bytes(c) | bytes(q)) ) } + + where + + CP Confidentiality protection, + + IP Integrity protection, + + + +Burdis & Naffah Expires July 13, 2002 [Page 17] + +Internet-Draft SRP SASL Mechanism January 2002 + + + RD Replay detection, + + I Security service is Inactive/disabled, + + A Security service is Active/enabled, + + p The original plaintext, + + q The sequence number. + + c The enciphered input obtained by either: + + CALG(K, ENCRYPT)( bytes(p) ) at the sender's side, or + + CALG(K, DECRYPT)( bytes(p) ) at the receiver's side + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires July 13, 2002 [Page 18] + +Internet-Draft SRP SASL Mechanism January 2002 + + +6. Example + + The example below uses SMTP authentication [RFC-2554]. The base64 + encoding of challenges and responses, as well as the reply codes + preceding the responses are part of the SMTP authentication + specification, not part of this SASL mechanism itself. + + "C:" and "S:" indicate lines sent by the client and server + respectively. + + + S: 220 smtp.example.com ESMTP server ready + + C: EHLO zaau.example.com + + S: 250-smtp.example.com + S: 250 AUTH SRP CRAM-MD5 DIGEST-MD5 + + C: AUTH SRP AAAADAAEdGVzdAAEdGVzdA== + + with: + + U = "test" + + I = "test" + + S: 334 AAABygEArGvbQTJKmpvxZt5eE4lYL69ytmUZh+4H/DGSlD21YFCjcynLtKCZ7Y + GT4HV3Z6E91SMSq0sDMQ3Nf0ip2gT9UOgIOWntt2ewz2CVF5oWOrNmGgX71fqq6CkYqZY + vC5O4Vfl5k+yXXuqoDXQK2/T/dHNZ0EHVwz6nHSgeRGsUdzvKl7Q6I/uAFna9IHpDbGSB + 8dK5B4cXRhpbnTLmiPh3SFRFI7UksNV9Xqd6J3XS7PoDLPvb9S+zeGFgJ5AE5Xrmr4dOc + wPOUymczAQce8MI2CpWmPOo0MOCca41+Onb+7aUtcgD2J965DXeI21SX1R1m2XjcvzWjv + IPpxEfnkr/cwABAgqsi3AvmIqdEbREALhtZGE9U0hBLTEsbWFuZGF0b3J5PXJlcGxheSB + kZXRlY3Rpb24scmVwbGF5IGRldGVjdGlvbixpbnRlZ3JpdHk9aG1hYy1zaGExLGludGVn + cml0eT1obWFjLW1kNSxjb25maWRlbnRpYWxpdHk9YWVzLGNvbmZpZGVudGlhbGl0eT1jY + XN0NSxjb25maWRlbnRpYWxpdHk9Ymxvd2Zpc2gsbWF4YnVmZmVyc2l6ZT0yMTQ3NDgzNj + Qz + + with: + + N = "2176617445861743577319100889180275378190766837425553851114464 + 322468988623538384095721090901308605640157139971723580726658164960 + 647214841029141336415219736447718088739565548373811507267740223510 + 176252190156982074029314952962041933326626207347105454836873603951 + 970248622650624886106025697180298495356112144268015766800076142998 + 822245709041387397397017192709399211475176516806361476111961547623 + 342209644278311797123637164733387141433589577347466730896705080700 + 550932042479967841703686792831676127227423031406754829113358247958 + 306143957755934710196177140617368437852270348349533703765500675132 + 8447510550299250924469288819" + + +Burdis & Naffah Expires July 13, 2002 [Page 19] + +Internet-Draft SRP SASL Mechanism January 2002 + + + g = "2" + + s = "814819216327401865851972" + + L = "mda=SHA-1,mandatory=replay detection,replay detection,integri + ty=hmac-sha1,integrity=hmac-md5,confidentiality=aes,confidentialit + y=cast5,confidentiality=blowfish,maxbuffersize=2147483643" + + C: AAABYwEAAp5q/4zhXoTUzXBscozN97SWgfDcAImIk3lNHNvd0b+Dr7jEm6upXblZT5 + sL9mPgFsejlIh+B/eCu/HvzWCrXj6ylPZv8dy3LCH3LIORqQ45S7Lsbmrrg/dukDh4tZC + JMLD4r3evzaY8KVhtJeLMVbeXuh4JljKP42Ll59Lzwf8jfPh4+4Lae1rpWUCL9DueKcY+ + nN+xNHTit/ynLATxwL93P6+GoGY4TkUbUBfjiI1+rAMvyMDMw5XozGy07FOEc++U0iPeX + CQP4MT5FipOUoz8CYX7J1LbaXp2WJuFHlkyVXF7oCoyHbhld/5CfR3o6q/B/x9+yZRqaH + H+JfllOgBfbWRhPVNIQS0xLHJlcGxheSBkZXRlY3Rpb24saW50ZWdyaXR5PWhtYWMtbWQ + 1LGNvbmZpZGVudGlhbGl0eT1ibG93ZmlzaCxtYXhidWZmZXJzaXplPTIxNDc0ODM2NDM= + + with: + + A = "3305954184671210249746312321130434202193449637258786928151596 + 956582377798844627774788503949777445537469304518958156158884050562 + 780707370878253753979367019077142882237029766166623275718227655538 + 983419084032208109159908908194732453790761392470705815003778027907 + 762317939621437864117925167600301024366036210465417293966890613394 + 379900527412007068242559299422872893332111365840536495185883474232 + 883537338757318836995637988160638089067541196607366511069220022940 + 355334703015419992745572006667033895314817945166254757418442215980 + 634933876533189969562613241499465295849832999091403980813218409496 + 06581251320320995783959866" + + o = mda=SHA-1,replay detection,integrity=hmac-md5,confidentiality= + blowfish,maxbuffersize=2147483643" + + S: 334 AAABAgEAOUKbXpnzMhziivGgMwm+FS8sKGSvjh5M3D+80RF/5z9rm0oPoi4+pF + 83fueWn4Hz9M+muF/22PHHZkHtlutDrtapj4OtirdxC21fS9bMtEh3F0whTX+3mPvthw5 + sk11turandHiLvcUZOgcrAGIoDKcBPoGyBud+8bMgpkf/uGfyBM2nEX/hV+oGggX+LiHj + mkxAJ3kewfQPH0eV9ffEuuyu8BUcBXkJsS6l7eWkuERSCttVOi/jS031c+CD/nuecUXYi + F8IYzW03rbcwYhZzifmTi3VK9C8zG2K1WmGU+cDKlZMkyCPMmtCsxlbgE8zSHCuCiOgQ3 + 5XhcA0Qa0C3Q== + + with: + + B: "72284284756503184420540308728542442858927345812975023176601544 + 656078275298532392401181852634926172435239161066586969655965268585 + 300845435562962039149169549800169184521786717633959469278439877134 + 444500243257950929211559843568506288263176079641655456298084758961 + 983258355079013195569295114214721321849903652130596549627218189966 + 140113906545856088040473723048909402258929560823932725202215411408 + 791389541192767670707304028113609680668175826522120988223747234163 + 643404100201722157739343027946790344246999996116789730443114919539 + + +Burdis & Naffah Expires July 13, 2002 [Page 20] + +Internet-Draft SRP SASL Mechanism January 2002 + + + 575466941344964841591072763617954717789621871251710891793993491944 + 52686682517183909017223901" + + C: AAAAFRTkoju6xGP+zH89iaDWIFjfIKt5Kg== + + S: 235 Authentication successful. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires July 13, 2002 [Page 21] + +Internet-Draft SRP SASL Mechanism January 2002 + + +7. Discussion + +7.1 Mandatory Algorithms + + The algorithms specified as mandatory were chosen for utility and + availablity. We felt that a mandatory confidentiality and integrity + protection algorithm for the security layer and a mandatory Message + Digest Algorithm for SRP calculations should be specified to ensure + interoperability between implementations of this mechanism: + + o The SHA-160 Message Digest Algorithm was chosen as an underlying + algorithm for SRP calculations because this allows for easy + interoperability with other SRP-based tools that use the SRP-SHA1 + protocol described in section 3 of [RFC-2945] and create their + password files using this algorithm. + + o The HMAC algorithm was chosen as an integrity algorithm because + it is faster than MAC algorithms based on secret key encryption + algorithms [RFC-2847]. + + o Rijndael was chosen as a cipher because it has undergone thorough + scrutiny by the best cryptographers in the world and was chosen + ahead of many other algorithms as the Advanced Encryption + Standard. + + Since confidentiality protection is optional, this mechanism should + be usable in countries that have strict controls on the use of + cryptography. + +7.2 Modulus and generator values + + It is RECOMMENDED that the server use values for the modulus (N) and + generator (g) chosen from those listed in Appendix A so that the + client can avoid expensive constraint checks, since these predefined + values already meet the constraints described in [RFC-2945]: + + "For maximum security, N should be a safe prime (i.e. a number of + the form N = 2q + 1, where q is also prime). Also, g should be a + generator modulo N (see [SRP] for details), which means that for + any X where 0 < X < N, there exists a value x for which g**x % N + == X." + +7.3 Replay detection sequence number counters + + The mechanism described in this document allows the use of a Replay + Detection security service that works by including sequence number + counters in the message authentication code (MAC) created by the + Integrity Protection service. As noted in Section 4.2 integrity + protection is always activated when the Replay Detection service is + + +Burdis & Naffah Expires July 13, 2002 [Page 22] + +Internet-Draft SRP SASL Mechanism January 2002 + + + activated. + + Both the client and the server keep two sequence number counters. + Each of these counters is a 32-bit unsigned integer initialised with + a Starting Value and incremented by an Increment Value with every + successful transmission of an SASL buffer through the security + layer. The Sent counter is incremented for each buffer sent through + the security layer. The Received counter is incremented for each + buffer received through the security layer. If the value of a + sequence number counter exceeds 2**32 it wraps around and starts + from zero again. + + When a sender sends a buffer it includes the value of its Sent + counter in the computation of the MAC accompanying each integrity + protected message. When a recipient receives a buffer it uses the + value of it's Received counter in its computation of the integrity + protection MAC for the received message. The recipient's Received + counter must be the same as the sender's Sent counter in order for + the received and computed MACs to match. + + This specification assumes that for each sequence number counter the + Starting Value is ZERO, and that the Increment Value is ONE. These + values do not affect the security or the intended objective of the + replay detection service, since they never travel on the wire. + +7.4 SASL Profile Considerations + + As mentioned briefly in [RFC-2222], and detailed in [SASL] a SASL + specification has three layers: (a) a protocol definition using SASL + known as the "Profile", (b) a SASL mechanism definition, and (c) the + SASL framework. + + Point (3) in section 5 of [SASL] ("Protocol profile requirements") + clearly states that it is the responsibility of the Profile to + define "...how the challenges and responses are encoded, how the + server indicates completion or failure of the exchange, how the + client aborts an exchange, and how the exchange method interacts + with any line length limits in the protocol." + + The username entity, referenced as "U" throughout this document, and + used by the server to locate the password data, is assumed to travel + "in the clear," meaning that no transformation is applied to its + contents. This assumption was made to allow the same SRP password + files to be used in this mechanism, as those used with other SRP + applications and tools. + + A Profile may decide, for privacy or other reason, to disallow such + information to travel in the clear, and instead use a hashed version + of U, or more generally a transformation function applied to U; i.e. + + +Burdis & Naffah Expires July 13, 2002 [Page 23] + +Internet-Draft SRP SASL Mechanism January 2002 + + + f(U). Such a Profile would require additional tools to add the + required entries to the SRP password files for the new value(s) of + f(U). It is worth noting too that if this is the case, and the same + user shall access the server through this mechanism as well as + through other SRP tools, then at least two entries, one with U and + the other with f(U) need to be present in the SRP password files if + those same files are to be used for both types of access. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires July 13, 2002 [Page 24] + +Internet-Draft SRP SASL Mechanism January 2002 + + +8. Security Considerations + + This mechanism relies on the security of SRP, which bases its + security on the difficulty of solving the Diffie-Hellman problem in + the multiplicative field modulo a large safe prime. See section 4 + "Security Considerations" of [RFC-2945] and section 4 "Security + analysis" of [SRP]. + + B, the server's ephemeral public key, is computed as g**b + v = g**b + + g**x, which is symmetric and allows two guesses per *active + attack*. In practical terms, this makes no difference to the + security of SRP, since the number of active attacks needed is still + linearly proportional to the number of guesses needed; only the + constant factor (2 vs. 1) has changed. + + This mechanism also relies on the security of the HMAC algorithm and + the underlying hash function when integrity protection is used. + Section 6 "Security" of [RFC-2104] discusses these security issues + in detail. Weaknesses found in MD5 do not impact HMAC-MD5 + [DOBBERTIN]. + + U, A, I and o, sent from the client to the server, and N, g, L, s + and B, sent from the server to the client could be modified by an + attacker before reaching the other party. For this reason, these + values are included in the respective calculations of evidence (M1 + and M2) to prove that each party knows the session key K. This + allows each party to verify that these values were received + unmodified. + + The use of integrity protection is RECOMMENDED to detect message + tampering and to avoid session hijacking after authentication has + taken place. + + Replay attacks may be avoided through the use of sequence numbers, + because sequence numbers make each integrity protected message + exchanged during a session different, and each session uses a + different key. + + Research [KRAWCZYK] shows that the order and way of combining + message encryption (Confidentiality Protection) and message + authentication (Integrity Protection) are important. This mechanism + follows the EtA (encrypt-then-authenticate) method and is + "generically secure." + + + + + + + + +Burdis & Naffah Expires July 13, 2002 [Page 25] + +Internet-Draft SRP SASL Mechanism January 2002 + + +9. Acknowledgements + + The following people provided valuable feedback in the preparation + of this document: + + Stephen Farrell + + Timothy Martin + + Ken Murchison + + Magnus Nystrom + + Thomas Wu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires July 13, 2002 [Page 26] + +Internet-Draft SRP SASL Mechanism January 2002 + + +References + + [AES] National Institute of Standards and Technology, + "Rijndael: NIST's Selection for the AES", December + 2000, + . + + [DOBBERTIN] Dobbertin, H., "The Status of MD5 After a Recent + Attack", December 1996, + . + + [HAC] Menezes, A.J., van Oorschot, P.C. and S.A. Vanstone, + "Handbook of Applied Cryptography", CRC Press, Inc., + ISBN 0-8493-8523-7, 1997, + . + + [ISO-10646] "International Standard --Information technology-- + Universal Multiple-Octet Coded Character Set (UCS) -- + Part 1 Architecture and Basic Multilingual Plane", + ISO/IEC 10646-1, 1993. + + [KRAWCZYK] Krawczyk, H., "The order of encryption and + authentication for protecting communications (Or: how + secure is SSL?)", June 2001, + . + + [PKCS7] RSA Data Security, Inc., "PKCS #7: Cryptographic + Message Syntax Standard", Version 1.5, November 1993, + . + + [RFC-1423] Balenson, D., "Privacy Enhancement for Internet + Electronic Mail: Part III: Algorithms, Modes, and + Identifiers", RFC 1423, February 1993, + . + + [RFC-2104] Krawczyk, H. et al, "HMAC: Keyed-Hashing for Message + Authentication", RFC 2104, February 1997, + . + + [RFC-2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 0014, RFC 2119, March 1997, + . + + [RFC-2222] Myers, J.G., "Simple Authentication and Security Layer + (SASL)", RFC 2222, October 1997, + . + + + +Burdis & Naffah Expires July 13, 2002 [Page 27] + +Internet-Draft SRP SASL Mechanism January 2002 + + + [RFC-2279] Yergeau, F., "UTF-8, a transformation format of Unicode + and ISO 10646", RFC 2279, January 1998, + . + + [RFC-2440] Callas, J., Donnerhacke, L., Finney, H. and R. Thayer, + "OpenPGP Message Format", RFC 2440, November 1998, + . + + [RFC-2554] Myers, J.G., "SMTP Service Extension for + Authentication", RFC 2554, March 1999. + + [RFC-2629] Rose, M., "Writing I-Ds and RFCs using XML", RFC 2629, + June 1999, + . + + [RFC-2847] Eisler, M., "LIPKEY - A Low Infrastructure Public Key + Mechanism Using SPKM", RFC 2847, June 2000, + . + + [RFC-2945] Wu, T., "The SRP Authentication and Key Exchange + System", RFC 2945, September 2000, + . + + [RIJNDAEL] Daemen, Joan and Vincent Rijmen, "AES Proposal: + Rijndael", September 1999, + . + + [SASL] Myers, J.G., "Simple Authentication and Security Layer + (SASL)", April 2001, + . + + [SCAN] Hopwood, D., "Standard Cryptographic Algorithm Naming", + June 2000, + . + + [SRP] Wu, T., "The Secure Remote Password Protocol", March + 1998, + . + + [SRP'] Wu, T., "SRP: The Open Source Password Authentication + Standard", March 1998, + . + + + + + + + + +Burdis & Naffah Expires July 13, 2002 [Page 28] + +Internet-Draft SRP SASL Mechanism January 2002 + + +Authors' Addresses + + Keith Burdis + Rhodes University + Computer Science Department + Grahamstown 6139 + ZA + + EMail: keith@rucus.ru.ac.za + + + Raif S. Naffah + Forge Research Pty. Limited + Suite 116, Bay 9 + Locomotive Workshop, + Australian Technology Park + Cornwallis Street + Eveleigh, NSW 1430 + AU + + EMail: raif@forge.com.au + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires July 13, 2002 [Page 29] + +Internet-Draft SRP SASL Mechanism January 2002 + + +Appendix A. Modulus and Generator values + + Modulus (N) and generator (g) values for various modulus lengths are + given below. In each case the modulus is a large safe prime and the + generator is a primitve root of GF(n) [RFC-2945]. These values are + taken from software developed by Tom Wu and Eugene Jhong for the + Stanford SRP distribution [SRP']. + + + [264 bits] + Modulus (base 16) = + 115B8B692E0E045692CF280B436735C77A5A9E8A9E7ED56C965F87DB5B2A2ECE + 3 + Generator = 2 + + [384 bits] + Modulus (base 16) = + 8025363296FB943FCE54BE717E0E2958A02A9672EF561953B2BAA3BAACC3ED57 + 54EB764C7AB7184578C57D5949CCB41B + Generator = 2 + + [512 bits] + Modulus (base 16) = + D4C7F8A2B32C11B8FBA9581EC4BA4F1B04215642EF7355E37C0FC0443EF756EA + 2C6B8EEB755A1C723027663CAA265EF785B8FF6A9B35227A52D86633DBDFCA43 + Generator = 2 + + [640 bits] + Modulus (base 16) = + C94D67EB5B1A2346E8AB422FC6A0EDAEDA8C7F894C9EEEC42F9ED250FD7F0046 + E5AF2CF73D6B2FA26BB08033DA4DE322E144E7A8E9B12A0E4637F6371F34A207 + 1C4B3836CBEEAB15034460FAA7ADF483 + Generator = 2 + + [768 bits] + Modulus (base 16) = + B344C7C4F8C495031BB4E04FF8F84EE95008163940B9558276744D91F7CC9F40 + 2653BE7147F00F576B93754BCDDF71B636F2099E6FFF90E79575F3D0DE694AFF + 737D9BE9713CEF8D837ADA6380B1093E94B6A529A8C6C2BE33E0867C60C3262B + Generator = 2 + + [1024 bits] + Modulus (base 16) = + EEAF0AB9ADB38DD69C33F80AFA8FC5E86072618775FF3C0B9EA2314C9C256576 + D674DF7496EA81D3383B4813D692C6E0E0D5D8E250B98BE48E495C1D6089DAD1 + 5DC7D7B46154D6B6CE8EF4AD69B15D4982559B297BCF1885C529F566660E57EC + 68EDBC3C05726CC02FD4CBF4976EAA9AFD5138FE8376435B9FC61D2FC0EB06E3 + Generator = 2 + + + +Burdis & Naffah Expires July 13, 2002 [Page 30] + +Internet-Draft SRP SASL Mechanism January 2002 + + + [1280 bits] + Modulus (base 16) = + D77946826E811914B39401D56A0A7843A8E7575D738C672A090AB1187D690DC4 + 3872FC06A7B6A43F3B95BEAEC7DF04B9D242EBDC481111283216CE816E004B78 + 6C5FCE856780D41837D95AD787A50BBE90BD3A9C98AC0F5FC0DE744B1CDE1891 + 690894BC1F65E00DE15B4B2AA6D87100C9ECC2527E45EB849DEB14BB2049B163 + EA04187FD27C1BD9C7958CD40CE7067A9C024F9B7C5A0B4F5003686161F0605B + Generator = 2 + + [1536 bits] + Modulus (base 16) = + 9DEF3CAFB939277AB1F12A8617A47BBBDBA51DF499AC4C80BEEEA9614B19CC4D + 5F4F5F556E27CBDE51C6A94BE4607A291558903BA0D0F84380B655BB9A22E8DC + DF028A7CEC67F0D08134B1C8B97989149B609E0BE3BAB63D47548381DBC5B1FC + 764E3F4B53DD9DA1158BFD3E2B9C8CF56EDF019539349627DB2FD53D24B7C486 + 65772E437D6C7F8CE442734AF7CCB7AE837C264AE3A9BEB87F8A2FE9B8B5292E + 5A021FFF5E91479E8CE7A28C2442C6F315180F93499A234DCF76E3FED135F9BB + Generator = 2 + + [2048 bits] + Modulus (base 16) = + AC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC3192943DB56050 + A37329CBB4A099ED8193E0757767A13DD52312AB4B03310DCD7F48A9DA04FD50 + E8083969EDB767B0CF6095179A163AB3661A05FBD5FAAAE82918A9962F0B93B8 + 55F97993EC975EEAA80D740ADBF4FF747359D041D5C33EA71D281E446B14773B + CA97B43A23FB801676BD207A436C6481F1D2B9078717461A5B9D32E688F87748 + 544523B524B0D57D5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6 + AF874E7303CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB6 + 94B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F9E4AFF73 + Generator = 2 + + + + + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires July 13, 2002 [Page 31] + +Internet-Draft SRP SASL Mechanism January 2002 + + +Appendix B. Changes since the previous draft + + The underlying message digest algorithm for SRP calculations is now + selected during an exchange between the server and client. Section + 4.2 and Section 4.3 have been amended to reflect this change. + + Changed "mechanisms" to "mechanism" in various places and fixed the + mechanism name to "SRP." + + Removed "Mechanism Names" section, since it is no longer needed, and + replaced with "Introduction." + + Changed the mechanism data exchanges in Section 4 so that the + authorisation identity (I) is sent with the authentication identity + (U). + + Added a new bullet point to Section 7.1 justifying the selection of + SHA-160 as the MANDATORY Message Digest Algorithm for SRP + calculations. + + Added a new paragraph to Section 8 giving Tom Wu's response to the + SRP password-guessing attack pointed out by Robert Moskowitz. + + Added Ken Murchison to Section 9. + + Used "**" consistently as the symbol for the exponentiation operator. + + Re-ordered the references alphabetically. + + + + + + + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires July 13, 2002 [Page 32] + +Internet-Draft SRP SASL Mechanism January 2002 + + +Full Copyright Statement + + Copyright (C) The Internet Society (2002). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph + are included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires July 13, 2002 [Page 33] + diff --git a/doc/specification/draft-burdis-cat-srp-sasl-07.txt b/doc/specification/draft-burdis-cat-srp-sasl-07.txt new file mode 100644 index 0000000..edfc2dc --- /dev/null +++ b/doc/specification/draft-burdis-cat-srp-sasl-07.txt @@ -0,0 +1,2128 @@ + + +Network K. Burdis +Internet-Draft Rhodes University +Expires: February 10, 2003 R. Naffah + Forge Research + August 12, 2002 + + + Secure Remote Password SASL Mechanism + draft-burdis-cat-srp-sasl-07 + +Status of this Memo + + This document is an Internet-Draft and is in full conformance with + all provisions of Section 10 of RFC2026. + + Internet-Drafts are working documents of the Internet Engineering + Task Force (IETF), its areas, and its working groups. Note that + other groups may also distribute working documents as Internet- + Drafts. + + Internet-Drafts are draft documents valid for a maximum of six months + and may be updated, replaced, or obsoleted by other documents at any + time. It is inappropriate to use Internet-Drafts as reference + material or to cite them other than as "work in progress." + + The list of current Internet-Drafts can be accessed at http:// + www.ietf.org/ietf/1id-abstracts.txt. + + The list of Internet-Draft Shadow Directories can be accessed at + http://www.ietf.org/shadow.html. + + This Internet-Draft will expire on February 10, 2003. + +Copyright Notice + + Copyright (C) The Internet Society (2002). All Rights Reserved. + +Abstract + + This document describes a SASL mechanism based on the Secure Remote + Password protocol. This mechanism performs mutual authentication and + can provide a security layer with replay detection, integrity + protection and/or confidentiality protection. + + + + + + + + + +Burdis & Naffah Expires February 10, 2003 [Page 1] + +Internet-Draft SRP SASL Mechanism August 2002 + + +Table of Contents + + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 + 2. Conventions Used in this Document . . . . . . . . . . . . . 4 + 3. Data Element Formats . . . . . . . . . . . . . . . . . . . . 5 + 3.1 Scalar numbers . . . . . . . . . . . . . . . . . . . . . . . 5 + 3.2 Multi-Precision Integers . . . . . . . . . . . . . . . . . . 5 + 3.3 Octet Sequences . . . . . . . . . . . . . . . . . . . . . . 6 + 3.4 Extended Octet Sequences . . . . . . . . . . . . . . . . . . 6 + 3.5 Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 + 3.6 Buffers . . . . . . . . . . . . . . . . . . . . . . . . . . 6 + 3.7 Data Element Size Limits . . . . . . . . . . . . . . . . . . 7 + 4. Protocol Description . . . . . . . . . . . . . . . . . . . . 8 + 4.1 Client sends its identity . . . . . . . . . . . . . . . . . 9 + 4.2 Server sends initial protocol elements . . . . . . . . . . . 9 + 4.3 Client sends its ephemeral public key . . . . . . . . . . . 11 + 4.4 Server sends its ephemeral public key . . . . . . . . . . . 12 + 4.5 Client sends its evidence . . . . . . . . . . . . . . . . . 12 + 4.6 Server sends its evidence . . . . . . . . . . . . . . . . . 13 + 5. Security Layer . . . . . . . . . . . . . . . . . . . . . . . 15 + 5.1 Cryptographic primitives . . . . . . . . . . . . . . . . . . 17 + 5.1.1 Pseudo random number generators . . . . . . . . . . . . . . 17 + 5.1.2 Key derivation function . . . . . . . . . . . . . . . . . . 18 + 5.2 Confidentiality Protection . . . . . . . . . . . . . . . . . 19 + 5.3 Replay Detection . . . . . . . . . . . . . . . . . . . . . . 20 + 5.4 Integrity Protection . . . . . . . . . . . . . . . . . . . . 21 + 5.5 Summary of Security Layer Output . . . . . . . . . . . . . . 21 + 6. Example . . . . . . . . . . . . . . . . . . . . . . . . . . 23 + 7. Discussion . . . . . . . . . . . . . . . . . . . . . . . . . 26 + 7.1 Mandatory Algorithms . . . . . . . . . . . . . . . . . . . . 26 + 7.2 Modulus and generator values . . . . . . . . . . . . . . . . 26 + 7.3 Replay detection sequence number counters . . . . . . . . . 26 + 7.4 SASL Profile Considerations . . . . . . . . . . . . . . . . 27 + 8. Security Considerations . . . . . . . . . . . . . . . . . . 29 + 9. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 30 + References . . . . . . . . . . . . . . . . . . . . . . . . . 31 + Authors' Addresses . . . . . . . . . . . . . . . . . . . . . 33 + A. Modulus and Generator values . . . . . . . . . . . . . . . . 34 + B. Changes since the previous draft . . . . . . . . . . . . . . 36 + Full Copyright Statement . . . . . . . . . . . . . . . . . . 38 + + + + + + + + + + + +Burdis & Naffah Expires February 10, 2003 [Page 2] + +Internet-Draft SRP SASL Mechanism August 2002 + + +1. Introduction + + The Secure Remote Password (SRP) is a password-based, zero-knowledge, + authentication and key-exchange protocol developed by Thomas Wu. It + has good performance, is not plaintext-equivalent and maintains + perfect forward secrecy. It provides authentication (optionally + mutual authentication) and the negotiation of a session key [SRP]. + + The mechanism described herein is based on the optimised SRP protocol + described at the end of section 3 in [RFC-2945], since this reduces + the total number of messages exchanged by grouping together pieces of + information that do not depend on earlier messages. Due to the + design of the mechanism, mutual authentication is MANDATORY. + + The SASL mechanism name associated with this protocol is "SRP". + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires February 10, 2003 [Page 3] + +Internet-Draft SRP SASL Mechanism August 2002 + + +2. Conventions Used in this Document + + o A hex digit is an element of the set: + + {0, 1, 2, 3, 4, 5, 6, 7, 8 , 9, A, B, C, D, E, F} + + A hex digit is the representation of a 4-bit string. Examples: + + 7 = 0111 + + A = 1010 + + o An octet is an 8-bit string. In this document an octet may be + written as a pair of hex digits. Examples: + + 7A = 01111010 + + 02 = 00000010 + + o All data is encoded and sent in network byte order (big-endian). + + o The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL + NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" + in this document are to be interpreted as described in [RFC-2119]. + + + + + + + + + + + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires February 10, 2003 [Page 4] + +Internet-Draft SRP SASL Mechanism August 2002 + + +3. Data Element Formats + + This section describes the encoding of the data elements used by the + SASL mechanism described in this document. + +3.1 Scalar numbers + + Scalar numbers are unsigned quantities. Using b[k] to refer to the + k-th octet being processed, the value of a two-octet scalar is: + + ((b[0] << 8) + b[1]), + + where << is the bit left-shift operator. The value of a four-octet + scalar is: + + ((b[0] << 24) + (b[1] << 16) + (b[2] << 8) + b[3]). + + +3.2 Multi-Precision Integers + + Multi-Precision Integers, or MPIs, are positive integers used to hold + large integers used in cryptographic computations. + + MPIs are encoded using a scheme inspired by that used by OpenPGP - + [RFC-2440] (section 3.2) - for encoding such entities: + + The encoded form of an MPI SHALL consist of two pieces: a two- + octet scalar that represents the length of the entity, in octets, + followed by a sequence of octets that contain the actual integer. + + These octets form a big-endian number; A big-endian number can be + encoded by prefixing it with the appropriate length. + + Examples: (all numbers are in hexadecimal) + + The sequence of octets [00 01 01] encodes an MPI with the value + 1, while the sequence [00 02 01 FF] encodes an MPI with the + value of 511. + + Additional rule: + + * The length field of an encoded MPI describes the octet count + starting from the MPI's first non-zero octet, containing the + most significant non-zero bit. Thus, the encoding [00 02 01] + is not formed correctly; It should be [00 01 01]. + + We shall use the syntax mpi(A) to denote the encoded form of the + multi-precision integer A. Furthermore, we shall use the syntax + + + +Burdis & Naffah Expires February 10, 2003 [Page 5] + +Internet-Draft SRP SASL Mechanism August 2002 + + + bytes(A) to denote the big-endian sequence of octets forming the + multi-precision integer with the most significant octet being the + first non-zero octet containing the most significant bit of A. + +3.3 Octet Sequences + + This mechanism generates, uses and exchanges sequences of octets; + e.g. output values of message digest algorithm functions. When such + entities travel on the wire, they shall be preceded by a one-octet + scalar quantity representing the count of following octets. + + We shall use the syntax os(s) to denote the encoded form of the octet + sequence. Furthermore, we shall use the syntax bytes(s) to denote + the sequence of octets s, in big-endian order. + +3.4 Extended Octet Sequences + + Extended sequences of octets are exchanged when using the security + layer. When these sequences travel on the wire, they shall be + preceded by a four-octet scalar quantity representing the count of + following octets. + + We shall use the syntax eos(s) to denote the encoded form of the + extended octet sequence. Furthermore, we shall use the syntax + bytes(s) to denote the sequence of octets s, in big-endian order. + +3.5 Text + + The only character set for text is the UTF-8 encoding [RFC-2279] of + Unicode characters [ISO-10646]. All text MUST be in Unicode + Normalization Form KC [UNICODE-KC] without NUL characters. + + We shall use the syntax utf8(L) to denote the string L in UTF-8 + encoding, preceded by a two-octet scalar quantity representing the + count of following octets. Furthermore, we shall use the syntax + bytes(L) to denote the sequence of octets representing the UTF-8 + encoding of L, in big-endian order. + +3.6 Buffers + + In this SASL mechanism data is exchanged between the client and + server using buffers. A buffer acts as an envelope for the sequence + of data elements sent by one end-point of the exchange, and expected + by the other. + + A buffer MAY NOT contain other buffers. It may only contain zero, + one or more data elements. + + + + +Burdis & Naffah Expires February 10, 2003 [Page 6] + +Internet-Draft SRP SASL Mechanism August 2002 + + + A buffer shall be encoded as two fields: a four-octet scalar quantity + representing the count of following octets, and the concatenation of + the octets of the data element(s) contained in the buffer. + + We shall use the syntax {A|B|C} to denote a buffer containing A, B + and C in that order. For example: + + { mpi(N) | mpi(g) | utf8(L) } + + is a buffer containing, in the designated order, the encoded forms of + an MPI N, an MPI g and a Text L. + +3.7 Data Element Size Limits + + The following table details the size limit, in number of octets, for + each of the SASL data element encodings described earlier. + + Data element type Header Size limit in octets + (octets) (excluding header) + ------------------------------------------------------------ + Octet Sequence 1 255 + MPI 2 65,535 + Text 2 65,535 + Extended Octet Sequence 4 2,147,483,383 + Buffer 4 2,147,483,643 + + An implementation MUST signal an exception if any size constraint is + violated. + + + + + + + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires February 10, 2003 [Page 7] + +Internet-Draft SRP SASL Mechanism August 2002 + + +4. Protocol Description + + The following sections describe the sequence of data transmitted + between the client and server for the SRP SASL mechanism, as well as + the extra control information exchanged to enable a client to request + whether or not replay detection, integrity protection and/or + confidentiality protection should be provided by a security layer. + + Mechanism data exchanges, during the authentication phase, are shown + below: + + Client Server + + --- { utf8(U) | utf8(I) } ------------------------> + + <-------- { mpi(N) | mpi(g) | os(s) | utf8(L) } --- + + --- { mpi(A) | utf8(o) } -------------------------> + + <----------------------------------- { mpi(B) } --- + + --- { os(M1) } -----------------------------------> + + ( no confidentiality protection ) + + <----------------------------------- { os(M2) } --- + + where: + + U is the authentication identity (username), + + I is the authorisation identity, + + N is the safe prime modulus, + + g is the generator, + + s is the user's password salt, + + L is the options list indicating available security services, + + A is the client's ephemeral public key, + + o is the options list indicating chosen security services, + + B is the server's ephemeral public key, + + M1 is the client's evidence that the shared key K is known, + + + +Burdis & Naffah Expires February 10, 2003 [Page 8] + +Internet-Draft SRP SASL Mechanism August 2002 + + + M2 is the server's evidence that the shared key K is known. + + +4.1 Client sends its identity + + The client determines its authentication identity U and authorisation + identity I, encodes them and sends them to the server. + + The client sends: + + { utf8(U) | utf8(I) } + + +4.2 Server sends initial protocol elements + + The server receives U, and looks up the safe prime modulus N, the + generator g, and the salt s to be used for that identity. + + The server also creates an options list L, which consists of a comma- + separated list of option strings that specify the options the server + supports. This options list MUST NOT contain any whitespace + characters and all alphabetic characters MUST be in lowercase. When + used in digest calculations by the client the options list MUST be + used as received. + + The following option strings are defined: + + o "mda=" indicates that the server + supports the designated hash function as the underlying Message + Digest Algorithm for the designated user to be used for all SRP + calculations - to compute both client-side and server-side + digests. The specified algorithm MUST meet the requirements + specified in section 3.2 of [RFC-2945]: + + "Any hash function used with SRP should produce an output of at + least 16 bytes and have the property that small changes in the + input cause significant nonlinear changes in the output." + + Note that in the interests of interoperability between client and + server implementations and with other SRP-based tools, both the + client and the server MUST support SHA-160 as an underlying + Message Digest Algorithm. While the server is not required to + list SHA-160 as an available underlying Message Digest Algorithm, + it must be able to do so. + + o "integrity=hmac-" indicates that the server supports + integrity protection using the HMAC algorithm [RFC-2104] with + as the underlying Message Digest Algorithm. Acceptable + + + +Burdis & Naffah Expires February 10, 2003 [Page 9] + +Internet-Draft SRP SASL Mechanism August 2002 + + + MDA names are chosen from [SCAN] under the MessageDigest section. + A server SHOULD send such an option string for each HMAC algorithm + it supports. The server MUST advertise at least one integrity + protection algorithm and in the interest of interoperability the + server SHOULD advertise support for the HMAC-SHA-160 algorithm. + + o "replay_detection" indicates that the server supports replay + detection using sequence numbers. Replay detection SHALL NOT be + activated without also activating integrity protection. If the + replay detection option is offered (by the server) and/or chosen + (by the client) without explicitly specifying an integrity + protection option, then the default integrity protection option + "integrity=hmac-sha-160" is implied and SHALL be activated. + + o "confidentiality=" indicates that the server supports + confidentiality protection using the symmetric key block cipher + algorithm . The server SHOULD send such an option + string for each confidentiality protection algorithm it supports. + Note that in the interest of interoperability, if the server + offers confidentiality protection, it MUST send the option string + "confidentiality=aes" since it is then MANDATORY for it to provide + support for the [AES] algorithm. + + o "mandatory=[integrity|replay_detection|confidentiality]" is an + option only available to the server that indicates that the + specified security layer option is MANDATORY and MUST be chosen by + the client for use in the resulting security layer. If a server + specifies an option as mandatory in this way, it MUST abort the + connection if the specified option is not chosen by the client. + It doesn't make sense for the client to send this option since it + is only able to choose options that the server advertises. The + client SHOULD abort the connection if the server does not offer an + option that it requires. If this option is not specified then + this implies that no options are mandatory. The server SHOULD + always send the "mandatory=integrity" option indicating that + integrity protection is required. + + o "maxbuffersize=" indicates to the peer the + maximum number of raw bytes (excluding the SASL buffer 4-byte + length header) to be processed by the security layer at a time, if + one is negotiated. The value of MUST NOT exceed + the Buffer size limit defined in section 3.7. If this option is + not detected by a client or server mechanism, then it shall + operate its security layer on the assumption that the maximum + number of bytes that may be sent, to the peer server or client + mechanism respectively, is the Buffer data size limit indicated in + section 3.7. On the other hand, if a recipient detects this + option, it shall break any octet-sequence longer than the + + + +Burdis & Naffah Expires February 10, 2003 [Page 10] + +Internet-Draft SRP SASL Mechanism August 2002 + + + designated limit into two or more fragments, each wrapped in a + SASL buffer, before sending them, in sequence, to the peer. + + For example, if the server supports integrity protection using the + HMAC-SHA-160 and HMAC-MD5 algorithms, replay detection and no + confidentiality protection, the options list would be: + + mda=sha-1,integrity=hmac-sha-160,integrity=hmac- + md5,replay_detection + + The server sends: + + { mpi(N) | mpi(g) | os(s) | utf8(L) } + + +4.3 Client sends its ephemeral public key + + The client receives the options list L from the server that specifies + the Message Digest Algorithm(s) available to be used for all SRP + calculations, the security service options the server supports, and + the maximum buffer size the server can handle. The client selects + options from this list and creates a new options list o that + specifies the selected Message Digest Algorithm to be used for SRP + calculations and the security services that will be used in the + security layer. At most one available Message Digest Algorithm name, + one available integrity protection algorithm and one available + confidentiality protection algorithm may be selected. In addition + the client may specify the maximum buffer size it can handle. The + client MUST include any option specified by the mandatory option. + + The client SHOULD always select an integrity protection algorithm + even if the server does not make it mandatory to do so. If the + client selects a confidentiality protection algorithm it SHOULD then + also select an integrity protection algorithm. + + This options list MUST NOT contain any whitespace characters and all + alphabetic characters MUST be in lowercase. When used in digest + calculations by the server the options list MUST be used as received. + + The client generates its ephemeral public key A as follows: + + a = prng(); + + A = g**a % N; + + where: + + prng() is a random number generation function, + + + +Burdis & Naffah Expires February 10, 2003 [Page 11] + +Internet-Draft SRP SASL Mechanism August 2002 + + + a is the MPI that will act as the client's private key, + + ** is the exponentiation operator, + + % is the modulus operator, + + The client sends: + + { mpi(A) | utf8(o) } + + +4.4 Server sends its ephemeral public key + + The server reads the client's verifier v, calculates the shared + context key K and generates its ephemeral public key B as follows: + + b = prng(); + + B = (v + g**b) % N; + + K = H2((A * v**u) ** b % N); + + where: + + b is the MPI that will act as the server's private key, + + v is the stored password verifier value, + + u is a 32-bit unsigned integer which takes its value from the + first 32 bits of the hash of B, MSB first, + + H2() is the "Interleaved SHA" function, as described in [RFC- + 2945], but generalised to any message digest algorithm, and + applied using the underlying Message Digest Algorithm (see Section + 4.2). + + The server sends: + + { mpi(B) } + + +4.5 Client sends its evidence + + The client calculates the shared context key K, and calculates the + evidence M1 that proves to the server that it knows the shared + context key K, including I and L as part of the calculation. + + K, on the client's side is computed as follows: + + + +Burdis & Naffah Expires February 10, 2003 [Page 12] + +Internet-Draft SRP SASL Mechanism August 2002 + + + x = H(s | H(U | ":" | p)); + + K = H2((B - g**x) ** (a + u * x) % N); + + where: + + H() is the result of digesting the designated input/data with the + underlying Message Digest Algorithm function (see Section 4.2). + + p is the password value. + + M1 is computed as: + + H( bytes(H( bytes(N) )) ^ bytes( H( bytes(g) )) + | bytes(H( bytes(U) )) + | bytes(s) + | bytes(A) + | bytes(B) + | bytes(K) + | bytes(H( bytes(I) ) + | bytes(H( bytes(L) )) + ) + + where: + + ^ is the bitwise XOR operator. + + All parameters received from the server that are used as input to a + digest operation MUST be used as received. + + The client sends: + + { os(M1) } + + +4.6 Server sends its evidence + + When the Confidentiality Protection service is advertised by the + server and chosen by the client, the server MUST NOT send M2 but + instead conclude the SASL exchange after receiving and verifying the + client's M1. Otherwise, M2 MUST be sent. + + When the server has to send its evidence M2, which proves to the + client that it knows the shared context key K, as well as U, I and o, + it shall compute it as follows: + + + + + + +Burdis & Naffah Expires February 10, 2003 [Page 13] + +Internet-Draft SRP SASL Mechanism August 2002 + + + H( bytes(A) + | bytes(M1) + | bytes(K) + | bytes(H( bytes(U) )) + | bytes(H( bytes(I) )) + | bytes(H( bytes(o) )) + ) + + All parameters received from the client that are used as input to a + digest operation MUST be used as received. + + If Confidentiality Protection was not negotiated the server sends: + + { os(M2) } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires February 10, 2003 [Page 14] + +Internet-Draft SRP SASL Mechanism August 2002 + + +5. Security Layer + + Section 3 of [RFC-2222] describes the operation of the security + layer: + + "The security layer takes effect immediately following the last + response of the authentication exchange for data sent by the + client and the completion indication for data sent by the server. + Once the security layer is in effect, the protocol stream is + processed by the security layer into buffers of cipher-text. Each + buffer is transferred over the connection as a stream of octets + prepended with a four octet field in network byte order that + represents the length of the following buffer. The length of the + cipher-text buffer must be no larger than the maximum size that + was defined or negotiated by the other side." + + Depending on the options offered by the server and chosen by the + client, the security layer may provide integrity protection, replay + detection, and/or confidentiality protection. + + The security layer can be thought of as a three-stage filter through + which the data flows from the output of one stage to the input of the + following one. The first input is the original data, while the last + output is the data after being subject to the transformations of this + filter. + + The data always passes through this three-stage filter, though any of + the stages may be inactive. Only when a stage is active would the + output be different from the input. In other words, if a stage is + inactive, the octet sequence at the output side is an exact duplicate + of the same sequence at the input side. + + Schematically, the three-stage filter security layer appears as + follows: + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires February 10, 2003 [Page 15] + +Internet-Draft SRP SASL Mechanism August 2002 + + + +----------------------------+ + | | I/ p1 + p1 --->| Confidentiality protection |---+ + | | | A/ c + +----------------------------+ | + | + +------------------------------------+ + | + | +----------------------------+ + | | | I/ p2 + p2 +-->| Replay detection |---+ + | | | A/ p2 | q + +----------------------------+ | + | + +------------------------------------+ + | + | +----------------------------+ + | | | I/ p3 + p3 +-->| Integrity protection |---> + | | A/ p3 | C + +----------------------------+ + + where: + + p1, p2 and p3 are the input octet sequences at each stage, + + I/ denotes the output at the end of one stage if/when the stage is + inactive or disabled, + + A/ denotes the output at the end of one stage if/when the stage is + active or enabled, + + c is the encrypted (sender-side) or decrypted (receiver-side) + octet sequence. c1 shall denote the value computed by the sender, + while c2 shall denote the value computed by the receiver. + + q is a four-octet scalar quantity representing a sequence number, + + C is the Message Authentication Code. C1 shall denote the value + of the MAC as computed by the sender, while C2 shall denote the + value computed by the receiver. + + It is worth noting here that both client and server have their own + distinct security contexts, including distinct encryption and + decryption sub-contexts. In principal, nothing in this specification + should prevent an implementation from supporting asynchronous + connections. + + + + +Burdis & Naffah Expires February 10, 2003 [Page 16] + +Internet-Draft SRP SASL Mechanism August 2002 + + +5.1 Cryptographic primitives + +5.1.1 Pseudo random number generators + + This mechanism requires random data to be generated for use in: + + 1. The CALG key material and the cipher initial vectors (IVs) for + both the client and server when the Confidentiality Protection + service is enabled. + + 2. The IALG key material for both the client and server when the + Integrity Protection service is enabled. + + The PRNG used in this specification is based on the "UMacGenerator" + algorithm described in [UMAC]. It uses the [AES] algorithm, in its + 256-bit key size variant, as the underlying symmetric key block + cipher for its operations. + + A formal description of this PRNG follows: + + o Initialisation + + * SK: a 32-octet sequence (seeding key to AES) + + o Input + + * n: a positive integer + + o Output + + * Y: an n-octet sequence + + o Algorithm + + * (initialisation) + + 1. Initialise an AES instance for encryption with the first 32 + octets of SK as its user-supplied key material. Let "aes" + be that instance; i.e. aes = AES(SK, ENCRYPTION); + + 2. Initialise T to be an all-zero 16-octet long sequence; + + * (for every input) + + 1. Initialise "remaining" to n; + + 2. Initialise Y to be a 0-length octet sequence; + + + + +Burdis & Naffah Expires February 10, 2003 [Page 17] + +Internet-Draft SRP SASL Mechanism August 2002 + + + 3. while (remaining > 0) do + + 1. T = aes(T); + + 2. Append m octets from T to Y, where m is the minimum of + 16 and remaining; + + 3. Subtract 16 from remaining; + + 4. return Y; + + In the rest of this document, "PRNG" will refer to this algorithm + with the initialisation parameter SK set to be the shared context key + K computed by the SRP calculations (see Section 4.4 and Section 4.5). + + This algorithm MAY also be used as part of the SRP calculations to + generate the required "a" and "b" parameters used in creating the + client and server ephemeral private keys ("A" and "B"). In this case + the initialisation parameter SK can be any 32-octet sequence (e.g. + multiple representations of the time-of-day). + + If the same PRNG instance is used for both the SRP calculations and + the calculations in this specification, it MUST be re-initialised + with the shared context key K before any of the latter calculations + are performed. + +5.1.2 Key derivation function + + During the authentication phase, both parties compute the shared + context key K (see Section 4.4 for the server, and Section 4.5 for + the client sides respectively). The length of K is 2*s bits, where + "s" is the output length of the underlying Message Digest Algorithm + used in the SRP calculations (see "mda" option in Section 4.2). + + When Confidentiality Protection is required, and the length of K is + not equal to the length of the user-supplied key material needed to + initialise the chosen Confidentiality Algorithm (CALG), the peers + MUST apply the Key Derivation Function (KDF) in order to obtain + enough data for this purpose. + + Similarly, when Integrity Protection is required, and the length of K + is not equal to the required length of the key material needed to + initialise the chosen Integrity Algorithm (IALG), the peers MUST + apply the Key Derivation Function (KDF) in order to obtain enough + data for this purpose too. + + We define this KDF as: + + + + +Burdis & Naffah Expires February 10, 2003 [Page 18] + +Internet-Draft SRP SASL Mechanism August 2002 + + + Km = KDF(K, n) + + where: + + Km: is the required key material, + + K: is the shared context key, and + + n: is the required length of Km. + + The following steps describe the KDF algorithm: + + If length of K is greater than or equal to n, then + + Let Km be the first n bytes of K; + + Else + + Let Km = PRNG(n); + + return Km + + +5.2 Confidentiality Protection + + The plaintext data octet sequence p1 is encrypted using the chosen + confidentiality algorithm (CALG) initialised for encryption with the + key material Km obtained by applying the KDF to K (the shared context + key K), and m (the key size of the chosen CALG) - see Section 5.1.2. + + Km = KDF(K, m) + + c1 = CALG(Km, ENCRYPTION)( bytes(p1) ) + + On the receiving side, the ciphertext data octet sequence p1 is + decrypted using the chosen confidentiality algorithm (CALG) + initialised for decryption, with the key Km obtained by a similar + process. + + Km = KDF(K, m) + + c2 = CALG(Km, DECRYPTION)( bytes(p1) ) + + The designated CALG block cipher MUST be used in OFB (Output Feedback + Block) mode in the ISO variant, as described in [HAC], algorithm + 7.20. + + Let k be the block size of the chosen symmetric key block cipher + + + +Burdis & Naffah Expires February 10, 2003 [Page 19] + +Internet-Draft SRP SASL Mechanism August 2002 + + + algorithm; e.g. for AES this is 128 bits or 16 octets. The OFB mode + used shall have a block size of k. + + It is recommended that Block ciphers operating in OFB mode be used + with an Initial Vector (the mode's IV). In such a mode of operation + - OFB with key re-use - the IV need not be secret. For the SASL + mechanism described in this document, the IVs shall be: + + IV = PRNG(n); + + where n is the block size of the negotiated CALG. + + The input data to the confidentiality protection algorithm shall be a + multiple of the symmetric key block cipher block size k. When the + input length is not a multiple of k octets, the data shall be padded + according to the following scheme (described in [PKCS7] which itself + is based on [RFC-1423]): + + Assuming the length of the input is l octets, (k - (l mod k)) + octets, all having the value (k - (l mod k)), shall be appended to + the original data. In other words, the input is padded at the + trailing end with one of the following sequences: + + 01 -- if l mod k = k-1 + 02 02 -- if l mod k = k-2 + ... + ... + ... + k k ... k k -- if l mod k = 0 + + The padding can be removed unambiguously since all input is padded + and no padding sequence is a suffix of another. This padding + method is well-defined if and only if k < 256 octets, which is the + case with symmetric block ciphers today, and in the forseeable + future. + + The output of this stage, when it is active, is: + + at the sending side: CALG(Km, ENCRYPT)( bytes(p1) ) + + at the receiving side: CALG(Km, DECRYPT)( bytes(p1) ) + + +5.3 Replay Detection + + A sequence number q is incremented every time a message is sent to + the peer. + + + + +Burdis & Naffah Expires February 10, 2003 [Page 20] + +Internet-Draft SRP SASL Mechanism August 2002 + + + The output of this stage, when it is active, is: + + p2 | q + + At the other end, the receiver increments its instance of the + sequence number. This new value of the sequence number is then used + in the integrity protection transformation, which must also be active + as described in Section 4.2. See Section 7.3 for more details. + +5.4 Integrity Protection + + When the Integrity Protection stage is active, a message + authentication code C is computed using the chosen integrity + protection algorithm (IALG) as follows: + + o the IALG is initialised (once) with the key material Kn obtained + by applying the KDF to K (the shared context key K), and n (the + required key size of the chosen IALG) - see Section 5.1.2; i.e. + Kn = KDF(K, n), + + o the IALG is updated with every exchange of the sequence p3, + yielding the value C and a new IALG context for use in the + following exchange. + + At the other end, the receiver computes its version of C, using the + same transformation, and checks that its value is equal to that + received. If the two values do not agree, the receiver MUST signal + an exception and abort. + + The output of this stage, when it is active, is then: + + IALG(Kn)( bytes(p3) ) + + +5.5 Summary of Security Layer Output + + The following table shows the data exchanged by the security layer + peers, depending on the possible legal combinations of the three + security services in operation: + + CP IP RD Peer sends/receives + + I I I { eos(p) } + I A I { eos(p) | os( IALG(K)( bytes(p) ) ) } + I A A { eos(p) | os( IALG(K)( bytes(p) | bytes(q)) ) } + A I I { eos(c) } + A A I { eos(c) | os( IALG(K)( bytes(c) ) ) } + A A A { eos(c) | os( IALG(K)((bytes(c) | bytes(q)) ) } + + + +Burdis & Naffah Expires February 10, 2003 [Page 21] + +Internet-Draft SRP SASL Mechanism August 2002 + + + where + + CP Confidentiality protection, + + IP Integrity protection, + + RD Replay detection, + + I Security service is Inactive/disabled, + + A Security service is Active/enabled, + + p The original plaintext, + + q The sequence number. + + c The enciphered input obtained by either: + + CALG(Km, ENCRYPT)( bytes(p) ) at the sender's side, or + + CALG(Km, DECRYPT)( bytes(p) ) at the receiver's side + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires February 10, 2003 [Page 22] + +Internet-Draft SRP SASL Mechanism August 2002 + + +6. Example + + The example below uses SMTP authentication [RFC-2554]. The base64 + encoding of challenges and responses, as well as the reply codes + preceding the responses are part of the SMTP authentication + specification, not part of this SASL mechanism itself. + + "C:" and "S:" indicate lines sent by the client and server + respectively. + + + S: 220 smtp.example.com ESMTP server ready + + C: EHLO zaau.example.com + + S: 250-smtp.example.com + S: 250 AUTH SRP CRAM-MD5 DIGEST-MD5 + + C: AUTH SRP AAAADAAEdGVzdAAEdGVzdA== + + with: + + U = "test" + + I = "test" + + S: 334 AAABygEArGvbQTJKmpvxZt5eE4lYL69ytmUZh+4H/DGSlD21YFCjcynLtKCZ + 7YGT4HV3Z6E91SMSq0sDMQ3Nf0ip2gT9UOgIOWntt2ewz2CVF5oWOrNmGgX71fqq6Ck + YqZYvC5O4Vfl5k+yXXuqoDXQK2/T/dHNZ0EHVwz6nHSgeRGsUdzvKl7Q6I/uAFna9IH + pDbGSB8dK5B4cXRhpbnTLmiPh3SFRFI7UksNV9Xqd6J3XS7PoDLPvb9S+zeGFgJ5AE5 + Xrmr4dOcwPOUymczAQce8MI2CpWmPOo0MOCca41+Onb+7aUtcgD2J965DXeI21SX1R1 + m2XjcvzWjvIPpxEfnkr/cwABAgqsi3AvmIqdEbREALhtZGE9U0hBLTEsbWFuZGF0b3J + 5PXJlcGxheSBkZXRlY3Rpb24scmVwbGF5IGRldGVjdGlvbixpbnRlZ3JpdHk9aG1hYy + 1zaGExLGludGVncml0eT1obWFjLW1kNSxjb25maWRlbnRpYWxpdHk9YWVzLGNvbmZpZ + GVudGlhbGl0eT1jYXN0NSxjb25maWRlbnRpYWxpdHk9Ymxvd2Zpc2gsbWF4YnVmZmVy + c2l6ZT0yMTQ3NDgzNjQz + + with: + + N = "21766174458617435773191008891802753781907668374255538511144 + 6432246898862353838409572109090130860564015713997172358072665816 + 4960647214841029141336415219736447718088739565548373811507267740 + 2235101762521901569820740293149529620419333266262073471054548368 + 7360395197024862265062488610602569718029849535611214426801576680 + 0076142998822245709041387397397017192709399211475176516806361476 + 1119615476233422096442783117971236371647333871414335895773474667 + 3089670508070055093204247996784170368679283167612722742303140675 + 4829113358247958306143957755934710196177140617368437852270348349 + + + +Burdis & Naffah Expires February 10, 2003 [Page 23] + +Internet-Draft SRP SASL Mechanism August 2002 + + + 5337037655006751328447510550299250924469288819" + + g = "2" + + s = "814819216327401865851972" + + L = "mda=sha-1,mandatory=replay_detection,replay_detection,integ + rity=hmac-sha1,integrity=hmac-md5,confidentiality=aes,confidenti + ality=cast5,confidentiality=blowfish,maxbuffersize=2147483643" + + C: AAABYwEAAp5q/4zhXoTUzXBscozN97SWgfDcAImIk3lNHNvd0b+Dr7jEm6upXblZ + T5sL9mPgFsejlIh+B/eCu/HvzWCrXj6ylPZv8dy3LCH3LIORqQ45S7Lsbmrrg/dukDh + 4tZCJMLD4r3evzaY8KVhtJeLMVbeXuh4JljKP42Ll59Lzwf8jfPh4+4Lae1rpWUCL9D + ueKcY+nN+xNHTit/ynLATxwL93P6+GoGY4TkUbUBfjiI1+rAMvyMDMw5XozGy07FOEc + ++U0iPeXCQP4MT5FipOUoz8CYX7J1LbaXp2WJuFHlkyVXF7oCoyHbhld/5CfR3o6q/B + /x9+yZRqaHH+JfllOgBfbWRhPVNIQS0xLHJlcGxheSBkZXRlY3Rpb24saW50ZWdyaXR + 5PWhtYWMtbWQ1LGNvbmZpZGVudGlhbGl0eT1ibG93ZmlzaCxtYXhidWZmZXJzaXplPT + IxNDc0ODM2NDM= + + with: + + A = "33059541846712102497463123211304342021934496372587869281515 + 9695658237779884462777478850394977744553746930451895815615888405 + 0562780707370878253753979367019077142882237029766166623275718227 + 6555389834190840322081091599089081947324537907613924707058150037 + 7802790776231793962143786411792516760030102436603621046541729396 + 6890613394379900527412007068242559299422872893332111365840536495 + 1858834742328835373387573188369956379881606380890675411966073665 + 1106922002294035533470301541999274557200666703389531481794516625 + 4757418442215980634933876533189969562613241499465295849832999091 + 40398081321840949606581251320320995783959866" + + o = mda=sha-1,replay_detection,integrity=hmac-md5,confidentialit + y=blowfish,maxbuffersize=2147483643" + + S: 334 AAABAgEAOUKbXpnzMhziivGgMwm+FS8sKGSvjh5M3D+80RF/5z9rm0oPoi4+ + pF83fueWn4Hz9M+muF/22PHHZkHtlutDrtapj4OtirdxC21fS9bMtEh3F0whTX+3mPv + thw5sk11turandHiLvcUZOgcrAGIoDKcBPoGyBud+8bMgpkf/uGfyBM2nEX/hV+oGgg + X+LiHjmkxAJ3kewfQPH0eV9ffEuuyu8BUcBXkJsS6l7eWkuERSCttVOi/jS031c+CD/ + nuecUXYiF8IYzW03rbcwYhZzifmTi3VK9C8zG2K1WmGU+cDKlZMkyCPMmtCsxlbgE8z + SHCuCiOgQ35XhcA0Qa0C3Q== + + with: + + B: "722842847565031844205403087285424428589273458129750231766015 + 4465607827529853239240118185263492617243523916106658696965596526 + 8585300845435562962039149169549800169184521786717633959469278439 + 8771344445002432579509292115598435685062882631760796416554562980 + + + +Burdis & Naffah Expires February 10, 2003 [Page 24] + +Internet-Draft SRP SASL Mechanism August 2002 + + + 8475896198325835507901319556929511421472132184990365213059654962 + 7218189966140113906545856088040473723048909402258929560823932725 + 2022154114087913895411927676707073040281136096806681758265221209 + 8822374723416364340410020172215773934302794679034424699999611678 + 9730443114919539575466941344964841591072763617954717789621871251 + 71089179399349194452686682517183909017223901" + + C: AAAAFRTkoju6xGP+zH89iaDWIFjfIKt5Kg== + + S: 235 Authentication successful. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires February 10, 2003 [Page 25] + +Internet-Draft SRP SASL Mechanism August 2002 + + +7. Discussion + +7.1 Mandatory Algorithms + + The algorithms specified as mandatory were chosen for utility and + availablity. We felt that a mandatory confidentiality and integrity + protection algorithm for the security layer and a mandatory Message + Digest Algorithm for SRP calculations should be specified to ensure + interoperability between implementations of this mechanism: + + o The SHA-160 Message Digest Algorithm was chosen as an underlying + algorithm for SRP calculations because this allows for easy + interoperability with other SRP-based tools that use the SRP-SHA1 + protocol described in section 3 of [RFC-2945] and create their + password files using this algorithm. + + o The HMAC algorithm was chosen as an integrity algorithm because it + is faster than MAC algorithms based on secret key encryption + algorithms [RFC-2847]. + + o AES was chosen as a cipher because it has undergone thorough + scrutiny by the best cryptographers in the world. + + Since confidentiality protection is optional, this mechanism should + be usable in countries that have strict controls on the use of + cryptography. + +7.2 Modulus and generator values + + It is RECOMMENDED that the server use values for the modulus (N) and + generator (g) chosen from those listed in Appendix A so that the + client can avoid expensive constraint checks, since these predefined + values already meet the constraints described in [RFC-2945]: + + "For maximum security, N should be a safe prime (i.e. a number of + the form N = 2q + 1, where q is also prime). Also, g should be a + generator modulo N (see [SRP] for details), which means that for + any X where 0 < X < N, there exists a value x for which g**x % N + == X." + + +7.3 Replay detection sequence number counters + + The mechanism described in this document allows the use of a Replay + Detection security service that works by including sequence number + counters in the message authentication code (MAC) created by the + Integrity Protection service. As noted in Section 4.2 integrity + protection is always activated when the Replay Detection service is + + + +Burdis & Naffah Expires February 10, 2003 [Page 26] + +Internet-Draft SRP SASL Mechanism August 2002 + + + activated. + + Both the client and the server keep two sequence number counters. + Each of these counters is a 32-bit unsigned integer initialised with + a Starting Value and incremented by an Increment Value with every + successful transmission of an SASL buffer through the security layer. + The Sent counter is incremented for each buffer sent through the + security layer. The Received counter is incremented for each buffer + received through the security layer. If the value of a sequence + number counter exceeds 2**32-1 it wraps around and starts from zero + again. + + When a sender sends a buffer it includes the value of its Sent + counter in the computation of the MAC accompanying each integrity + protected message. When a recipient receives a buffer it uses the + value of it's Received counter in its computation of the integrity + protection MAC for the received message. The recipient's Received + counter must be the same as the sender's Sent counter in order for + the received and computed MACs to match. + + This specification assumes that for each sequence number counter the + Starting Value is ZERO, and that the Increment Value is ONE. These + values do not affect the security or the intended objective of the + replay detection service, since they never travel on the wire. + +7.4 SASL Profile Considerations + + As mentioned briefly in [RFC-2222], and detailed in [SASL] a SASL + specification has three layers: (a) a protocol definition using SASL + known as the "Profile", (b) a SASL mechanism definition, and (c) the + SASL framework. + + Point (3) in section 5 of [SASL] ("Protocol profile requirements") + clearly states that it is the responsibility of the Profile to define + "...how the challenges and responses are encoded, how the server + indicates completion or failure of the exchange, how the client + aborts an exchange, and how the exchange method interacts with any + line length limits in the protocol." + + The username entity, referenced as "U" throughout this document, and + used by the server to locate the password data, is assumed to travel + "in the clear," meaning that no transformation is applied to its + contents. This assumption was made to allow the same SRP password + files to be used in this mechanism, as those used with other SRP + applications and tools. + + A Profile may decide, for privacy or other reason, to disallow such + information to travel in the clear, and instead use a hashed version + + + +Burdis & Naffah Expires February 10, 2003 [Page 27] + +Internet-Draft SRP SASL Mechanism August 2002 + + + of U, or more generally a transformation function applied to U; i.e. + f(U). Such a Profile would require additional tools to add the + required entries to the SRP password files for the new value(s) of + f(U). It is worth noting too that if this is the case, and the same + user shall access the server through this mechanism as well as + through other SRP tools, then at least two entries, one with U and + the other with f(U) need to be present in the SRP password files if + those same files are to be used for both types of access. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires February 10, 2003 [Page 28] + +Internet-Draft SRP SASL Mechanism August 2002 + + +8. Security Considerations + + This mechanism relies on the security of SRP, which bases its + security on the difficulty of solving the Diffie-Hellman problem in + the multiplicative field modulo a large safe prime. See section 4 + "Security Considerations" of [RFC-2945] and section 4 "Security + analysis" of [SRP]. + + B, the server's ephemeral public key, is computed as g**b + v = g**b + + g**x, which is symmetric and allows two guesses per *active + attack*. In practical terms, this makes no difference to the + security of SRP, since the number of active attacks needed is still + linearly proportional to the number of guesses needed; only the + constant factor (2 vs. 1) has changed. + + This mechanism also relies on the security of the HMAC algorithm and + the underlying hash function when integrity protection is used. + Section 6 "Security" of [RFC-2104] discusses these security issues in + detail. Weaknesses found in MD5 do not impact HMAC-MD5 [DOBBERTIN]. + + U, A, I and o, sent from the client to the server, and N, g, L, s and + B, sent from the server to the client could be modified by an + attacker before reaching the other party. For this reason, these + values are included in the respective calculations of evidence (M1 + and M2) to prove that each party knows the session key K. This + allows each party to verify that these values were received + unmodified. + + The use of integrity protection is RECOMMENDED to detect message + tampering and to avoid session hijacking after authentication has + taken place. + + Replay attacks may be avoided through the use of sequence numbers, + because sequence numbers make each integrity protected message + exchanged during a session different, and each session uses a + different key. + + Research [KRAWCZYK] shows that the order and way of combining message + encryption (Confidentiality Protection) and message authentication + (Integrity Protection) are important. This mechanism follows the EtA + (encrypt-then-authenticate) method and is "generically secure." + + This mechanism uses a Pseudo-Random Number Generator (PRNG) for + generating some of its parameters. Section 5.1.1 describes a + securely seeded, cryptographically strong PRNG implementation for + this purpose. + + + + + +Burdis & Naffah Expires February 10, 2003 [Page 29] + +Internet-Draft SRP SASL Mechanism August 2002 + + +9. Acknowledgements + + The following people provided valuable feedback in the preparation of + this document: + + Stephen Farrell + + Timothy Martin + + Alexey Melnikov + + Ken Murchison + + Magnus Nystrom + + Thomas Wu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires February 10, 2003 [Page 30] + +Internet-Draft SRP SASL Mechanism August 2002 + + +References + + [AES] National Institute of Standards and Technology, + "Rijndael: NIST's Selection for the AES", December + 2000, . + + [DOBBERTIN] Dobbertin, H., "The Status of MD5 After a Recent + Attack", December 1996, . + + [HAC] Menezes, A., van Oorschot, P. and S. Vanstone, + "Handbook of Applied Cryptography", CRC Press, Inc., + ISBN 0-8493-8523-7, 1997, . + + [ISO-10646] "International Standard --Information technology-- + Universal Multiple-Octet Coded Character Set (UCS) -- + Part 1 Architecture and Basic Multilingual Plane. UTF-8 + is described in Annex R, adopted but not yet published. + UTF-16 is described in Annex Q, adopted but not yet + published.", ISO/IEC 10646-1, 1993. + + [KRAWCZYK] Krawczyk, H., "The order of encryption and + authentication for protecting communications (Or: how + secure is SSL?)", June 2001, . + + [PKCS7] RSA Data Security, Inc., "PKCS #7: Cryptographic + Message Syntax Standard", Version 1.5, November 1993, + . + + [RFC-1423] Balenson, D., "Privacy Enhancement for Internet + Electronic Mail: Part III: Algorithms, Modes, and + Identifiers", RFC 1423, February 1993, . + + [RFC-2104] Krawczyk, H., "HMAC: Keyed-Hashing for Message + Authentication", RFC 2104, February 1997, . + + [RFC-2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 0014, RFC 2119, March 1997, + . + + [RFC-2222] Myers, J., "Simple Authentication and Security Layer + (SASL)", RFC 2222, October 1997, . + + + +Burdis & Naffah Expires February 10, 2003 [Page 31] + +Internet-Draft SRP SASL Mechanism August 2002 + + + [RFC-2279] Yergeau, F., "UTF-8, a transformation format of Unicode + and ISO 10646", RFC 2279, January 1998, . + + [RFC-2440] Callas, J., Donnerhacke, L., Finney, H. and R. Thayer, + "OpenPGP Message Format", RFC 2440, November 1998, + . + + [RFC-2554] Myers, J., "SMTP Service Extension for Authentication", + RFC 2554, March 1999. + + [RFC-2629] Rose, M., "Writing I-Ds and RFCs using XML", RFC 2629, + June 1999, . + + [RFC-2847] Eisler, M., "LIPKEY - A Low Infrastructure Public Key + Mechanism Using SPKM", RFC 2847, June 2000, . + + [RFC-2945] Wu, T., "The SRP Authentication and Key Exchange + System", RFC 2945, September 2000, . + + [SASL] Myers, J., "Simple Authentication and Security Layer + (SASL)", April 2001, . + + [SCAN] Hopwood, D., "Standard Cryptographic Algorithm Naming", + June 2000, . + + [SRP] Wu, T., "The Secure Remote Password Protocol", March + 1998, . + + [SRP-impl] Wu, T., "SRP: The Open Source Password Authentication + Standard", March 1998, . + + [UMAC] Krovetz, T., Black, J., Halevi, S., Hevia, A., + Krawczyk, H. and P. Rogaway, "UMAC: Message + Authentication Code using Universal Hashing", October + 2000, . + + [UNICODE-KC] Durst, D., "Unicode Standard Annex #15: Unicode + Normalization Forms.", March 2001, . + + + + + + +Burdis & Naffah Expires February 10, 2003 [Page 32] + +Internet-Draft SRP SASL Mechanism August 2002 + + +Authors' Addresses + + Keith Burdis + Rhodes University + Computer Science Department + Grahamstown 6139 + ZA + + EMail: keith@rucus.ru.ac.za + + + Raif S. Naffah + Forge Research Pty. Limited + Suite 116, Bay 9 + Locomotive Workshop, + Australian Technology Park + Cornwallis Street + Eveleigh, NSW 1430 + AU + + EMail: raif@forge.com.au + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires February 10, 2003 [Page 33] + +Internet-Draft SRP SASL Mechanism August 2002 + + +Appendix A. Modulus and Generator values + + Modulus (N) and generator (g) values for various modulus lengths are + given below. In each case the modulus is a large safe prime and the + generator is a primitve root of GF(n) [RFC-2945]. These values are + taken from software developed by Tom Wu and Eugene Jhong for the + Stanford SRP distribution [SRP-impl]. + + + [264 bits] + Modulus (base 16) = + 115B8B692E0E045692CF280B436735C77A5A9E8A9E7ED56C965F87DB5B2A2 + ECE3 + Generator = 2 + + [384 bits] + Modulus (base 16) = + 8025363296FB943FCE54BE717E0E2958A02A9672EF561953B2BAA3BAACC3E + D5754EB764C7AB7184578C57D5949CCB41B + Generator = 2 + + [512 bits] + Modulus (base 16) = + D4C7F8A2B32C11B8FBA9581EC4BA4F1B04215642EF7355E37C0FC0443EF75 + 6EA2C6B8EEB755A1C723027663CAA265EF785B8FF6A9B35227A52D86633DB + DFCA43 + Generator = 2 + + [640 bits] + Modulus (base 16) = + C94D67EB5B1A2346E8AB422FC6A0EDAEDA8C7F894C9EEEC42F9ED250FD7F0 + 046E5AF2CF73D6B2FA26BB08033DA4DE322E144E7A8E9B12A0E4637F6371F + 34A2071C4B3836CBEEAB15034460FAA7ADF483 + Generator = 2 + + [768 bits] + Modulus (base 16) = + B344C7C4F8C495031BB4E04FF8F84EE95008163940B9558276744D91F7CC9 + F402653BE7147F00F576B93754BCDDF71B636F2099E6FFF90E79575F3D0DE + 694AFF737D9BE9713CEF8D837ADA6380B1093E94B6A529A8C6C2BE33E0867 + C60C3262B + Generator = 2 + + [1024 bits] + Modulus (base 16) = + EEAF0AB9ADB38DD69C33F80AFA8FC5E86072618775FF3C0B9EA2314C9C256 + 576D674DF7496EA81D3383B4813D692C6E0E0D5D8E250B98BE48E495C1D60 + 89DAD15DC7D7B46154D6B6CE8EF4AD69B15D4982559B297BCF1885C529F56 + + + +Burdis & Naffah Expires February 10, 2003 [Page 34] + +Internet-Draft SRP SASL Mechanism August 2002 + + + 6660E57EC68EDBC3C05726CC02FD4CBF4976EAA9AFD5138FE8376435B9FC6 + 1D2FC0EB06E3 + Generator = 2 + + [1280 bits] + Modulus (base 16) = + D77946826E811914B39401D56A0A7843A8E7575D738C672A090AB1187D690 + DC43872FC06A7B6A43F3B95BEAEC7DF04B9D242EBDC481111283216CE816E + 004B786C5FCE856780D41837D95AD787A50BBE90BD3A9C98AC0F5FC0DE744 + B1CDE1891690894BC1F65E00DE15B4B2AA6D87100C9ECC2527E45EB849DEB + 14BB2049B163EA04187FD27C1BD9C7958CD40CE7067A9C024F9B7C5A0B4F5 + 003686161F0605B + Generator = 2 + + [1536 bits] + Modulus (base 16) = + 9DEF3CAFB939277AB1F12A8617A47BBBDBA51DF499AC4C80BEEEA9614B19C + C4D5F4F5F556E27CBDE51C6A94BE4607A291558903BA0D0F84380B655BB9A + 22E8DCDF028A7CEC67F0D08134B1C8B97989149B609E0BE3BAB63D4754838 + 1DBC5B1FC764E3F4B53DD9DA1158BFD3E2B9C8CF56EDF019539349627DB2F + D53D24B7C48665772E437D6C7F8CE442734AF7CCB7AE837C264AE3A9BEB87 + F8A2FE9B8B5292E5A021FFF5E91479E8CE7A28C2442C6F315180F93499A23 + 4DCF76E3FED135F9BB + Generator = 2 + + [2048 bits] + Modulus (base 16) = + AC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC3192943DB56 + 050A37329CBB4A099ED8193E0757767A13DD52312AB4B03310DCD7F48A9DA + 04FD50E8083969EDB767B0CF6095179A163AB3661A05FBD5FAAAE82918A99 + 62F0B93B855F97993EC975EEAA80D740ADBF4FF747359D041D5C33EA71D28 + 1E446B14773BCA97B43A23FB801676BD207A436C6481F1D2B9078717461A5 + B9D32E688F87748544523B524B0D57D5EA77A2775D2ECFA032CFBDBF52FB3 + 786160279004E57AE6AF874E7303CE53299CCC041C7BC308D82A5698F3A8D + 0C38271AE35F8E9DBFBB694B5C803D89F7AE435DE236D525F54759B65E372 + FCD68EF20FA7111F9E4AFF73 + Generator = 2 + + + + + + + + + + + + + + +Burdis & Naffah Expires February 10, 2003 [Page 35] + +Internet-Draft SRP SASL Mechanism August 2002 + + +Appendix B. Changes since the previous draft + + Removed the references to Rijndael since, strictly speaking it is not + the AES. This should also eliminate any ambiguities as to the + required block and key sizes this specification refers to when + mentioning the AES. + + Removed the requirement for (a) an all-zero IV, and (b) a dummy first + block in the operations of the Confidentiality Service filter. + + Included the description of a secure PRNG. + + Included the description of a Key Derivation Function (KDF) to ensure + there will always be enough bytes to initialise both the CALG and + IALG from the shared context key computed by the SRP calculations. + + Added a paragraph before the end of the "Security layer" section to + clarify that this specification does not mandate nor imply a lockstep + in operating the security services. + + Added a paragraph to the "Security considerations" section about the + quality of the PRNG to use. + + Added the restriction that all text should be in Unicode + Normalization form KC with NULs prohibited. + + Tightened up the restrictions on the options lists L and o by + specifying that they must not contain any whitespace and must always + be in lowercase. Changed "replay detection" to "replay_detection". + This should simplify parsing of these lists. + + Added explicit notes that parameters received from the other party + must be used as received in all digest calculations. Clearly any + alteration of these input parameters (such as changing the case of + text) will prevent the digest calculations on each side from + producing the same result. + + Made it mandatory for the server to advertise at least one integrity + protection algorithm and recommended that the HMAC-SHA-160 algorithm + always be advertised. Recommended that the server always make + integrity protection mandatory. + + Recommended that the client always select integrity protection, even + if the server does not make it mandatory to do so. Also recommended + that the client always select integrity protection when it selects + confidentiality protection. + + Added Alexey Melnikov to Section 9. + + + +Burdis & Naffah Expires February 10, 2003 [Page 36] + +Internet-Draft SRP SASL Mechanism August 2002 + + + Added a quote from section 3 of [RFC-2222] to the description of the + security layer in Section 8 to describe the operation of the security + layer in SASL. + + TODO: Amend the Cryptix SASL library and re-generate the example. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires February 10, 2003 [Page 37] + +Internet-Draft SRP SASL Mechanism August 2002 + + +Full Copyright Statement + + Copyright (C) The Internet Society (2002). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + +Burdis & Naffah Expires February 10, 2003 [Page 38] + diff --git a/doc/specification/draft-ietf-cat-sasl-gssapi-05.txt b/doc/specification/draft-ietf-cat-sasl-gssapi-05.txt new file mode 100644 index 0000000..97355fd --- /dev/null +++ b/doc/specification/draft-ietf-cat-sasl-gssapi-05.txt @@ -0,0 +1,843 @@ + + + + + + +Network Working Group J. Myers +Internet Draft Netscape Communications +Document: draft-ietf-cat-sasl-gssapi-05.txt May 2001 + + + SASL GSSAPI mechanisms + +Status of this Memo + + Internet-Drafts are working documents of the Internet Engineering + Task Force (IETF), its areas, and its working groups. Note that + other groups may also distribute working documents as Internet- + Drafts. + + Internet-Drafts are draft documents valid for a maximum of six months + and may be updated, replaced, or obsoleted by other documents at any + time. It is inappropriate to use Internet- Drafts as reference + material or to cite them other than as "work in progress." + + The list of current Internet-Drafts can be accessed at + http://www.ietf.org/ietf/1id-abstracts.txt + + The list of Internet-Draft Shadow Directories can be accessed at + http://www.ietf.org/shadow.html. + + This document is an Internet-Draft and is in full conformance with + all provisions of Section 10 of RFC2026. + + A revised version of this draft document will be submitted to the RFC + editor as a Proposed Standard for the Internet Community. Discussion + and suggestions for improvement are requested. + + NOTE TO RFC EDITOR: Prior to publication as an RFC, the RFC Editor is + directed to replace occurrences of "[THIS-DOC]" with the RFC number + assigned to this document. + + + + + + + + + + + + + + + + +J. Myers [Page i] + +Internet DRAFT GSSAPI SASL mechanisms May 30, 2001 + + + + + + Table of Contents + + + +Status of this Memo ............................................... i +1. Abstract .................................................... 2 +2. Conventions Used in this Document ........................... 2 +3. Introduction and Overview ................................... 2 +3.1 Example ..................................................... 3 +4. SPNEGO ...................................................... 3 +5. Base32 encoding ............................................. 3 +6. Specification common to all GSSAPI mechanisms ............... 5 +6.1. Client side of authentication protocol exchange ............. 5 +6.2. Server side of authentication protocol exchange ............. 6 +6.3. Security layer .............................................. 7 +7. IANA Considerations ......................................... 7 +8. References .................................................. 9 +9. Security Considerations ..................................... 9 +10. Author's Address ............................................ 10 +Appendix A. Sample code ........................................... 11 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +J. Myers [Page ii] + +Internet DRAFT GSSAPI SASL mechanisms May 30, 2001 + + +1. Abstract + + The Simple Authentication and Security Layer [SASL] is a method for + adding authentication support to connection-based protocols. This + document describes the method for using the Generic Security Service + Application Program Interface [GSSAPI] in the Simple Authentication + and Security Layer [SASL]. + + This document replaces section 7.2 of RFC 2222 [SASL], the definition + of the "GSSAPI" SASL mechanism. + +2. Conventions Used in this Document + + The key words "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", and "MAY" + in this document are to be interpreted as defined in "Key words for + use in RFCs to Indicate Requirement Levels" [KEYWORDS]. + +3. Introduction and Overview + + Each and every GSSAPI mechanism used within SASL is implicitly + registered by this specification. + + For backwards compatibility with existing implementations of Kerberos + V5 and SPNEGO under SASL, the SASL mechanism name for the Kerberos V5 + GSSAPI mechanism [GSSAPI-KERBEROS] is "GSSAPI" and the SASL mechanism + for the SPNEGO GSSAPI mechanism [SPNEGO] is "GSS-SPNEGO". The SASL + mechanism name for any other GSSAPI mechanism is the concatenation of + "GSS-" and the Base32 encoding of the first ten bytes of the MD5 hash + [MD5] of the ASN.1 DER encoding [ASN1] of the GSSAPI mechanism's OID. + Base32 encoding is described later in this document. The Base32 + rules on padding characters and characters outside of the base32 + alphabet are not relevant to this use of Base32. + + SASL mechanism names starting with "GSS-" are reserved for SASL + mechanisms which conform to this document. + + The specification of all SASL mechanisms conforming to this document + is in the "Specification common to all GSSAPI mechanisms" section of + this document. + + The IESG is considered to be the owner of all SASL mechanisms which + conform to this document. This does NOT necessarily imply that the + IESG is considered to be the owner of the underlying GSSAPI + mechanism. + + + + + + + +J. Myers [Page 2] + +Internet DRAFT GSSAPI SASL mechanisms May 30, 2001 + + +3.1 Example + + The OID for the SPKM-1 mechanism [SPKM] is 1.3.6.1.5.5.1. The ASN.1 + DER encoding of this OID is 06 06 2b 06 01 05 05 01. The MD5 hash of + the ASN.1 DER encoding is 57 ee 81 82 4e ac 4d b0 e6 50 9f 60 1f 46 + 8a 30. The Base32 encoding of the first ten bytes of this is + "K7XIDASOVRG3BZSQ". Thus the SASL mechanism name for the SPKM-1 + GSSAPI mechanism is "GSS-K7XIDASOVRG3BZSQ". + +4. SPNEGO + + Use of the Simple and Protected GSS-API Negotiation Mechanism + [SPNEGO] underneath SASL introduces subtle interoperability problems + and security considerations. To address these, this section places + additional requirements on implementations which support SPNEGO + underneath SASL. + + A client which supports, for example, the Kerberos V5 GSSAPI + mechanism only underneath SPNEGO underneath the "GSS-SPNEGO" SASL + mechanism will not interoperate with a server which supports the + Kerberos V5 GSSAPI mechanism only underneath the "GSSAPI" SASL + mechanism. + + Since SASL is capable of negotiating amongst GSSAPI mechanisms, the + only reason for a server or client to support the "GSS-SPNEGO" + mechanism is to allow a policy of only using mechanisms below a + certain strength if those mechanism's negotiation is protected. In + such a case, a client or server would only want to negotiate those + weaker mechanisms through SPNEGO. In any case, there is no down- + negotiation security consideration with using the strongest mechanism + and set of options the implementation supports, so for + interoperability that mechanism and set of options MUST be negotiable + without using the "GSS-SPNEGO" mechanism. + + If a client's policy is to first prefer GSSAPI mechanism X, then + non-GSSAPI mechanism Y, then GSSAPI mechanism Z, and if a server + supports mechanisms Y and Z but not X, then if the client attempts to + negotiate mechanism X by using the "GSS-SPNEGO" SASL mechanism, it + may end up using mechanism Z when it should have used mechanism Y. + For this reason, implementations MUST exclude from SPNEGO those + GSSAPI mechanisms which are weaker than the strongest non-GSSAPI SASL + mechanism advertised by the server. + +5. Base32 encoding + + The Base32 encoding is designed to represent arbitrary sequences of + octets in a form that needs to be case insensitive but need not be + humanly readable. + + + +J. Myers [Page 3] + +Internet DRAFT GSSAPI SASL mechanisms May 30, 2001 + + + A 33-character subset of US-ASCII is used, enabling 5 bits to be + represented per printable character. (The extra 33rd character, "=", + is used to signify a special processing function.) + + The encoding process represents 40-bit groups of input bits as output + strings of 8 encoded characters. Proceeding from left to right, a + 40-bit input group is formed by concatenating 5 8bit input groups. + These 40 bits are then treated as 8 concatenated 5-bit groups, each + of which is translated into a single digit in the base32 alphabet. + When encoding a bit stream via the base32 encoding, the bit stream + must be presumed to be ordered with the most-significant-bit first. + That is, the first bit in the stream will be the high-order bit in + the first 8bit byte, and the eighth bit will be the low-order bit in + the first 8bit byte, and so on. + + Each 5-bit group is used as an index into an array of 32 printable + characters. The character referenced by the index is placed in the + output string. These characters, identified in Table 1, below, are + selected from US-ASCII digits and uppercase letters. + + Table 1: The Base32 Alphabet + + Value Encoding Value Encoding Value Encoding Value Encoding + 0 A 9 J 18 S 27 3 + 1 B 10 K 19 T 28 4 + 2 C 11 L 20 U 29 5 + 3 D 12 M 21 V 30 6 + 4 E 13 N 22 W 31 7 + 5 F 14 O 23 X + 6 G 15 P 24 Y (pad) = + 7 H 16 Q 25 Z + 8 I 17 R 26 2 + + Special processing is performed if fewer than 40 bits are available + at the end of the data being encoded. A full encoding quantum is + always completed at the end of a body. When fewer than 40 input bits + are available in an input group, zero bits are added (on the right) + to form an integral number of 5-bit groups. Padding at the end of + the data is performed using the "=" character. Since all base32 + input is an integral number of octets, only the following cases can + arise: (1) the final quantum of encoding input is an integral + multiple of 40 bits; here, the final unit of encoded output will be + an integral multiple of 8 characters with no "=" padding, (2) the + final quantum of encoding input is exactly 8 bits; here, the final + unit of encoded output will be two characters followed by six "=" + padding characters, (3) the final quantum of encoding input is + exactly 16 bits; here, the final unit of encoded output will be four + characters followed by four "=" padding characters, (4) the final + + + +J. Myers [Page 4] + +Internet DRAFT GSSAPI SASL mechanisms May 30, 2001 + + + quantum of encoding input is exactly 24 bits; here, the final unit of + encoded output will be five characters followed by three "=" padding + characters, or (5) the final quantum of encoding input is exactly 32 + bits; here, the final unit of encoded output will be seven characters + followed by one "=" padding character. + + Because it is used only for padding at the end of the data, the + occurrence of any "=" characters may be taken as evidence that the + end of the data has been reached (without truncation in transit). No + such assurance is possible, however, when the number of octets + transmitted was a multiple of 8 and no "=" characters are present. + + Any characters outside of the base32 alphabet are to be ignored in + base32-encoded data. + +6. Specification common to all GSSAPI mechanisms + + Each SASL mechanism which uses a GSSAPI mechanism uses the following + specification. + + The implementation MAY set any GSSAPI flags or arguments not + mentioned in this specification as is necessary for the + implementation to enforce its security policy. + +6.1. Client side of authentication protocol exchange + + The client calls GSS_Init_sec_context, passing in + input_context_handle of 0 (initially), mech_type of the GSSAPI + mechanism for which this SASL mechanism is registered, chan_binding + of NULL, and targ_name equal to output_name from GSS_Import_Name + called with input_name_type of GSS_C_NT_HOSTBASED_SERVICE and + input_name_string of "service@hostname" where "service" is the + service name specified in the protocol's profile, and "hostname" is + the fully qualified host name of the server. If the client will be + requesting a security layer, it MUST also supply to the + GSS_Init_sec_context a mutual_req_flag of TRUE, a sequence_req_flag + of TRUE, and an integ_req_flag of TRUE. If the client will be + requesting a security layer providing confidentiality protection, it + MUST also supply to the GSS_Init_sec_context a conf_req_flag of TRUE. + The client then responds with the resulting output_token. If + GSS_Init_sec_context returns GSS_S_CONTINUE_NEEDED, then the client + should expect the server to issue a token in a subsequent challenge. + The client must pass the token to another call to + GSS_Init_sec_context, repeating the actions in this paragraph. + + When GSS_Init_sec_context returns GSS_S_COMPLETE, the client examines + the context to ensure that it provides a level of protection + permitted by the client's security policy. If the context is + + + +J. Myers [Page 5] + +Internet DRAFT GSSAPI SASL mechanisms May 30, 2001 + + + acceptable, the client takes the following actions: If the last call + to GSS_Init_sec_context returned an output_token, then the client + responds with the output_token, otherwise the client responds with no + data. The client should then expect the server to issue a token in a + subsequent challenge. The client passes this token to GSS_Unwrap and + interprets the first octet of resulting cleartext as a bit-mask + specifying the security layers supported by the server and the second + through fourth octets as the network byte order maximum size + output_message to send to the server (if the resulting cleartext is + not 4 octets long, the client fails the negotiation). The client + then constructs data, with the first octet containing the bit-mask + specifying the selected security layer, the second through fourth + octets containing in network byte order the maximum size + output_message the client is able to receive, and the remaining + octets containing the UTF-8 encoded [UTF8] authorization identity. + The authorization identity is not NUL-terminated. The client passes + the data to GSS_Wrap with conf_flag set to FALSE, and responds with + the generated output_message. The client can then consider the + server authenticated. + +6.2. Server side of authentication protocol exchange + + The server passes the initial client response to + GSS_Accept_sec_context as input_token, setting input_context_handle + to 0 (initially), mech_type of the GSSAPI mechanism for which this + SASL mechanism is registered, chan_binding of NULL, and + acceptor_cred_handle equal to output_cred_handle from + GSS_Acquire_cred called with desired_name equal to output_name from + GSS_Import_name with input_name_type of GSS_C_NT_HOSTBASED_SERVICE + and input_name_string of "service@hostname" where "service" is the + service name specified in the protocol's profile, and "hostname" is + the fully qualified host name of the server. If + GSS_Accept_sec_context returns GSS_S_CONTINUE_NEEDED, the server + returns the generated output_token to the client in challenge and + passes the resulting response to another call to + GSS_Accept_sec_context, repeating the actions in this paragraph. + + When GSS_Accept_sec_context returns GSS_S_COMPLETE, the server + examines the context to ensure that it provides a level of protection + permitted by the server's security policy. If the context is + acceptable, the server takes the following actions: If the last call + to GSS_Accept_sec_context returned an output_token, the server + returns it to the client in a challenge and expects a reply from the + client with no data. Whether or not an output_token was returned + (and after receipt of any response from the client to such an + output_token), the server then constructs 4 octets of data, with the + first octet containing a bit-mask specifying the security layers + supported by the server and the second through fourth octets + + + +J. Myers [Page 6] + +Internet DRAFT GSSAPI SASL mechanisms May 30, 2001 + + + containing in network byte order the maximum size output_token the + server is able to receive. The server must then pass the plaintext + to GSS_Wrap with conf_flag set to FALSE and issue the generated + output_message to the client in a challenge. The server must then + pass the resulting response to GSS_Unwrap and interpret the first + octet of resulting cleartext as the bit-mask for the selected + security layer, the second through fourth octets as the network byte + order maximum size output_message to send to the client, and the + remaining octets as the authorization identity. The server must + verify that the src_name is authorized to authenticate as the + authorization identity. After these verifications, the + authentication process is complete. + +6.3. Security layer + + The security layers and their corresponding bit-masks are as follows: + + 1 No security layer + 2 Integrity protection. + Sender calls GSS_Wrap with conf_flag set to FALSE + 4 Confidentiality protection. + Sender calls GSS_Wrap with conf_flag set to TRUE + + Other bit-masks may be defined in the future; bits which are not + understood must be negotiated off. + + Note that SASL negotiates the maximum size of the output_message to + send. Implementations can use the GSS_Wrap_size_limit call to + determine the corresponding maximum size input_message. + +7. IANA Considerations + + The IANA is advised that SASL mechanism names starting with "GSS-" + are reserved for SASL mechanisms which conform to this document. The + IANA is directed to place a statement to that effect in the sasl- + mechanisms registry. + + The IANA is directed to modify the existing registration for "GSSAPI" + in the "sasl-mechanisms" so that RFC [THIS-DOC] is listed as the + published specification. Add the descriptive text "This mechanism is + for the Kerberos V5 mechanism of GSSAPI. Other GSSAPI mechanisms use + other SASL mechanism names, as described in this mechanism's + published specification." + + The IANA is directed to modify the existing registration for "GSS- + SPNEGO" as follows. + + SASL mechanism name: GSS-SPNEGO + + + +J. Myers [Page 7] + +Internet DRAFT GSSAPI SASL mechanisms May 30, 2001 + + + Security considerations: See the "SPNEGO" section of RFC [THIS-DOC]. + + Published Specification: RFC [THIS-DOC] + + Intended usage: LIMITED USE + + Author/Change controller: iesg@ietf.org + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +J. Myers [Page 8] + +Internet DRAFT GSSAPI SASL mechanisms May 30, 2001 + + +8. References + + [ASN1] ISO/IEC 8824, "Specification of Abstract Syntax Notation One + (ASN.1)" + + [GSSAPI] Linn, J., "Generic Security Service Application Program + Interface Version 2, Update 1", RFC 2743, January 2000 + + [GSSAPI-KERBEROS] Linn, J., "The Kerberos Version 5 GSS-API + Mechanism", RFC 1964, June 1996 + + [IMAP4] Crispin, M., "Internet Message Access Protocol - Version 4", + RFC 1730, University of Washington, December 1994. + + [KEYWORDS] Bradner, "Key words for use in RFCs to Indicate + Requirement Levels", RFC 2119, March 1997 + + [MD5] Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321, April + 1992 + + [SASL] Myers, J., "Simple Authentication and Security Layer (SASL)", + RFC 2222, October 1997 + + [SPKM] Adams, C., "The Simple Public-Key GSS-API Mechanism (SPKM)", + RFC 2025, October 1996 + + [SPNEGO] Baize, E., Pinkas., D., "The Simple and Protected GSS-API + Negotiation Mechanism", RFC 2478, December 1998 + + [UTF8] Yergeau, F., "UTF-8, a transformation format of ISO 10646", + RFC 2279, January 1998 + +9. Security Considerations + + Security issues are discussed throughout this memo. + + When a server or client supports multiple authentication mechanisms, + each of which has a different security strength, it is possible for + an active attacker to cause a party to use the least secure mechanism + supported. To protect against this sort of attack, a client or + server which supports mechanisms of different strengths should have a + configurable minimum strength that it will use. It is not sufficient + for this minimum strength check to only be on the server, since an + active attacker can change which mechanisms the client sees as being + supported, causing the client to send authentication credentials for + its weakest supported mechanism. + + The client's selection of a SASL mechanism is done in the clear and + + + +J. Myers [Page 9] + +Internet DRAFT GSSAPI SASL mechanisms May 30, 2001 + + + may be modified by an active attacker. It is important for any new + SASL mechanisms to be designed such that an active attacker cannot + obtain an authentication with weaker security properties by modifying + the SASL mechanism name and/or the challenges and responses. + + SPNEGO [SPNEGO] has protection against many of these down-negotiation + attacks, SASL does not itself have such protection. The section + titled "SPNEGO" mentions considerations of choosing negotiation + through SASL versus SPNEGO. + + The integrity protection provided by the security layer is useless to + the client unless the client also requests mutual authentication. + Therefore, a client wishing to benefit from the integrity protection + of a security layer MUST pass to the GSS_Init_sec_context call a + mutual_req_flag of TRUE. + + Additional security considerations are in the SASL [SASL] and GSSAPI + [GSSAPI] specifications. + +10. Author's Address + + John G. Myers + Netscape Communications + 501 E. Middlefield Road + Mail Stop SCA 15:201 + Mountain View, CA 94043-4042 + + Email: jgmyers@netscape.com + + + + + + + + + + + + + + + + + + + + + + + +J. Myers [Page 10] + +Internet DRAFT GSSAPI SASL mechanisms May 30, 2001 + + +Appendix A. Sample code + + The following is an example program which converts mechanism OIDs (of + the form "1.3.6.1.5.5.1") to SASL mechanism names. This sample + program uses the reference MD5 implementation in [MD5]. + + #include + #include "md5.h" + + static const + struct compat_map { + const unsigned char oid[15]; + const char *saslname; + } compat_map[] = { + { { 0x06, 0x05, 0x2b, 0x05, 0x01, 0x05, 0x02 }, "GSSAPI" }, + { { 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x01, 0x02, 0x02 }, + "GSSAPI" }, /* old Kerberos V5 OID */ + { { 0x06, 0x06, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x02 }, "GSS-SPNEGO" }, + }; + + static unsigned long parsenum(char **ptr) + { + unsigned long rval = 0; + while (**ptr >= '0' && **ptr <= '9') { + rval = rval * 10 + *(*ptr)++ - '0'; + } + return rval; + } + + static void asn1encode(unsigned long val, unsigned char **buf) + { + unsigned long tmpval; + int noctets = 1; + for (tmpval = val; tmpval >= 128; tmpval >>= 7) noctets++; + while (--noctets) { + *(*buf)++ = ((val >> (7 * noctets)) & 0x7f) | 0x80; + } + *(*buf)++ = val & 0x7f; + } + + static char basis_32[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; + + /* + * Convert the GSSAPI mechanism 'oid' of length 'oidlen', placing + * the result into 'retbuf', which must be of size 21 + */ + void oidToSaslMech(const unsigned char *oid, unsigned oidlen, char *retbuf) + { + + + +J. Myers [Page 11] + +Internet DRAFT GSSAPI SASL mechanisms May 30, 2001 + + + int i; + MD5_CTX md5ctx; + unsigned char md5buf[16]; + char *out; + unsigned char *in; + unsigned char *p; + int len; + + /* See if it has a backwards-compatibility SASL mechanism name */ + for (i = 0; i < (sizeof(compat_map) / sizeof(compat_map[0])); i++) { + if (memcmp(compat_map[i].oid, oid, oidlen) == 0) { + strcpy(retbuf, compat_map[i].saslname); + return; + } + } + + MD5Init(&md5ctx); + MD5Update(&md5ctx, (unsigned char *)oid, oidlen); + MD5Final(md5buf, &md5ctx); + + printf("MD5 hash: "); + for (p = md5buf; p < md5buf + 16; p++) { + printf("%02x ", *p); + } + printf("\n"); + + in = md5buf; + strcpy(retbuf, "GSS-"); + out = retbuf + strlen(retbuf); + len = 10; + while (len) { + *out++ = basis_32[in[0] >> 3]; + *out++ = basis_32[((in[0] & 7) << 2) | (in[1] >> 6)]; + *out++ = basis_32[(in[1] & 0x3f) >> 1]; + *out++ = basis_32[((in[1] & 1) << 4) | (in[2] >> 4)]; + *out++ = basis_32[((in[2] & 0xf) << 1) | (in[3] >> 7)]; + *out++ = basis_32[(in[3] & 0x7f) >> 2]; + *out++ = basis_32[((in[3] & 3) << 3) | (in[4] >> 5)]; + *out++ = basis_32[(in[4] & 0x1f)]; + in += 5; + len -= 5; + } + *out++ = '\0'; + } + + main(int argc, char **argv) + { + char *oidstr; + + + +J. Myers [Page 12] + +Internet DRAFT GSSAPI SASL mechanisms May 30, 2001 + + + unsigned long val1, val2; + unsigned char asn1buf[1024]; + unsigned char *asn1start = asn1buf + 4; + unsigned char *asn1next = asn1start; + unsigned char *asn1lennext; + unsigned char *p; + MD5_CTX md5ctx; + unsigned char md5buf[16]; + char saslmechbuf[21]; + int i; + + if (argc != 2) { + fprintf(stderr, "usage: %s oid\n", argv[0]); + exit(1); + } + + oidstr = argv[1]; + val1 = parsenum(&oidstr); + if (*oidstr++ != '.') goto badoid; + val2 = parsenum(&oidstr); + if (*oidstr && *oidstr++ != '.') goto badoid; + *asn1next++ = val1 * 40 + val2; + + while (*oidstr) { + val1 = parsenum(&oidstr); + if (*oidstr && *oidstr++ != '.') goto badoid; + + asn1encode(val1, &asn1next); + } + + /* Now that we know the length of the OID, generate the tag + * and length + */ + asn1lennext = asn1next; + *asn1lennext++ = 6; + asn1encode(asn1next - asn1start, &asn1lennext); + + /* Copy tag and length to beginning */ + memcpy(asn1start - (asn1lennext - asn1next), asn1next, + asn1lennext - asn1next); + asn1start -= asn1lennext - asn1next; + + printf("ASN.1 DER encoding: "); + for (p = asn1start; p < asn1next; p++) { + printf("%02x ", *p); + } + printf("\n"); + + + + +J. Myers [Page 13] + +Internet DRAFT GSSAPI SASL mechanisms May 30, 2001 + + + oidToSaslMech(asn1start, asn1next - asn1start, saslmechbuf); + printf("SASL mechanism name: %s\n", saslmechbuf); + + exit(0); + + badoid: + fprintf(stderr, "bad oid syntax\n"); + exit(1); + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +J. Myers [Page 14] + \ No newline at end of file diff --git a/doc/specification/draft-ietf-ldapext-x509-sasl-03.txt b/doc/specification/draft-ietf-ldapext-x509-sasl-03.txt new file mode 100644 index 0000000..dd4e498 --- /dev/null +++ b/doc/specification/draft-ietf-ldapext-x509-sasl-03.txt @@ -0,0 +1,576 @@ + +Network Working Group S.E. Kille +INTERNET-DRAFT MessagingDirect Inc. +Expires in six months February 2000 +Intended Category: Standard + + + X.509 Authentication SASL Mechanism + + +1. Status of this Memo + +This document is an Internet-Draft and is in full conformance with all +provisions of Section 10 of RFC2026. Internet-Drafts are working docu- +ments of the Internet Engineering Task Force (IETF), its areas, and its +working groups. Note that other groups may also distribute working +documents as Internet-Drafts. + +Internet-Drafts are draft documents valid for a maximum of six months +and may be updated, replaced, or obsoleted by other documents at any +time. It is inappropriate to use Internet-Drafts as reference material +or to cite them other than as "work in progress." + + The list of current Internet-Drafts can be accessed at + http://www.ietf.org/ietf/1id-abstracts.txt + + The list of Internet-Draft Shadow Directories can be accessed at + http://www.ietf.org/shadow.html. + + + +To learn the current status of any Internet-Draft, please check the +"1id-abstracts.txt" listing contained in the Internet-Drafts Shadow +Directories on ds.internic.net (US East Coast), nic.nordu.net (Europe), +ftp.isi.edu (US West Coast), or munnari.oz.au (Pacific Rim). + +2. Abstract + +This document defines a SASL [1] authentication mechanism based on X.509 +strong authentication [3], providing two way authentication. This +mechanism is only for authentication, and has no effect on the protocol +encodings and is not designed to provide integrity or confidentiality +services. + +3. Model + +The mechanism provides two way strong authentication as defined in +X.509. The encoding is based on that used by X.500 in the DAP, DSP, and +DISP protocols. + +The mechanism is based on use of an asymmetric (public key) signing +mechanism. This SASL mechanism contains two authentication mechanisms: + +- Client authentication is where the client provides information to + the server, so that the server can authenticate the client. + +- Server authentication is where the server provides information to + + + +Kille [Page 1] + + +Expires August 2000 IP X.509 SASL Authentication INTERNET DRAFT + + + the client, so that the client can authenticate the server. + + +This mechanism is given three SASL keys for different variants: + +- "X509-C-" for client authentication only. + +- "X509-S-" for server authentication only. + +- "X509-B-" for client and server authentication. In this + case client authentication is done prior to server authentication. + +Each SASL key may be used with a list of algorithms. A list of sup- +ported algorithms is given in Section 7. + +For Client Authentication ("X509-C-"): + +1. The client generates the credentials (SASLStrongCredentials) from + information on both parties and a random number, and signs the + enclosed token with its own private key. + +2. The client sends credentials to the server. + +3. The server verifies these credentials using the client's public + key, and the authentication is complete. + +For Server Authentication ("X509-S-"): + +1. The server generates the credentials (SASLStrongCredentials) from + information on both parties and a random number, and signs the + enclosed token with its own private key. + +2. The server sends credentials to the client. + +3. The client verifies these credentials using the server's public + key, and the authentication is complete. + +For most SASL based protocols, server only authentication will not be +useful. However, this is included here, as the definition is required +for "client and server", and it may be useful for future protocols. + +For Client and Server Authentication ("X509-B-"), the procedure for +"X509-C-" is performed and then followed by the procedure for "X509-S-". +The Client needs to go first, as for some protocols the server will need +to get information about the client from the client authentication in +order to be able to perform the server authentication. + + + + + +Kille [Page 2] + + +Expires August 2000 IP X.509 SASL Authentication INTERNET DRAFT + + +3.1. Encoding + +The SASLStrongCredentials, which is the definition of the data format +exchanged, is encoded using ASN.1 Distinguished Encoding Rules (DER). + +4. Why this SASL Mechanism is Needed + +This section discusses the requirements for this SASL mechanism. + +4.1. Benefits of a Public Key Mechanism + +The key benefit of asymmetric (public key) security, is that the secret +(private key) only needs to be placed with the entity that is being +authenticated. Thus a private key can be issued to a client, which can +then be authenticated by ANY server based on a token generated by the +client and the generally available public key. Symmetric authentication +mechanisms (password mechanisms such as CRAM-MD5) require a shared +secret, and the need to maintain it at both endpoints. This means that +a secret key for the client needs to be maintained at every server which +may need to authenticate the client. + +This is particularly an issue for protocols such as LDAP, where a client +may connect to and be authenticated by a large number of servers. In +this situation, the requirement to maintain secret keys on all possible +servers is not practical, which makes authentication mechanisms such as +CRAM-MD5 unsuitable for LDAP in many situations. + +4.2. Why Authentication Only? + +This service provides authentication only. The primary reason for this +is that it makes the mechanism very simple. It would be possible to +define a more complex mechanism which exchanged session keys and also +provided confidentiality and/or integrity. + +There are a number of places where an authentication only service is +useful: + +- Where confidentiality and integrity are provided by lower layers + (e.g., TLS or IPSec). + +- Where confidentiality or integrity services are provided by the + application (e.g., X.500 signed operations). + +- Where physical and other security aspects of the environment do no + require confidentiality and integrity services. + +- For legacy applications where changes to the data exchange would be + difficult to integrate. + + + +Kille [Page 3] + + +Expires August 2000 IP X.509 SASL Authentication INTERNET DRAFT + + +4.3. Relationship to TLS + +The functionality defined here can be provided by TLS, and it is impor- +tant to consider why it is useful to have it in both places. There are +a number of reasons for this: + +- SASL. SASL also duplicates TLS functionality, and the rationale + for this is clearly given in RFC 2222 [1]. These arguments apply + here. + +- Simplicity. This mechanism is simpler than TLS. If there is only + a requirement for this functionality (as distinct from all of TLS), + this simplicity will facilitate deployment. + +- Layering. The SASL mechanism to establish authentication works + cleanly with most protocols. This mechanism can fit more cleanly + than TLS for some protocols. + +- Proxy support. Proxys can be cleanly supported with this mechan- + ism. This works because the proxy can authenticate the client, and + then simply pass the credentials on the server, using the previous + token member. + +- This mechanism provides a simpler solution where no Data Confiden- + tiality and integrity required. + +5. Token Definition + +The SASLStrongCredentials defined here are based on the StrongCreden- +tials defined in X.511, making use of the SIGNED Macro and Certification +Path definitions of X.509. Two optional fields have been added, the +second of which makes use of GeneralName defined in X.509 [6]. The +credentials definition is given here for clarity. The formal defini- +tions of CertificationPath, AlgorithmIdentifier, and DistinguishedName +are by reference to X.511. The formal definition of GeneralName is +given in X.509. + +There are a number of names referenced in these definitions. There are +two entities involved in the interaction: + +1. Signer. This is the entity that is creating the SASLStrongCreden- + tials, and singing it with its private key. The signer is also + referred to as the "subject", in line with PKIX terminology, as the + signer is essentially proving its own identity. + +2. Target. This is the entity which is expected to verify the signa- + ture. The target's name is included in order to prevent replay + attacks, and so it is only the target that can securely verify the + + + +Kille [Page 4] + + +Expires August 2000 IP X.509 SASL Authentication INTERNET DRAFT + + + SASLStrongCredentials (other entities can verify the signature, but + they would not be able to detect replay attack). This enables the + token to be used to build trust chains. + + SASLStrongCredentials ::= SET { + certification-path [0] CertificationPath OPTIONAL, + bind-token [1] SASLToken, + name [2] DistinguishedName OPTIONAL} -- signer + + SASLToken ::= SIGNED { SEQUENCE { + algorithm [0] AlgorithmIdentifier, + name [1] DistinguishedName, -- target + time [2] UTCTime, + random [3] BITSTRING, + response [4] BITSTRING OPTIONAL, + target-name [20] GeneralName OPTIONAL, + signer-name [21] GeneralName OPTIONAL, + previous-token [22] SASLStrongCredentials OPTIONAL}} + + PreviousToken ::= SEQUENCE { + token [0] SASLToken, + protocol [1] Protocol OPTIONAL } + + Protocol ::= INTEGER + + GeneralName ::= CHOICE { + otherName [0] OtherName, + rfc822Name [1] IA5String, + dNSName [2] IA5String, + x400Address [3] ORAddress, + directoryName [4] Name, + edipartyname [5] EDIPartyName, + uniformresouceidentifier [6] IA5String, + iPAddress [7] OCTET STRING, + registeredID [8] OBJECT IDENTIFIER } + + The elements of SASLStrongCredentials are as follows: + +certification-path: + This provides a mechanism for exchange of certificates, which may + help the recipient to verify the credentials. If this is included, + it must be consistent with the name in SASLStrongCredentials.name. + This information is provided by the entity generating the token to + facilitate verification. The entity verifying the token is not + required to use this information. + +bind-token: + This is the signed token, which is the core of the credentials. + + + +Kille [Page 5] + + +Expires August 2000 IP X.509 SASL Authentication INTERNET DRAFT + + +name:This is the distinguished name of the signer of the token. For + client authentication, this will need to be included unless the + information is carried in another protocol element of the exchange + (which will typically not be the case). For server authentication, + this will not normally be needed, as the client will have a priori + knowledge of the server it is connecting to. + + The entity verifying the token shall ensure that this name is con- + sistent with the certificate, as a part of the verification pro- + cess. + +The signed token contains the following elements. + +algorithm: + This is the signature algorithm used to sign the token. This is + included for compatibility with X.509, and generally implies both + an asymmetric algorithm and a hash algorithm. The value SHALL be + consistent with the algorithm defined by the SASL mechanism (e.g., + DSA-SHA1). + +name:This is the distinguished name of the target (which will verify the + token). For client authentication, this will be the name of the + server. + + This element is mandatory for compatibility with X.511. If a name + form other than Distinguished Name is used, this element should + contain a null distinguished name, and a name included in the + signer-name parameter. + +time:This is the time that the token expires. + +random: + This is a random number, which must be unique for the target over + the valid life of the token. This is included to prevent replay + attack. It is recommended that this number is at least as long as + the block size of the hash algorithm used. + +response: + This is used to carry a number derived from random if challenge + response of authentication is required. This shall be used in the + client phase of X509-B- and in no other circumstances. In this + case, the value used in this field in the client authentication + shall be used in the SASLToken.random field of the server authenti- + cation. + +items 5-19: + There is a gap in the sequence numbering. Items 6-9 are used in + X.500 DAP, but are not appropriate here. + + + +Kille [Page 6] + + +Expires August 2000 IP X.509 SASL Authentication INTERNET DRAFT + + +target-name: + This is a very general definition of a name, taken from X.509(v3). + This definition is being used by ongoing work on PKI. This enables + authentication identifiers other than distinguished names to be + used. This will be important when the target does not have a dis- + tinguished name. + + This field is needed when access control is to be applied on the + basis of a name different to the one doing the signing. The name + of the entity doing the signing is in SASLStrongCredentials.name, + and this is verified by the signing process. This field, verified + by the signature, is an alternate name to be used for access con- + trol purposes in the authentication and for ongoing purposes with + the association established. In SASL terminology, this is the + "authorization entity". + + Note that this description is for tutorial purposes only, and the + formal definition is taken from X.511. + +signer-name + This has the same function as name, but allows for encodings other + than Distinguished Name. + +previous-token + This gives a mechanism to include a previous token, which includes + a SASLToken, and optionally a protocol if this is different from + the current protocol. The mechanism might be used in a firewall, + which does protocol relay. The initial token is generated by the + client, which is then encapsulated in another token generated by + the firewall. This enables a signed trust chain to be built. + The "change of protocol" enables a server to use a different proto- + col on behalf of its client (e.g., an ACAP server performing a + directory lookup on behalf of the ACAP client). + +Protocols are represented as Integers, identified by the TCP Port +Number. + +6. Distinguished Names + +The X.509 strong authentication mechanism makes use of distinguished +names to identify the target. For some protocols, such as LDAP [2], +this is natural. For protocols which make use of internet domain names +to identify objects, the representation defined in RFC 2247 [5] MAY be +used as an alternative to subject-name in the token. For an Internet +Mailbox the local part must be encoded as a domain component. For exam- +ple "J.Bloggs@widget.com" is represented as the distinguished name +"DC=J.Bloggs,DC=widget,DC=com". + + + + +Kille [Page 7] + + +Expires August 2000 IP X.509 SASL Authentication INTERNET DRAFT + + +7. Supported Algorithms + +The following signature algorithms are recognized for use with this +mechanism, and identified by a key. Each key would be combined to make +three possible SASL mechanisms. For example for the DSA-SHA1 algorithm +would give X509-C-DSA-SHA1, X509-S-DSA-SHA1, and X509-B-DSA-SHA1. All +algorithm names are constrained to 13 characters, to keep within the +total SASL limit of 20 characters. + + The following table gives a list of algorithm keys, noting the +object identifier and the body which assigned the identifier. + + Key Object Id Body + RSA-MD4 1.3.14.2.2.2 OIW + RSA-MD5 1.3.14.2.2.3 OIW + RSA-MD4-ENCR 1.3.14.2.2.4 OIW + DSA-SHA 1.3.14.2.2.13 OIW + DSA-SHA-COMM 1.3.14.2.2.20 OIW + RSA-MD2 1.3.14.7.3.1 OIW + ELGAMAL-MD2 1.3.14.7.3.2 OIW + RSA-MD2-ENCR 1.2.840.113549.1.1.2 RSA + RSA-MD5-ENCR 1.2.840.113549.1.1.4 RSA + RSA-SHA1-ENC 1.2.840.113549.1.1.5 RSA + MSP-SDNS 2.16.840.1.101.2.1.1.1 DMS + MSP-MOSAIC 2.16.840.1.101.2.1.1.2 DMS + DSA-SHA1 1.2.840.10040.4.3 ANSI + + +Two special algorithm keys are defined: + +- IMPLICIT. This is used when the signer has a priori knowledge of + the algorithm to use. The algorithms is then identified solely by + the AlgrithmIdentifier Object Identifier in the token. + +- X-*. Any algorithm starting with "X-" is reserved for private + extension. + +Support of the DSS-SHA1 algorithm is recommended for use with this +mechanism. + +8. Example + +The following example shows use with IMAP4. The example is designed to +illustrate the protocol interaction and does not provide valid encoding +examples. + +S: * OK IMAP4 server ready +C: AOO1 CAPABILITY + + + +Kille [Page 8] + + +Expires August 2000 IP X.509 SASL Authentication INTERNET DRAFT + + +S: * CAPABILITY IMAP4 AUTH=CRAM-MD5 AUTH=X509-C-DSA-SHA1 AUTH=X509-C-RSA-MD5 +S: A001 OK done +C: AOO2 AUTHENTICATE X509-C-DSS-SHA1 +S: + +C: AE31FF05.......== +S: + 13c3FF44.......== +S: AOO3 OK Welcome, authenticated user: CN=Joe Bloggs,O=Widget,C=GB + +Editor's Note: + The ASN.1 values here are fake. A real example should be used + + (perhaps include ASN.1 value notation), when one can be generated + from a prototype implementation. + +9. Security Considerations + +These algorithms are designed to be used for authentication where the +underlying transport service cannot guarantee confidentiality. These +mechanisms do not prevent an authenticated association from being +hijacked. + +10. Acknowledgments + +Design ideas included in this document are based on those from ITU and +ISO, and the IETF ASID Working Groups. Useful ideas were taken from a +note "X.500 Strong Authentication Mechanisms for LDAPv3" by Mark Wahl. +The contributions of individuals in these working groups, including +Harald Alvestrand (Maxware), Alexis Bor (Directory Works), David Boyce +(Isode), William Curtin (DISA), Bruce Greenblatt (RSA), Steve Hole +(Esys), Tim Howes (Netscape), John Myers (Netscape), Chris Newman (Inno- +soft), Frank Siebeblist (DASCOM), Erik Skovgaard (Geotrain), and Sean +Turner (IECA) are gratefully acknowledged. + +11. Bibliography + +[1] J. Meyers, "Simple Authentication and Security Layer", RFC 2222, +October 1997. + +[2] M. Wahl, T. Howes, S. Kille, "Lightweight Directory Access Protocol +(v3)", RFC 2252, December 1997. + +[3] ITU-T Recommendation X.509 (1997) | ISO/IEC 9594-8:1997, Information +Technology - Open Systems Interconnection - The Directory: Authentica- +tion Framework. + +[4] ITU-T Recommendation X.511 (1997) | ISO/IEC 9594-8:1997, Information +Technology - Open Systems Interconnection - The Directory: Abstract +Service Definition. + + + +Kille [Page 9] + + +Expires August 2000 IP X.509 SASL Authentication INTERNET DRAFT + + +[5] S. Kille, M.Wahl, A. Grimstad, R. Huber, S. Sataluri, "Using Domains +in LDAP/X.500 Distinguished Names", RFC 2247, January 1998. + + +12. Author's Address + + Steve Kille + MessagingDirect Inc + The Dome, The Square + Richmond, Surrey, + TW9 1DT, UK + + Phone: +44-20-8332-9091 + Email: Steve.Kille@messagingdirect.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Kille [Page 10] + + diff --git a/doc/specification/draft-melnikov-rfc2831bis-00.txt b/doc/specification/draft-melnikov-rfc2831bis-00.txt new file mode 100644 index 0000000..50183b7 --- /dev/null +++ b/doc/specification/draft-melnikov-rfc2831bis-00.txt @@ -0,0 +1,1741 @@ + + + + + + +INTERNET-DRAFT P. Leach +Obsoletes: 2831 Microsoft +Intended category: Standards track C. Newman + Innosoft + A. Melnikov + MessagingDirect + April 2002 + + Using Digest Authentication as a SASL Mechanism + draft-melnikov-rfc2831bis-00.txt + +Status of this Memo + + This document is an Internet-Draft and is in full conformance with + all provisions of Section 10 of RFC2026 [RFC2026]. + + Internet-Drafts are working documents of the Internet Engineering + Task Force (IETF), its areas, and its working groups. Note that other + groups may also distribute working documents as Internet-Drafts. + + Internet-Drafts are draft documents valid for a maximum of six months + and may be updated, replaced, or obsoleted by other documents at any + time. It is inappropriate to use Internet-Drafts as reference + material or to cite them other than as "work in progress." + + The list of current Internet-Drafts can be accessed at + http://www.ietf.org/ietf/1id-abstracts.txt + + The list of Internet-Draft Shadow Directories can be accessed at + http://www.ietf.org/shadow.html. + +Copyright Notice + + Copyright (C) The Internet Society (2002). All Rights Reserved. + +Abstract + + This specification defines how HTTP Digest Authentication [Digest] + can be used as a SASL [RFC 2222] mechanism for any protocol that has + a SASL profile. It is intended both as an improvement over CRAM-MD5 + [RFC 2195] and as a convenient way to support a single authentication + mechanism for web, mail, LDAP, and other protocols. + +Table of Contents + + 1 INTRODUCTION.....................................................2 + 1.1 CONVENTIONS AND NOTATION......................................3 + 1.2 REQUIREMENTS..................................................3 + 2 AUTHENTICATION...................................................4 + + + +Leach & Newman Expires: October 2002 [Page 1] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + 2.1 INITIAL AUTHENTICATION........................................4 + 2.1.1 Step One...................................................4 + 2.1.2 Step Two...................................................7 + 2.1.3 Step Three................................................13 + 2.2 SUBSEQUENT AUTHENTICATION....................................13 + 2.2.1 Step one..................................................14 + 2.2.2 Step Two..................................................14 + 2.3 INTEGRITY PROTECTION.........................................14 + 2.4 CONFIDENTIALITY PROTECTION...................................15 + 3 SECURITY CONSIDERATIONS.........................................16 + 3.1 AUTHENTICATION OF CLIENTS USING DIGEST AUTHENTICATION........16 + 3.2 COMPARISON OF DIGEST WITH PLAINTEXT PASSWORDS................17 + 3.3 REPLAY ATTACKS...............................................17 + 3.4 ONLINE DICTIONARY ATTACKS....................................17 + 3.5 OFFLINE DICTIONARY ATTACKS...................................17 + 3.6 MAN IN THE MIDDLE............................................18 + 3.7 CHOSEN PLAINTEXT ATTACKS.....................................18 + 3.8 SPOOFING BY COUNTERFEIT SERVERS..............................18 + 3.9 STORING PASSWORDS............................................18 + 3.10 MULTIPLE REALMS.............................................19 + 3.11 SUMMARY.....................................................19 + 4 EXAMPLE.........................................................19 + 5 REFERENCES......................................................21 + 6 AUTHORS' ADDRESSES..............................................22 + 7 ABNF............................................................23 + 7.1 AUGMENTED BNF................................................23 + 7.2 BASIC RULES..................................................25 + 8 SAMPLE CODE.....................................................27 + 9 FULL COPYRIGHT STATEMENT........................................29 + +1 Introduction + + This specification describes the use of HTTP Digest Access + Authentication as a SASL mechanism. The authentication type + associated with the Digest SASL mechanism is "DIGEST-MD5". + + This specification is intended to be upward compatible with the + "md5-sess" algorithm of HTTP/1.1 Digest Access Authentication + specified in [Digest]. The only difference in the "md5-sess" + algorithm is that some directives not needed in a SASL mechanism have + had their values defaulted. + + There is one new feature for use as a SASL mechanism: integrity + protection on application protocol messages after an authentication + exchange. + + Also, compared to CRAM-MD5, DIGEST-MD5 prevents chosen plaintext + attacks, and permits the use of third party authentication servers, + + + +Leach & Newman Expires: October 2002 [Page 2] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + mutual authentication, and optimized reauthentication if a client has + recently authenticated to a server. + +1.1 Conventions and Notation + + This specification uses the same ABNF notation and lexical + conventions as HTTP/1.1 specification; see appendix A. + + Let { a, b, ... } be the concatenation of the octet strings a, b, ... + + Let H(s) be the 16 octet MD5 hash [RFC 1321] of the octet string s. + + Let KD(k, s) be H({k, ":", s}), i.e., the 16 octet hash of the string + k, a colon and the string s. + + Let HEX(n) be the representation of the 16 octet MD5 hash n as a + string of 32 hex digits (with alphabetic characters always in lower + case, since MD5 is case sensitive). + + Let HMAC(k, s) be the 16 octet HMAC-MD5 [RFC 2104] of the octet + string s using the octet string k as a key. + + Let unq(X) be the value of the quoted-string X without the + surrounding quotes and with all escape characters "\\" removed. For + example for the quoted-string "Babylon" the value of unq("Babylon") + is Babylon; for the quoted string "ABC\"123\\" the value of + unq("ABC\"123\\") is ABC"123\. + + The value of a quoted string constant as an octet string does not + include any terminating null character. + +1.2 Requirements + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in RFC 2119 [RFC 2119]. + + An implementation is not compliant if it fails to satisfy one or more + of the MUST level requirements for the protocols it implements. An + implementation that satisfies all the MUST level and all the SHOULD + level requirements for its protocols is said to be "unconditionally + compliant"; one that satisfies all the MUST level requirements but + not all the SHOULD level requirements for its protocols is said to be + "conditionally compliant." + + + + + + + +Leach & Newman Expires: October 2002 [Page 3] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + +2 Authentication + + The following sections describe how to use Digest as a SASL + authentication mechanism. + +2.1 Initial Authentication + + If the client has not recently authenticated to the server, then it + must perform "initial authentication", as defined in this section. If + it has recently authenticated, then a more efficient form is + available, defined in the next section. + +2.1.1 Step One + + The server starts by sending a challenge. The data encoded in the + challenge contains a string formatted according to the rules for a + "digest-challenge" defined as follows: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Leach & Newman Expires: October 2002 [Page 4] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + digest-challenge = + 1#( realm | nonce | qop-options | stale | maxbuf | charset + algorithm | cipher-opts | auth-param ) + + realm = "realm" "=" <"> realm-value <"> + realm-value = qdstr-val + nonce = "nonce" "=" <"> nonce-value <"> + nonce-value = *qdtext + qop-options = "qop" "=" <"> qop-list <"> + qop-list = 1#qop-value + qop-value = "auth" | "auth-int" | "auth-conf" | + token + stale = "stale" "=" "true" + maxbuf = "maxbuf" "=" maxbuf-value + maxbuf-value = 1*DIGIT + charset = "charset" "=" "utf-8" + algorithm = "algorithm" "=" "md5-sess" + cipher-opts = "cipher" "=" <"> 1#cipher-value <"> + cipher-value = "3des" | "des" | "rc4-40" | "rc4" | + "rc4-56" | token + auth-param = token "=" ( token | quoted-string ) + + The meanings of the values of the directives used above are as + follows: + + realm + Mechanistically, a string which can enable users to know which + username and password to use, in case they might have different + ones for different servers. Conceptually, it is the name of a + collection of accounts that might include the user's account. This + string should contain at least the name of the host performing the + authentication and might additionally indicate the collection of + users who might have access. An example might be + "registered_users@gotham.news.example.com". This directive is + optional; if not present, the client SHOULD solicit it from the + user or be able to compute a default; a plausible default might be + the realm supplied by the user when they logged in to the client + system. Multiple realm directives are allowed, in which case the + user or client must choose one as the realm for which to supply to + username and password. + + nonce + A server-specified data string which MUST be different each time a + digest-challenge is sent as part of initial authentication. It is + recommended that this string be base64 or hexadecimal data. Note + that since the string is passed as a quoted string, the + double-quote character is not allowed unless escaped (see section + 7.2). The contents of the nonce are implementation dependent. The + + + +Leach & Newman Expires: October 2002 [Page 5] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + security of the implementation depends on a good choice. It is + RECOMMENDED that it contain at least 64 bits of entropy. The nonce + is opaque to the client. This directive is required and MUST + appear exactly once; if not present, or if multiple instances are + present, the client should abort the authentication exchange. + + qop-options + A quoted string of one or more tokens indicating the "quality of + protection" values supported by the server. The value "auth" + indicates authentication; the value "auth-int" indicates + authentication with integrity protection; the value "auth-conf" + indicates authentication with integrity protection and encryption. + This directive is optional; if not present it defaults to "auth". + The client MUST ignore unrecognized options; if the client + recognizes no option, it should abort the authentication exchange. + + stale + The "stale" directive is not used in initial authentication. See + the next section for its use in subsequent authentications. This + directive may appear at most once; if multiple instances are + present, the client should abort the authentication exchange. + + maxbuf + A number indicating the size of the largest buffer the server is + able to receive when using "auth-int" or "auth-conf". If this + directive is missing, the default value is 65536. This directive + may appear at most once; if multiple instances are present, the + client should abort the authentication exchange. + + charset + This directive, if present, specifies that the server supports + UTF-8 [UTF-8] encoding for the username and password. If present, + the username and password MUST be in Unicode Normalization Form KC + [UNICODE-NORMALIZATION] (without NUL character) encoded as UTF-8 + [UTF-8]. If not present, the username and password must be + encoded in ISO 8859-1 (of which + US-ASCII is a subset). The directive is needed for backwards + compatibility with HTTP Digest, which only supports ISO 8859-1. + This directive may appear at most once; if multiple instances are + present, the client should abort the authentication exchange. + + algorithm + This directive is required for backwards compatibility with HTTP + Digest., which supports other algorithms. . This directive is + required and MUST appear exactly once; if not present, or if + multiple instances are present, the client should abort the + authentication exchange. + + + + +Leach & Newman Expires: October 2002 [Page 6] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + cipher-opts + A list of ciphers that the server supports. This directive must be + present exactly once if "auth-conf" is offered in the + "qop-options" directive, in which case the "3des" cipher is + mandatory-to-implement. The client MUST ignore unrecognized + options; if the client recognizes no option, it should abort the + authentication exchange. + + des + the Data Encryption Standard (DES) cipher [FIPS] in cipher + block chaining (CBC) mode with a 56 bit key. + + 3des + the "triple DES" cipher in CBC mode with EDE with the same key + for each E stage (aka "two keys mode") for a total key length + of 112 bits. + + rc4, rc4-40, rc4-56 + the RC4 cipher with a 128 bit, 40 bit, and 56 bit key, + respectively. + + auth-param This construct allows for future extensions; it may appear + more than once. The client MUST ignore any unrecognized + directives. + + For use as a SASL mechanism, note that the following changes are made + to "digest-challenge" from HTTP: the following Digest options (called + "directives" in HTTP terminology) are unused (i.e., MUST NOT be sent, + and MUST be ignored if received): + + opaque + domain + + The size of a digest-challenge MUST be less than 2048 bytes. + +2.1.2 Step Two + + The client makes note of the "digest-challenge" and then responds + with a string formatted and computed according to the rules for a + "digest-response" defined as follows: + + + + + + + + + + + +Leach & Newman Expires: October 2002 [Page 7] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + digest-response = 1#( username | realm | nonce | cnonce | + nonce-count | qop | digest-uri | response | + maxbuf | charset | cipher | authzid | + auth-param ) + + username = "username" "=" <"> username-value <"> + username-value = qdstr-val + cnonce = "cnonce" "=" <"> cnonce-value <"> + cnonce-value = *qdtext + nonce-count = "nc" "=" nc-value + nc-value = 8LHEX + qop = "qop" "=" qop-value + digest-uri = "digest-uri" "=" <"> digest-uri-value <"> + digest-uri-value = serv-type "/" host [ "/" serv-name ] + serv-type = 1*ALPHA + host = 1*( ALPHA | DIGIT | "-" | "." ) + serv-name = host + response = "response" "=" response-value + response-value = 32LHEX + LHEX = "0" | "1" | "2" | "3" | + "4" | "5" | "6" | "7" | + "8" | "9" | "a" | "b" | + "c" | "d" | "e" | "f" + cipher = "cipher" "=" cipher-value + authzid = "authzid" "=" <"> authzid-value <"> + authzid-value = qdstr-val + + + username + The user's name in the specified realm, encoded according to the + value of the "charset" directive. This directive is required and + MUST be present exactly once; otherwise, authentication fails. + + realm + The realm containing the user's account. This directive is + required if the server provided any realms in the + "digest-challenge", in which case it may appear exactly once and + its value SHOULD be one of those realms. If the directive is + missing, "realm-value" will set to the empty string when computing + A1 (see below for details). + + nonce + The server-specified data string received in the preceding digest- + challenge. This directive is required and MUST be present exactly + once; otherwise, authentication fails. + + + + + + +Leach & Newman Expires: October 2002 [Page 8] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + cnonce + A client-specified data string which MUST be different each time a + digest-response is sent as part of initial authentication. The + cnonce-value is an opaque quoted string value provided by the + client and used by both client and server to avoid chosen + plaintext attacks, and to provide mutual authentication. The + security of the implementation depends on a good choice. It is + RECOMMENDED that it contain at least 64 bits of entropy. This + directive is required and MUST be present exactly once; otherwise, + authentication fails. + + nonce-count + The nc-value is the hexadecimal count of the number of requests + (including the current request) that the client has sent with the + nonce value in this request. For example, in the first request + sent in response to a given nonce value, the client sends + "nc=00000001". The purpose of this directive is to allow the + server to detect request replays by maintaining its own copy of + this count - if the same nc-value is seen twice, then the request + is a replay. See the description below of the construction of the + response value. This directive is required and MUST be present + exactly once; otherwise, authentication fails. + + qop + Indicates what "quality of protection" the client accepted. If + present, it may appear exactly once and its value MUST be one of + the alternatives in qop-options. If not present, it defaults to + "auth". These values affect the computation of the response. Note + that this is a single token, not a quoted list of alternatives. + + serv-type + Indicates the type of service, such as "www" for web service, + "ftp" for FTP service, "smtp" for mail delivery service, etc. The + service name as defined in the SASL profile for the protocol see + section 4 of [RFC 2222], registered in the IANA registry of + "service" elements for the GSSAPI host-based service name form + [RFC 2078]. + + host + The DNS host name or IP address for the service requested. The + DNS host name must be the fully-qualified canonical name of the + host. The DNS host name is the preferred form; see notes on + server processing of the digest-uri. + + + + + + + + +Leach & Newman Expires: October 2002 [Page 9] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + serv-name + Indicates the name of the service if it is replicated. The service + is considered to be replicated if the client's service-location + process involves resolution using standard DNS lookup operations, + and if these operations involve DNS records (such as SRV, or MX) + which resolve one DNS name into a set of other DNS names. In this + case, the initial name used by the client is the "serv-name", and + the final name is the "host" component. For example, the incoming + mail service for "example.com" may be replicated through the use + of MX records stored in the DNS, one of which points at an SMTP + server called "mail3.example.com"; it's "serv-name" would be + "example.com", it's "host" would be "mail3.example.com". If the + service is not replicated, or the serv-name is identical to the + host, then the serv-name component MUST be omitted. + + digest-uri + Indicates the principal name of the service with which the client + wishes to connect, formed from the serv-type, host, and serv-name. + For example, the FTP service on "ftp.example.com" would have a + "digest-uri" value of "ftp/ftp.example.com"; the SMTP server from + the example above would have a "digest-uri" value of + "smtp/mail3.example.com/example.com". + + Servers SHOULD check that the supplied value is correct. This will + detect accidental connection to the incorrect server. It is also so + that clients will be trained to provide values that will work with + implementations that use a shared back-end authentication service + that can provide server authentication. + + The serv-type component should match the service being offered. The + host component should match one of the host names of the host on + which the service is running, or it's IP address. Servers SHOULD NOT + normally support the IP address form, because server authentication + by IP address is not very useful; they should only do so if the DNS + is unavailable or unreliable. The serv-name component should match + one of the service's configured service names. + + This directive may appear at most once; if multiple instances are + present, the client should abort the authentication exchange. + + Note: In the HTTP use of Digest authentication, the digest-uri is the + URI (usually a URL) of the resource requested -- hence the name of + the directive. + + response + A string of 32 hex digits computed as defined below, which proves + that the user knows a password. This directive is required and + MUST be present exactly once; otherwise, authentication fails. + + + +Leach & Newman Expires: October 2002 [Page 10] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + maxbuf + A number indicating the size of the largest buffer the client is + able to receive. If this directive is missing, the default value + is 65536. This directive may appear at most once; if multiple + instances are present, the server should abort the authentication + exchange. + + charset + This directive, if present, specifies that the client has used + UTF-8 [UTF-8] encoding for the username and password. If present, + the username and password MUST be in Unicode Normalization Form KC + [UNICODE-NORMALIZATION] (without NUL character) encoded as UTF-8 + [UTF-8]. If not present, the username and password must be encoded + in ISO 8859-1 (of which + US-ASCII is a subset). The client should send this directive only + if the server has indicated it supports UTF-8 [UTF-8]. The + directive is needed for backwards compatibility with HTTP Digest, + which only supports ISO 8859-1. + + LHEX + 32 hex digits, where the alphabetic characters MUST be lower case, + because MD5 is not case insensitive. + + cipher + The cipher chosen by the client. This directive MUST appear + exactly once if "auth-conf" is negotiated; if required and not + present, authentication fails. + + authzid + The "authorization ID" in Unicode Normalization Form KC [UNICODE- + NORMALIZATION] without NUL character, encoded in UTF-8 [UTF-8]. + This directive is optional. If present, and the authenticating + user has sufficient privilege, and the server supports it, then + after authentication the server will use this identity for making + all accesses and access checks. If the client specifies it, and + the server does not support it, then the response-value will be + incorrect, and authentication will fail. + + The size of a digest-response MUST be less than 4096 bytes. + +2.1.2.1 Response-value + + The definition of "response-value" above indicates the encoding for + its value -- 32 lower case hex characters. The following definitions + show how the value is computed. + + Although qop-value and components of digest-uri-value may be + case-insensitive, the case which the client supplies in step two is + + + +Leach & Newman Expires: October 2002 [Page 11] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + preserved for the purpose of computing and verifying the + response-value. + + response-value = + HEX( KD ( HEX(H(A1)), + { nonce-value, ":" nc-value, ":", + cnonce-value, ":", qop-value, ":", HEX(H(A2)) })) + + If authzid is specified, then A1 is + + + A1 = { H( { unq(username-value), ":", unq(realm-value), ":", passwd } ), + ":", nonce-value, ":", cnonce-value, ":", unq(authzid-value) } + + If authzid is not specified, then A1 is + + + A1 = { H( { unq(username-value), ":", unq(realm-value), ":", passwd } ), + ":", nonce-value, ":", cnonce-value } + + where + + passwd = *OCTET + + The "username-value", "realm-value" and "passwd" are encoded + according to the value of the "charset" directive. If "charset=UTF-8" + is present, and all the characters of "username-value"/"passwd" are, + after converting to Unicode Normalization Form KC [UNICODE- + NORMALIZATION], in the ISO 8859-1 character set, then it must be + converted to ISO 8859-1 before being hashed. This is so that + authentication databases that store the hashed username, realm and + password (which is common) can be shared compatibly with HTTP, which + specifies ISO 8859-1. A sample implementation of this conversion is + in section 8. + + If the "qop" directive's value is "auth", then A2 is: + + A2 = { "AUTHENTICATE:", digest-uri-value } + + If the "qop" value is "auth-int" or "auth-conf" then A2 is: + + A2 = { "AUTHENTICATE:", digest-uri-value, + ":00000000000000000000000000000000" } + + Note that "AUTHENTICATE:" must be in upper case, and the second + string constant is a string with a colon followed by 32 zeros. + + These apparently strange values of A2 are for compatibility with + + + +Leach & Newman Expires: October 2002 [Page 12] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + HTTP; they were arrived at by setting "Method" to "AUTHENTICATE" and + the hash of the entity body to zero in the HTTP digest calculation of + A2. + + Also, in the HTTP usage of Digest, several directives in the + "digest-challenge" sent by the server have to be returned by the + client in the "digest-response". These are: + + opaque + algorithm + + These directives are not needed when Digest is used as a SASL + mechanism (i.e., MUST NOT be sent, and MUST be ignored if received). + +2.1.3 Step Three + + The server receives and validates the "digest-response". The server + checks that the nonce-count is "00000001". If it supports subsequent + authentication (see section 2.2), it saves the value of the nonce and + the nonce-count. It sends a message formatted as follows: + + response-auth = "rspauth" "=" response-value + + where response-value is calculated as above, using the values sent in + step two, except that if qop is "auth", then A2 is + + A2 = { ":", digest-uri-value } + + And if qop is "auth-int" or "auth-conf" then A2 is + + A2 = { ":", digest-uri-value, ":00000000000000000000000000000000" } + + Compared to its use in HTTP, the following Digest directives in the + "digest-response" are unused: + + nextnonce + qop + cnonce + nonce-count + +2.2 Subsequent Authentication + + If the client has previously authenticated to the server, and + remembers the values of username, realm, nonce, nonce-count, cnonce, + and qop that it used in that authentication, and the SASL profile for + a protocol permits an initial client response, then it MAY perform + "subsequent authentication", as defined in this section. + + + + +Leach & Newman Expires: October 2002 [Page 13] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + +2.2.1 Step one + + The client uses the values from the previous authentication and sends + an initial response with a string formatted and computed according to + the rules for a "digest-response", as defined above, but with a + nonce-count one greater than used in the last "digest-response". + +2.2.2 Step Two + + The server receives the "digest-response". If the server does not + support subsequent authentication, then it sends a + "digest-challenge", and authentication proceeds as in initial + authentication. If the server has no saved nonce and nonce-count from + a previous authentication, then it sends a "digest-challenge", and + authentication proceeds as in initial authentication. Otherwise, the + server validates the "digest-response", checks that the nonce-count + is one greater than that used in the previous authentication using + that nonce, and saves the new value of nonce-count. + + If the response is invalid, then the server sends a + "digest-challenge", and authentication proceeds as in initial + authentication (and should be configurable to log an authentication + failure in some sort of security audit log, since the failure may be + a symptom of an attack). The nonce-count MUST NOT be incremented in + this case: to do so would allow a denial of service attack by sending + an out-of-order nonce-count. + + If the response is valid, the server MAY choose to deem that + authentication has succeeded. However, if it has been too long since + the previous authentication, or for any other reason, the server MAY + send a new "digest-challenge" with a new value for nonce. The + challenge MAY contain a "stale" directive with value "true", which + says that the client may respond to the challenge using the password + it used in the previous response; otherwise, the client must solicit + the password anew from the user. This permits the server to make sure + that the user has presented their password recently. (The directive + name refers to the previous nonce being stale, not to the last use of + the password.) Except for the handling of "stale", after sending the + "digest-challenge" authentication proceeds as in the case of initial + authentication. + +2.3 Integrity Protection + + If the server offered "qop=auth-int" and the client responded + "qop=auth-int", then subsequent messages, up to but not including the + next subsequent authentication, between the client and the server + + + + + +Leach & Newman Expires: October 2002 [Page 14] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + MUST be integrity protected. Using as a base session key the value of + H(A1) as defined above the client and server calculate a pair of + message integrity keys as follows. + + The key for integrity protecting messages from client to server is: + + Kic = MD5({H(A1), + "Digest session key to client-to-server signing key magic constant"}) + + The key for integrity protecting messages from server to client is: + + Kis = MD5({H(A1), + "Digest session key to server-to-client signing key magic constant"}) + + where MD5 is as specified in [RFC 1321]. If message integrity is + negotiated, a MAC block for each message is appended to the message. + The MAC block is 16 bytes: the first 10 bytes of the HMAC-MD5 [RFC + 2104] of the message, a 2-byte message type number in network byte + order with value 1, and the 4-byte sequence number in network byte + order. The message type is to allow for future extensions such as + rekeying. + + MAC(Ki, SeqNum, msg) = (HMAC(Ki, {SeqNum, msg})[0..9], 0x0001, + SeqNum) + + where Ki is Kic for messages sent by the client and Kis for those + sent by the server. The sequence number is initialized to zero, and + incremented by one for each message sent. + + Upon receipt, MAC(Ki, SeqNum, msg) is computed and compared with the + received value; the message is discarded if they differ. + +2.4 Confidentiality Protection + + If the server sent a "cipher-opts" directive and the client responded + with a "cipher" directive, then subsequent messages between the + client and the server MUST be confidentiality protected. Using as a + base session key the value of H(A1) as defined above the client and + server calculate a pair of message integrity keys as follows. + + The key for confidentiality protecting messages from client to server + is: + + Kcc = MD5({H(A1)[0..n-1], + "Digest H(A1) to client-to-server sealing key magic constant"}) + + The key for confidentiality protecting messages from server to client + is: + + + +Leach & Newman Expires: October 2002 [Page 15] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + Kcs = MD5({H(A1)[0..n-1], + "Digest H(A1) to server-to-client sealing key magic constant"}) + + where MD5 is as specified in [RFC 1321]. For cipher "rc4-40" n is 5; + for "rc4-56" n is 7; for the rest n is 16. The key for the "rc4-*" + ciphers is all 16 bytes of Kcc or Kcs; the key for "des" is the first + 7 bytes; the key for "3des" is the first 14 bytes. The IV for "des" + and "3des" is the last 8 bytes of Kcc or Kcs. + + If message confidentiality is negotiated, each message is encrypted + with the chosen cipher and a MAC block is appended to the message. + + The MAC block is a variable length padding prefix followed by 16 + bytes formatted as follows: the first 10 bytes of the HMAC-MD5 [RFC + 2104] of the message, a 2-byte message type number in network byte + order with value 1, and the 4-byte sequence number in network byte + order. If the blocksize of the chosen cipher is not 1 byte, the + padding prefix is one or more octets each containing the number of + padding bytes, such that total length of the encrypted part of the + message is a multiple of the blocksize. The padding and first 10 + bytes of the MAC block are encrypted along with the message. + + SEAL(Ki, Kc, SeqNum, msg) = + {CIPHER(Kc, {msg, pad, HMAC(Ki, {SeqNum, msg})[0..9])}), 0x0001, + SeqNum} + + where CIPHER is the chosen cipher, Ki and Kc are Kic and Kcc for + messages sent by the client and Kis and Kcs for those sent by the + server. The sequence number is initialized to zero, and incremented + by one for each message sent. + + Upon receipt, the message is decrypted, HMAC(Ki, {SeqNum, msg}) is + computed and compared with the received value; the message is + discarded if they differ. + +3 Security Considerations + +3.1 Authentication of Clients using Digest Authentication + + Digest Authentication does not provide a strong authentication + mechanism, when compared to public key based mechanisms, for example. + However, since it prevents chosen plaintext attacks, it is stronger + than (e.g.) CRAM-MD5, which has been proposed for use with LDAP [10], + POP and IMAP (see RFC 2195 [9]). It is intended to replace the much + weaker and even more dangerous use of plaintext passwords; however, + since it is still a password based mechanism it avoids some of the + potential deployabilty issues with public-key, OTP or similar + mechanisms. + + + +Leach & Newman Expires: October 2002 [Page 16] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + Digest Authentication offers no confidentiality protection beyond + protecting the actual password. All of the rest of the challenge and + response are available to an eavesdropper, including the user's name + and authentication realm. + +3.2 Comparison of Digest with Plaintext Passwords + + The greatest threat to the type of transactions for which these + protocols are used is network snooping. This kind of transaction + might involve, for example, online access to a mail service whose use + is restricted to paying subscribers. With plaintext password + authentication an eavesdropper can obtain the password of the user. + This not only permits him to access anything in the database, but, + often worse, will permit access to anything else the user protects + with the same password. + +3.3 Replay Attacks + + Replay attacks are defeated if the client or the server chooses a + fresh nonce for each authentication, as this specification requires. + +3.4 Online dictionary attacks + + If the attacker can eavesdrop, then it can test any overheard + nonce/response pairs against a (potentially very large) list of + common words. Such a list is usually much smaller than the total + number of possible passwords. The cost of computing the response for + each password on the list is paid once for each challenge. + + The server can mitigate this attack by not allowing users to select + passwords that are in a dictionary. + +3.5 Offline dictionary attacks + + If the attacker can choose the challenge, then it can precompute the + possible responses to that challenge for a list of common words. Such + a list is usually much smaller than the total number of possible + passwords. The cost of computing the response for each password on + the list is paid just once. + + Offline dictionary attacks are defeated if the client chooses a fresh + nonce for each authentication, as this specification requires. + + + + + + + + + +Leach & Newman Expires: October 2002 [Page 17] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + +3.6 Man in the Middle + + Digest authentication is vulnerable to "man in the middle" (MITM) + attacks. Clearly, a MITM would present all the problems of + eavesdropping. But it also offers some additional opportunities to + the attacker. + + A possible man-in-the-middle attack would be to substitute a weaker + qop scheme for the one(s) sent by the server; the server will not be + able to detect this attack. For this reason, the client should always + use the strongest scheme that it understands from the choices + offered, and should never choose a scheme that does not meet its + minimum requirements. + +3.7 Chosen plaintext attacks + + A chosen plaintext attack is where a MITM or a malicious server can + arbitrarily choose the challenge that the client will use to compute + the response. The ability to choose the challenge is known to make + cryptanalysis much easier [8]. + + However, Digest does not permit the attack to choose the challenge as + long as the client chooses a fresh nonce for each authentication, as + this specification requires. + +3.8 Spoofing by Counterfeit Servers + + If a user can be led to believe that she is connecting to a host + containing information protected by a password she knows, when in + fact she is connecting to a hostile server, then the hostile server + can obtain challenge/response pairs where it was able to partly + choose the challenge. There is no known way that this can be + exploited. + +3.9 Storing passwords + + Digest authentication requires that the authenticating agent (usually + the server) store some data derived from the user's name and password + in a "password file" associated with a given realm. Normally this + might contain pairs consisting of username and H({ username-value, + ":", realm-value, ":", passwd }), which is adequate to compute H(A1) + as described above without directly exposing the user's password. + + The security implications of this are that if this password file is + compromised, then an attacker gains immediate access to documents on + the server using this realm. Unlike, say a standard UNIX password + file, this information need not be decrypted in order to access + documents in the server realm associated with this file. On the other + + + +Leach & Newman Expires: October 2002 [Page 18] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + hand, decryption, or more likely a brute force attack, would be + necessary to obtain the user's password. This is the reason that the + realm is part of the digested data stored in the password file. It + means that if one Digest authentication password file is compromised, + it does not automatically compromise others with the same username + and password (though it does expose them to brute force attack). + + There are two important security consequences of this. First the + password file must be protected as if it contained plaintext + passwords, because for the purpose of accessing documents in its + realm, it effectively does. + + A second consequence of this is that the realm string should be + unique among all realms that any single user is likely to use. In + particular a realm string should include the name of the host doing + the authentication. + +3.10 Multiple realms + + Use of multiple realms may mean both that compromise of a the + security database for a single realm does not compromise all + security, and that there are more things to protect in order to keep + the whole system secure. + +3.11 Summary + + By modern cryptographic standards Digest Authentication is weak, + compared to (say) public key based mechanisms. But for a large range + of purposes it is valuable as a replacement for plaintext passwords. + Its strength may vary depending on the implementation. + +4 Example + + This example shows the use of the Digest SASL mechanism with the + IMAP4 AUTHENTICATE command [RFC 2060]. + + In this example, "C:" and "S:" represent a line sent by the client or + server respectively including a CRLF at the end. Linebreaks and + indentation within a "C:" or "S:" are editorial and not part of the + protocol. The password in this example was "secret". Note that the + base64 encoding of the challenges and responses is part of the IMAP4 + AUTHENTICATE command, not part of the Digest specification itself. + + S: * OK elwood.innosoft.com PMDF IMAP4rev1 V6.0-9 + C: c CAPABILITY + S: * CAPABILITY IMAP4 IMAP4rev1 ACL LITERAL+ NAMESPACE QUOTA + UIDPLUS AUTH=CRAM-MD5 AUTH=DIGEST-MD5 AUTH=PLAIN + S: c OK Completed + + + +Leach & Newman Expires: October 2002 [Page 19] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + C: a AUTHENTICATE DIGEST-MD5 + S: + cmVhbG09ImVsd29vZC5pbm5vc29mdC5jb20iLG5vbmNlPSJPQTZNRzl0 + RVFHbTJoaCIscW9wPSJhdXRoIixhbGdvcml0aG09bWQ1LXNlc3MsY2hh + cnNldD11dGYtOA== + C: Y2hhcnNldD11dGYtOCx1c2VybmFtZT0iY2hyaXMiLHJlYWxtPSJlbHdvb2 + QuaW5ub3NvZnQuY29tIixub25jZT0iT0E2TUc5dEVRR20yaGgiLG5jPTAw + MDAwMDAxLGNub25jZT0iT0E2TUhYaDZWcVRyUmsiLGRpZ2VzdC11cmk9Im + ltYXAvZWx3b29kLmlubm9zb2Z0LmNvbSIscmVzcG9uc2U9ZDM4OGRhZDkw + ZDRiYmQ3NjBhMTUyMzIxZjIxNDNhZjcscW9wPWF1dGg= + S: + cnNwYXV0aD1lYTQwZjYwMzM1YzQyN2I1NTI3Yjg0ZGJhYmNkZmZmZA== + C: + S: a OK User logged in + --- + + The base64-decoded version of the SASL exchange is: + + S: realm="elwood.innosoft.com",nonce="OA6MG9tEQGm2hh",qop="auth", + algorithm=md5-sess,charset=utf-8 + C: charset=utf-8,username="chris",realm="elwood.innosoft.com", + nonce="OA6MG9tEQGm2hh",nc=00000001,cnonce="OA6MHXh6VqTrRk", + digest-uri="imap/elwood.innosoft.com", + response=d388dad90d4bbd760a152321f2143af7,qop=auth + S: rspauth=ea40f60335c427b5527b84dbabcdfffd + + The password in this example was "secret". + + This example shows the use of the Digest SASL mechanism with the + ACAP, using the same notational conventions and password as in the + previous example. Note that ACAP does not base64 encode and uses + fewer round trips that IMAP4. + + S: * ACAP (IMPLEMENTATION "Test ACAP server") (SASL "CRAM-MD5" + "DIGEST-MD5" "PLAIN") + C: a AUTHENTICATE "DIGEST-MD5" + S: + {94} + S: realm="elwood.innosoft.com",nonce="OA9BSXrbuRhWay",qop="auth", + algorithm=md5-sess,charset=utf-8 + C: {206} + C: charset=utf-8,username="chris",realm="elwood.innosoft.com", + nonce="OA9BSXrbuRhWay",nc=00000001,cnonce="OA9BSuZWMSpW8m", + digest-uri="acap/elwood.innosoft.com", + response=6084c6db3fede7352c551284490fd0fc,qop=auth + S: a OK (SASL {40} + S: rspauth=2f0b3d7c3c2e486600ef710726aa2eae) "AUTHENTICATE + Completed" + --- + + + + + +Leach & Newman Expires: October 2002 [Page 20] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + The server uses the values of all the directives, plus knowledge of + the users password (or the hash of the user's name, server's realm + and the user's password) to verify the computations above. If they + check, then the user has authenticated. + +5 References + + [Digest] Franks, J., et al., "HTTP Authentication: Basic and Digest + Access Authentication", RFC 2617, June 1999. + + [ISO-8859] ISO-8859. International Standard--Information Processing-- + 8-bit Single-Byte Coded Graphic Character Sets -- + Part 1: Latin alphabet No. 1, ISO-8859-1:1987. + Part 2: Latin alphabet No. 2, ISO-8859-2, 1987. + Part 3: Latin alphabet No. 3, ISO-8859-3, 1988. + Part 4: Latin alphabet No. 4, ISO-8859-4, 1988. + Part 5: Latin/Cyrillic alphabet, ISO-8859-5, 1988. + Part 6: Latin/Arabic alphabet, ISO-8859-6, 1987. + Part 7: Latin/Greek alphabet, ISO-8859-7, 1987. + Part 8: Latin/Hebrew alphabet, ISO-8859-8, 1988. + Part 9: Latin alphabet No. 5, ISO-8859-9, 1990. + + [RFC 822] Crocker, D., "Standard for The Format of ARPA Internet + Text Messages," STD 11, RFC 822, August 1982. + + [RFC 1321] Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321, + April 1992. + + [RFC 2052] Gulbrandsen, A. and P. Vixie, "A DNS RR for specifying the + location of services (DNS SRV)", RFC 2052, October 1996. + + [RFC 2060] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, December 1996. + + [RFC 2104] Krawczyk, H., Bellare, M. and R. Canetti, "HMAC: Keyed- + Hashing for Message Authentication", RFC 2104, February + 1997. + + [RFC 2195] Klensin, J., Catoe, R. and P. Krumviede, "IMAP/POP + AUTHorize Extension for Simple Challenge/Response", RFC + 2195, September 1997. + + + + + + + + + + +Leach & Newman Expires: October 2002 [Page 21] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + [RFC 2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [RFC 2222] Myers, J., "Simple Authentication and Security Layer + (SASL)", RFC 2222, October 1997. + + [UNICODE-NORMALIZATION] Davis, Durst, "Unicode Standard Annex #15: + Unicode Normalization Forms", + http://www.unicode.org/unicode/reports/tr15/, March 2001. + + [UTF-8] Yergeau, "UTF-8, a transformation format of ISO 10646", RFC + 2279, Janyary 1998. + + [USASCII] US-ASCII. Coded Character Set - 7-Bit American Standard + Code for Information Interchange. Standard ANSI X3.4-1986, + ANSI, 1986. + +6 Authors' Addresses + + Paul Leach + Microsoft + 1 Microsoft Way + Redmond, WA 98052 + + EMail: paulle@microsoft.com + + + Chris Newman + Innosoft International, Inc. + 1050 Lakes Drive + West Covina, CA 91790 USA + + EMail: chris.newman@innosoft.com + + + Alexey Melnikov + ACI WorldWide/MessagingDirect + 22 The Quadrant, Richmond, Surrey, UK + + Email: mel@messagingdirect.com + + + + + + + + + + + +Leach & Newman Expires: October 2002 [Page 22] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + +7 ABNF + + What follows is the definition of the notation as is used in the + HTTP/1.1 specification (RFC 2616) and the HTTP authentication + specification (RFC 2617); it is reproduced here for ease of + reference. Since it is intended that a single Digest implementation + can support both HTTP and SASL-based protocols, the same notation is + used in both to facilitate comparison and prevention of unwanted + differences. Since it is cut-and-paste from the HTTP specifications, + not all productions may be used in this specification. It is also not + quite legal ABNF; again, the errors were copied from the HTTP + specifications. + +7.1 Augmented BNF + + All of the mechanisms specified in this document are described in + both prose and an augmented Backus-Naur Form (BNF) similar to that + used by RFC 822 [RFC 822]. Implementers will need to be familiar with + the notation in order to understand this specification. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Leach & Newman Expires: October 2002 [Page 23] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + The augmented BNF includes the following constructs: + + name = definition + The name of a rule is simply the name itself (without any + enclosing "<" and ">") and is separated from its definition by the + equal "=" character. White space is only significant in that + indentation of continuation lines is used to indicate a rule + definition that spans more than one line. Certain basic rules are + in uppercase, such as SP, LWS, HT, CRLF, DIGIT, ALPHA, etc. Angle + brackets are used within definitions whenever their presence will + facilitate discerning the use of rule names. + + "literal" + Quotation marks surround literal text. Unless stated otherwise, + the text is case-insensitive. + + rule1 | rule2 + Elements separated by a bar ("|") are alternatives, e.g., "yes | + no" will accept yes or no. + + (rule1 rule2) + Elements enclosed in parentheses are treated as a single element. + Thus, "(elem (foo | bar) elem)" allows the token sequences + "elem foo elem" and "elem bar elem". + + *rule + The character "*" preceding an element indicates repetition. The + full form is "*element" indicating at least and at most + occurrences of element. Default values are 0 and infinity so + that "*(element)" allows any number, including zero; "1*element" + requires at least one; and "1*2element" allows one or two. + + [rule] + Square brackets enclose optional elements; "[foo bar]" is + equivalent to "*1(foo bar)". + + N rule + Specific repetition: "(element)" is equivalent to + "*(element)"; that is, exactly occurrences of (element). + Thus 2DIGIT is a 2-digit number, and 3ALPHA is a string of three + alphabetic characters. + + #rule + A construct "#" is defined, similar to "*", for defining lists of + elements. The full form is "#element" indicating at least + and at most elements, each separated by one or more commas + (",") and OPTIONAL linear white space (LWS). This makes the usual + form of lists very easy; a rule such as + + + +Leach & Newman Expires: October 2002 [Page 24] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + ( *LWS element *( *LWS "," *LWS element )) + can be shown as + 1#element + Wherever this construct is used, null elements are allowed, but do + not contribute to the count of elements present. That is, + "(element), , (element) " is permitted, but counts as only two + elements. Therefore, where at least one element is required, at + least one non-null element MUST be present. Default values are 0 + and infinity so that "#element" allows any number, including zero; + "1#element" requires at least one; and "1#2element" allows one or + two. + + ; comment + A semi-colon, set off some distance to the right of rule text, + starts a comment that continues to the end of line. This is a + simple way of including useful notes in parallel with the + specifications. + + implied *LWS + The grammar described by this specification is word-based. Except + where noted otherwise, linear white space (LWS) can be included + between any two adjacent words (token or quoted-string), and + between adjacent words and separators, without changing the + interpretation of a field. At least one delimiter (LWS and/or + separators) MUST exist between any two tokens (for the definition + of "token" below), since they would otherwise be interpreted as a + single token. + +7.2 Basic Rules + + The following rules are used throughout this specification to + describe basic parsing constructs. The US-ASCII coded character set + is defined by ANSI X3.4-1986 [USASCII]. + + OCTET = + CHAR = + UPALPHA = + LOALPHA = + ALPHA = UPALPHA | LOALPHA + DIGIT = + CTL = + CR = + LF = + SP = + HT = + <"> = + CRLF = CR LF + + + +Leach & Newman Expires: October 2002 [Page 25] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + All linear white space, including folding, has the same semantics as + SP. A recipient MAY replace any linear white space with a single SP + before interpreting the field value or forwarding the message + downstream. + + LWS = [CRLF] 1*( SP | HT ) + + The TEXT rule is only used for descriptive field contents and values + that are not intended to be interpreted by the message parser. Words + of *TEXT contains characters either from ISO-8859-1 [ISO 8859] + character set + or UTF-8 [UTF-8]. + + TEXT = + + A CRLF is allowed in the definition of TEXT only as part of a header + field continuation. It is expected that the folding LWS will be + replaced with a single SP before interpretation of the TEXT value. + + Hexadecimal numeric characters are used in several protocol elements. + + HEX = "A" | "B" | "C" | "D" | "E" | "F" + | "a" | "b" | "c" | "d" | "e" | "f" | DIGIT + + Many HTTP/1.1 header field values consist of words separated by LWS + or special characters. These special characters MUST be in a quoted + string to be used within a parameter value. + + token = 1* + separators = "(" | ")" | "<" | ">" | "@" + | "," | ";" | ":" | "\" | <"> + | "/" | "[" | "]" | "?" | "=" + | "{" | "}" | SP | HT + + A string of text is parsed as a single word if it is quoted using + double-quote marks. + + quoted-string = ( <"> qdstr-val <"> ) + qdstr-val = *( qdtext | quoted-pair ) + qdtext = and "\"> + + Note that LWS is NOT implicit between the double-quote marks (<">) + surrounding a qdstr-val and the qdstr-val; any LWS will be considered + part of the qdstr-val. This is also the case for quotation marks + surrounding any other construct. + + + + + +Leach & Newman Expires: October 2002 [Page 26] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + The backslash character ("\") MAY be used as a single-character + quoting mechanism only within qdstr-val and comment constructs. + + quoted-pair = "\" CHAR + + The value of this construct is CHAR. Note that an effect of this rule + is that backslash itself MUST be quoted. + +8 Sample Code + + The sample implementation in [Digest] also applies to DIGEST-MD5. + + The following code implements the conversion from UTF-8 to 8859-1 if + necessary. + + /* if the string is entirely in the 8859-1 subset of UTF-8, then + * translate to 8859-1 prior to MD5 + */ + void MD5_UTF8_8859_1(MD5_CTX *ctx, const unsigned char *base, + int len) + { + const unsigned char *scan, *end; + unsigned char cbuf; + + end = base + len; + for (scan = base; scan < end; ++scan) { + if (*scan > 0xC3) break; /* abort if outside 8859-1 */ + if (*scan >= 0xC0 && *scan <= 0xC3) { + if (++scan == end || *scan < 0x80 || *scan > 0xBF) + break; + } + } + /* if we found a character outside 8859-1, don't alter string + */ + if (scan < end) { + MD5Update(ctx, base, len); + return; + } + + /* convert to 8859-1 prior to applying hash + */ + do { + for (scan = base; scan < end && *scan < 0xC0; ++scan) + ; + if (scan != base) MD5Update(ctx, base, scan - base); + if (scan + 1 >= end) break; + cbuf = ((scan[0] & 0x3) << 6) | (scan[1] & 0x3f); + MD5Update(ctx, &cbuf, 1); + + + +Leach & Newman Expires: October 2002 [Page 27] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + + base = scan + 2; + } while (base < end); + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Leach & Newman Expires: October 2002 [Page 28] + + + + + +INTERNET DRAFT Digest SASL Mechanism April 2002 + + +9 Full Copyright Statement + + Copyright (C) The Internet Society (2002). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + +Leach & Newman Expires: October 2002 [Page 29] + + diff --git a/doc/specification/draft-melnikov-rfc2831bis-01.txt b/doc/specification/draft-melnikov-rfc2831bis-01.txt new file mode 100644 index 0000000..b3521a4 --- /dev/null +++ b/doc/specification/draft-melnikov-rfc2831bis-01.txt @@ -0,0 +1,1980 @@ + + + + + + +INTERNET-DRAFT P. Leach +Obsoletes: 2831 Microsoft +Intended category: Standards track C. Newman + Innosoft + A. Melnikov + MessagingDirect + June 2002 + + Using Digest Authentication as a SASL Mechanism + draft-melnikov-rfc2831bis-01.txt + +Status of this Memo + + This document is an Internet-Draft and is in full conformance with + all provisions of Section 10 of RFC 2026. + + Internet-Drafts are working documents of the Internet Engineering + Task Force (IETF), its areas, and its working groups. Note that other + groups may also distribute working documents as Internet-Drafts. + + Internet-Drafts are draft documents valid for a maximum of six months + and may be updated, replaced, or obsoleted by other documents at any + time. It is inappropriate to use Internet-Drafts as reference + material or to cite them other than as "work in progress." + + The list of current Internet-Drafts can be accessed at + http://www.ietf.org/ietf/1id-abstracts.txt + + The list of Internet-Draft Shadow Directories can be accessed at + http://www.ietf.org/shadow.html. + +Copyright Notice + + Copyright (C) The Internet Society (2002). All Rights Reserved. + +Abstract + + This specification defines how HTTP Digest Authentication [Digest] + can be used as a SASL [RFC 2222] mechanism for any protocol that has + a SASL profile. It is intended both as an improvement over CRAM-MD5 + [RFC 2195] and as a convenient way to support a single authentication + mechanism for web, mail, LDAP, and other protocols. + + + + + + + + + +Leach & Newman Expires: December 2002 [Page 1] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + +Table of Contents + + 1 INTRODUCTION.....................................................3 + 1.1 CONVENTIONS AND NOTATION......................................3 + 1.2 REQUIREMENTS..................................................4 + 2 AUTHENTICATION...................................................5 + 2.1 INITIAL AUTHENTICATION........................................5 + 2.1.1 Step One...................................................5 + 2.1.2 Step Two...................................................9 + 2.1.3 Step Three................................................16 + 2.2 SUBSEQUENT AUTHENTICATION....................................16 + 2.2.1 Step one..................................................17 + 2.2.2 Step Two..................................................17 + 2.3 INTEGRITY PROTECTION.........................................17 + 2.4 CONFIDENTIALITY PROTECTION...................................18 + 3 SECURITY CONSIDERATIONS.........................................19 + 3.1 AUTHENTICATION OF CLIENTS USING DIGEST AUTHENTICATION........19 + 3.2 COMPARISON OF DIGEST WITH PLAINTEXT PASSWORDS................20 + 3.3 REPLAY ATTACKS...............................................20 + 3.4 ONLINE DICTIONARY ATTACKS....................................20 + 3.5 OFFLINE DICTIONARY ATTACKS...................................20 + 3.6 MAN IN THE MIDDLE............................................21 + 3.7 CHOSEN PLAINTEXT ATTACKS.....................................21 + 3.8 SPOOFING BY COUNTERFEIT SERVERS..............................21 + 3.9 STORING PASSWORDS............................................21 + 3.10 MULTIPLE REALMS.............................................22 + 3.11 SUMMARY.....................................................22 + 4 EXAMPLE.........................................................22 + 5 REFERENCES......................................................24 + 5.1 NORMATIVE REFERENCES.........................................24 + 5.2 INFORMATIVE REFERENCES.......................................25 + 6 AUTHORS' ADDRESSES..............................................26 + 7 ABNF............................................................27 + 7.1 AUGMENTED BNF................................................27 + 7.2 BASIC RULES..................................................29 + 8 SAMPLE CODE.....................................................31 + 9 INTEROPERABILITY CONSIDERATIONS.................................32 + 9.1 Implementing DES cipher in CBC mode..........................32 + 10 FULL COPYRIGHT STATEMENT.......................................32 + Appendix A: Changes from 2831.....................................33 + Appendix B: Open Issues...........................................33 + + + + + + + + + + +Leach & Newman Expires: December 2002 [Page 2] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + +1 Introduction + + This specification describes the use of HTTP Digest Access + Authentication as a SASL mechanism. The authentication type + associated with the Digest SASL mechanism is "DIGEST-MD5". + + This specification is intended to be upward compatible with the + "md5-sess" algorithm of HTTP/1.1 Digest Access Authentication + specified in [Digest]. The only difference in the "md5-sess" + algorithm is that some directives not needed in a SASL mechanism have + had their values defaulted. + + There is one new feature for use as a SASL mechanism: integrity + protection on application protocol messages after an authentication + exchange. + + Also, compared to CRAM-MD5, DIGEST-MD5 prevents chosen plaintext + attacks, and permits the use of third party authentication servers, + mutual authentication, and optimized reauthentication if a client has + recently authenticated to a server. + +1.1 Conventions and Notation + + This specification uses the same ABNF notation and lexical + conventions as HTTP/1.1 specification; see section 7. + + Let { a, b, ... } be the concatenation of the octet strings a, b, ... + + Let ** denote the power operation. + + Let H(s) be the 16 octet MD5 hash [RFC 1321] of the octet string s. + + Let KD(k, s) be H({k, ":", s}), i.e., the 16 octet hash of the string + k, a colon and the string s. + + Let HEX(n) be the representation of the 16 octet MD5 hash n as a + string of 32 hex digits (with alphabetic characters always in lower + case, since MD5 is case sensitive). + + Let HMAC(k, s) be the 16 octet HMAC-MD5 [RFC 2104] of the octet + string s using the octet string k as a key. + + + + + + + + + + +Leach & Newman Expires: December 2002 [Page 3] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + + Let unq(X) be the value of the quoted-string X without the + surrounding quotes and with all escape characters "\\" removed. For + example for the quoted-string "Babylon" the value of unq("Babylon") + is Babylon; for the quoted string "ABC\"123\\" the value of + unq("ABC\"123\\") is ABC"123\. + + The value of a quoted string constant as an octet string does not + include any terminating null character. + +1.2 Requirements + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in RFC 2119 [RFC 2119]. + + An implementation is not compliant if it fails to satisfy one or more + of the MUST level requirements for the protocols it implements. An + implementation that satisfies all the MUST level and all the SHOULD + level requirements for its protocols is said to be "unconditionally + compliant"; one that satisfies all the MUST level requirements but + not all the SHOULD level requirements for its protocols is said to be + "conditionally compliant." + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Leach & Newman Expires: December 2002 [Page 4] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + +2 Authentication + + The following sections describe how to use Digest as a SASL + authentication mechanism. + +2.1 Initial Authentication + + If the client has not recently authenticated to the server, then it + must perform "initial authentication", as defined in this section. If + it has recently authenticated, then a more efficient form is + available, defined in the next section. + +2.1.1 Step One + + The server starts by sending a challenge. The data encoded in the + challenge contains a string formatted according to the rules for a + "digest-challenge" defined as follows: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Leach & Newman Expires: December 2002 [Page 5] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + + digest-challenge = + 1#( realm | nonce | qop-options | stale | maxbuf | charset + algorithm | cipher-opts | auth-param ) + + realm = "realm" "=" <"> realm-value <"> + realm-value = qdstr-val + nonce = "nonce" "=" <"> nonce-value <"> + nonce-value = *qdtext + qop-options = "qop" "=" <"> qop-list <"> + qop-list = 1#qop-value + qop-value = "auth" | "auth-int" | "auth-conf" | + token + stale = "stale" "=" "true" + maxbuf = "maxbuf" "=" maxbuf-value + maxbuf-value = 1*DIGIT + charset = "charset" "=" "utf-8" + algorithm = "algorithm" "=" "md5-sess" + cipher-opts = "cipher" "=" <"> 1#cipher-value <"> + cipher-value = "3des" | "des" | "rc4-40" | "rc4" | + "rc4-56" | token + auth-param = token "=" ( token | quoted-string ) + + The meanings of the values of the directives used above are as + follows: + + realm + Mechanistically, a string which can enable users to know which + username and password to use, in case they might have different + ones for different servers. Conceptually, it is the name of a + collection of accounts that might include the user's account. This + string should contain at least the name of the host performing the + authentication and might additionally indicate the collection of + users who might have access. An example might be + "registered_users@gotham.news.example.com". This directive is + optional; if not present, the client SHOULD solicit it from the + user or be able to compute a default; a plausible default might be + the realm supplied by the user when they logged in to the client + system. Multiple realm directives are allowed, in which case the + user or client must choose one as the realm for which to supply to + username and password. + + nonce + A server-specified data string which MUST be different each time a + digest-challenge is sent as part of initial authentication. It is + recommended that this string be base64 or hexadecimal data. Note + that since the string is passed as a quoted string, the + double-quote character is not allowed unless escaped (see section + 7.2). The contents of the nonce are implementation dependent. The + + + +Leach & Newman Expires: December 2002 [Page 6] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + + security of the implementation depends on a good choice. It is + RECOMMENDED that it contain at least 64 bits of entropy. The nonce + is opaque to the client. This directive is required and MUST + appear exactly once; if not present, or if multiple instances are + present, the client should abort the authentication exchange. + + qop-options + A quoted string of one or more tokens indicating the "quality of + protection" values supported by the server. The value "auth" + indicates authentication; the value "auth-int" indicates + authentication with integrity protection; the value "auth-conf" + indicates authentication with integrity protection and encryption. + This directive is optional; if not present it defaults to "auth". + The client MUST ignore unrecognized options; if the client + recognizes no option, it should abort the authentication exchange. + + stale + The "stale" directive is not used in initial authentication. See + the next section for its use in subsequent authentications. This + directive may appear at most once; if multiple instances are + present, the client should abort the authentication exchange. + + maxbuf ("maximal ciphertext buffer size") + A number indicating the size of the largest buffer the server is + able to receive when using "auth-int" or "auth-conf". The value + MUST be bigger than 16 and smaller or equal to 16777215 (i.e. + 2**24-1). If this directive is missing, the default value is + 65536. This directive may appear at most once; if multiple + instances are present, the client should abort the authentication + exchange. + + Let call "maximal cleartext buffer size" (or "maximal sender + size") the maximal size of a cleartext buffer that, after being + transformed by integrity (section 2.3) or confidentiality (section + 2.4) protection function, will produce a SASL block of the maxbuf + size. The "maximal sender size" for the client can be calculated + by subtracting 16 from the maxbuf value. As it should be clear + from the name, the sender MUST never pass a block of data bigger + than the "maximal sender size" through the selected protection + function. This will guaranty that the receiver will never get a + block bigger than the maxbuf. + + charset + This directive, if present, specifies that the server supports + UTF-8 [UTF-8] encoding for the username and password. If present, + the username and password MUST be in Unicode Normalization Form KC + [UNICODE-NORMALIZATION] (without NUL character) encoded as UTF-8 + [UTF-8]. If not present, the username and password must be + + + +Leach & Newman Expires: December 2002 [Page 7] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + + encoded in ISO 8859-1 [ISO-8859] (of which US-ASCII [USASCII] is a + subset). The directive is needed for backwards compatibility with + HTTP Digest, which only supports ISO 8859-1. This directive may + appear at most once; if multiple instances are present, the client + should abort the authentication exchange. + + algorithm + This directive is required for backwards compatibility with HTTP + Digest, which supports other algorithms. This directive is + required and MUST appear exactly once; if not present, or if + multiple instances are present, the client should abort the + authentication exchange. + + cipher-opts + A list of ciphers that the server supports. This directive must be + present exactly once if "auth-conf" is offered in the + "qop-options" directive, in which case the "3des" cipher is + mandatory-to-implement. The client MUST ignore unrecognized + options; if the client recognizes no option, it should abort the + authentication exchange. + + des + the Data Encryption Standard (DES) cipher [FIPS] in cipher + block chaining (CBC) mode with a 56 bit key. + + 3des + the "triple DES" cipher in CBC mode with EDE with the same key + for each E stage (aka "two keys mode") for a total key length + of 112 bits. + + rc4, rc4-40, rc4-56 + the RC4 cipher with a 128 bit, 40 bit, and 56 bit key, + respectively. + + auth-param This construct allows for future extensions; it may appear + more than once. The client MUST ignore any unrecognized + directives. + + For use as a SASL mechanism, note that the following changes are made + to "digest-challenge" from HTTP: the following Digest options (called + "directives" in HTTP terminology) are unused (i.e., MUST NOT be sent, + and MUST be ignored if received): + + opaque + domain + + The size of a digest-challenge MUST be less than 2048 bytes. + + + + +Leach & Newman Expires: December 2002 [Page 8] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + +2.1.2 Step Two + + The client makes note of the "digest-challenge" and then responds + with a string formatted and computed according to the rules for a + "digest-response" defined as follows: + + digest-response = 1#( username | realm | nonce | cnonce | + nonce-count | qop | digest-uri | response | + maxbuf | charset | cipher | authzid | + auth-param ) + + username = "username" "=" <"> username-value <"> + username-value = qdstr-val + cnonce = "cnonce" "=" <"> cnonce-value <"> + cnonce-value = *qdtext + nonce-count = "nc" "=" nc-value + nc-value = 8LHEX + qop = "qop" "=" qop-value + digest-uri = "digest-uri" "=" <"> digest-uri-value <"> + digest-uri-value = serv-type "/" host [ "/" serv-name ] + serv-type = 1*ALPHA + serv-name = host + response = "response" "=" response-value + response-value = 32LHEX + LHEX = "0" | "1" | "2" | "3" | + "4" | "5" | "6" | "7" | + "8" | "9" | "a" | "b" | + "c" | "d" | "e" | "f" + cipher = "cipher" "=" cipher-value + authzid = "authzid" "=" <"> authzid-value <"> + authzid-value = qdstr-val + + The 'host' non-terminal is defined in [RFC 2732] as + + host = hostname | IPv4address | IPv6reference + ipv6reference = "[" IPv6address "]" + + where IPv6address and IPv4address are defined in [RFC 2373] + and 'hostname' is defined in [RFC 2396]. + + username + The user's name in the specified realm, encoded according to the + value of the "charset" directive. This directive is required and + MUST be present exactly once; otherwise, authentication fails. + + realm + The realm containing the user's account. This directive is + required if the server provided any realms in the + + + +Leach & Newman Expires: December 2002 [Page 9] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + + "digest-challenge", in which case it may appear exactly once and + its value SHOULD be one of those realms. If the directive is + missing, "realm-value" will set to the empty string when computing + A1 (see below for details). + + nonce + The server-specified data string received in the preceding digest- + challenge. This directive is required and MUST be present exactly + once; otherwise, authentication fails. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Leach & Newman Expires: December 2002 [Page 10] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + + cnonce + A client-specified data string which MUST be different each time a + digest-response is sent as part of initial authentication. The + cnonce-value is an opaque quoted string value provided by the + client and used by both client and server to avoid chosen + plaintext attacks, and to provide mutual authentication. The + security of the implementation depends on a good choice. It is + RECOMMENDED that it contain at least 64 bits of entropy. This + directive is required and MUST be present exactly once; otherwise, + authentication fails. + + nonce-count + The nc-value is the hexadecimal count of the number of requests + (including the current request) that the client has sent with the + nonce value in this request. For example, in the first request + sent in response to a given nonce value, the client sends + "nc=00000001". The purpose of this directive is to allow the + server to detect request replays by maintaining its own copy of + this count - if the same nc-value is seen twice, then the request + is a replay. See the description below of the construction of the + response value. This directive is required and MUST be present + exactly once; otherwise, authentication fails. + + qop + Indicates what "quality of protection" the client accepted. If + present, it may appear exactly once and its value MUST be one of + the alternatives in qop-options. If not present, it defaults to + "auth". These values affect the computation of the response. Note + that this is a single token, not a quoted list of alternatives. + + serv-type + Indicates the type of service, such as "www" for web service, + "ftp" for FTP service, "smtp" for mail delivery service, etc. The + service name as defined in the SASL profile for the protocol see + section 4 of [RFC 2222], registered in the IANA registry of + "service" elements for the GSSAPI host-based service name form + [RFC 2078]. + + host + The DNS host name or IP (IPv4 or IPv6) address for the service + requested. The DNS host name must be the fully-qualified + canonical name of the host. The DNS host name is the preferred + form; see notes on server processing of the digest-uri. + + + + + + + + +Leach & Newman Expires: December 2002 [Page 11] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + + serv-name + Indicates the name of the service if it is replicated. The service + is considered to be replicated if the client's service-location + process involves resolution using standard DNS lookup operations, + and if these operations involve DNS records (such as SRV [RFC + 2052], or MX) which resolve one DNS name into a set of other DNS + names. In this case, the initial name used by the client is the + "serv-name", and the final name is the "host" component. For + example, the incoming mail service for "example.com" may be + replicated through the use of MX records stored in the DNS, one of + which points at an SMTP server called "mail3.example.com"; it's + "serv-name" would be "example.com", it's "host" would be + "mail3.example.com". If the service is not replicated, or the + serv-name is identical to the host, then the serv-name component + MUST be omitted. + + digest-uri + Indicates the principal name of the service with which the client + wishes to connect, formed from the serv-type, host, and serv-name. + For example, the FTP service on "ftp.example.com" would have a + "digest-uri" value of "ftp/ftp.example.com"; the SMTP server from + the example above would have a "digest-uri" value of + "smtp/mail3.example.com/example.com". + + Servers SHOULD check that the supplied value is correct. This will + detect accidental connection to the incorrect server. It is also so + that clients will be trained to provide values that will work with + implementations that use a shared back-end authentication service + that can provide server authentication. + + The serv-type component should match the service being offered. The + host component should match one of the host names of the host on + which the service is running, or it's IP address. Servers SHOULD NOT + normally support the IP address form, because server authentication + by IP address is not very useful; they should only do so if the DNS + is unavailable or unreliable. The serv-name component should match + one of the service's configured service names. + + This directive may appear at most once; if multiple instances are + present, the client should abort the authentication exchange. + + Note: In the HTTP use of Digest authentication, the digest-uri is the + URI (usually a URL) of the resource requested -- hence the name of + the directive. + + response + A string of 32 hex digits computed as defined below, which proves + that the user knows a password. This directive is required and + + + +Leach & Newman Expires: December 2002 [Page 12] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + + MUST be present exactly once; otherwise, authentication fails. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Leach & Newman Expires: December 2002 [Page 13] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + + maxbuf + A number indicating the size of the largest buffer the client is + able to receive. If this directive is missing, the default value + is 65536. This directive may appear at most once; if multiple + instances are present, the server should abort the authentication + exchange. + + charset + This directive, if present, specifies that the client has used + UTF-8 [UTF-8] encoding for the username and password. If present, + the username and password MUST be in Unicode Normalization Form KC + [UNICODE-NORMALIZATION] (without NUL character) encoded as UTF-8 + [UTF-8]. If not present, the username and password must be encoded + in ISO 8859-1 [ISO-8859] (of which + US-ASCII [USASCII] is a subset). The client should send this + directive only if the server has indicated it supports UTF-8 + [UTF-8]. The directive is needed for backwards compatibility with + HTTP Digest, which only supports ISO 8859-1. + + LHEX + 32 hex digits, where the alphabetic characters MUST be lower case, + because MD5 is not case insensitive. + + cipher + The cipher chosen by the client. This directive MUST appear + exactly once if "auth-conf" is negotiated; if required and not + present, authentication fails. + + authzid + The "authorization ID" in Unicode Normalization Form KC [UNICODE- + NORMALIZATION] without NUL character, encoded in UTF-8 [UTF-8]. + This directive is optional. If present, and the authenticating + user has sufficient privilege, and the server supports it, then + after authentication the server will use this identity for making + all accesses and access checks. If the client specifies it, and + the server does not support it, then the response-value calculated + on the server will not match the one calculated on the client and + authentication will fail. + + The size of a digest-response MUST be less than 4096 bytes. + +2.1.2.1 Response-value + + The definition of "response-value" above indicates the encoding for + its value -- 32 lower case hex characters. The following definitions + show how the value is computed. + + Although qop-value and components of digest-uri-value may be + + + +Leach & Newman Expires: December 2002 [Page 14] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + + case-insensitive, the case which the client supplies in step two is + preserved for the purpose of computing and verifying the + response-value. + + response-value = + HEX( KD ( HEX(H(A1)), + { nonce-value, ":" nc-value, ":", + cnonce-value, ":", qop-value, ":", HEX(H(A2)) })) + + If authzid is specified, then A1 is + + + A1 = { H( { unq(username-value), ":", unq(realm-value), ":", passwd } ), + ":", nonce-value, ":", cnonce-value, ":", unq(authzid-value) } + + If authzid is not specified, then A1 is + + + A1 = { H( { unq(username-value), ":", unq(realm-value), ":", passwd } ), + ":", nonce-value, ":", cnonce-value } + + where + + passwd = *OCTET + + The "username-value", "realm-value" and "passwd" are encoded + according to the value of the "charset" directive. If "charset=UTF-8" + is present, and all the characters of "username-value"/"passwd" are, + after converting to Unicode Normalization Form KC [UNICODE- + NORMALIZATION], in the ISO 8859-1 character set, then it must be + converted to ISO 8859-1 before being hashed. This is so that + authentication databases that store the hashed username, realm and + password (which is common) can be shared compatibly with HTTP, which + specifies ISO 8859-1. A sample implementation of this conversion is + in section 8. + + If the "qop" directive's value is "auth", then A2 is: + + A2 = { "AUTHENTICATE:", digest-uri-value } + + If the "qop" value is "auth-int" or "auth-conf" then A2 is: + + A2 = { "AUTHENTICATE:", digest-uri-value, + ":00000000000000000000000000000000" } + + Note that "AUTHENTICATE:" must be in upper case, and the second + string constant is a string with a colon followed by 32 zeros. + + + + +Leach & Newman Expires: December 2002 [Page 15] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + + These apparently strange values of A2 are for compatibility with + HTTP; they were arrived at by setting "Method" to "AUTHENTICATE" and + the hash of the entity body to zero in the HTTP digest calculation of + A2. + + Also, in the HTTP usage of Digest, several directives in the + "digest-challenge" sent by the server have to be returned by the + client in the "digest-response". These are: + + opaque + algorithm + + These directives are not needed when Digest is used as a SASL + mechanism (i.e., MUST NOT be sent, and MUST be ignored if received). + +2.1.3 Step Three + + The server receives and validates the "digest-response". The server + checks that the nonce-count is "00000001". If it supports subsequent + authentication (see section 2.2), it saves the value of the nonce and + the nonce-count. It sends a message formatted as follows: + + response-auth = "rspauth" "=" response-value + + where response-value is calculated as above, using the values sent in + step two, except that if qop is "auth", then A2 is + + A2 = { ":", digest-uri-value } + + And if qop is "auth-int" or "auth-conf" then A2 is + + A2 = { ":", digest-uri-value, ":00000000000000000000000000000000" } + + Compared to its use in HTTP, the following Digest directives in the + "digest-response" are unused: + + nextnonce + qop + cnonce + nonce-count + +2.2 Subsequent Authentication + + If the client has previously authenticated to the server, and + remembers the values of username, realm, nonce, nonce-count, cnonce, + and qop that it used in that authentication, and the SASL profile for + a protocol permits an initial client response, then it MAY perform + "subsequent authentication", as defined in this section. + + + +Leach & Newman Expires: December 2002 [Page 16] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + +2.2.1 Step one + + The client uses the values from the previous authentication and sends + an initial response with a string formatted and computed according to + the rules for a "digest-response", as defined above, but with a + nonce-count one greater than used in the last "digest-response". + +2.2.2 Step Two + + The server receives the "digest-response". If the server does not + support subsequent authentication, then it sends a + "digest-challenge", and authentication proceeds as in initial + authentication. If the server has no saved nonce and nonce-count from + a previous authentication, then it sends a "digest-challenge", and + authentication proceeds as in initial authentication. Otherwise, the + server validates the "digest-response", checks that the nonce-count + is one greater than that used in the previous authentication using + that nonce, and saves the new value of nonce-count. + + If the response is invalid, then the server sends a + "digest-challenge", and authentication proceeds as in initial + authentication (and should be configurable to log an authentication + failure in some sort of security audit log, since the failure may be + a symptom of an attack). The nonce-count MUST NOT be incremented in + this case: to do so would allow a denial of service attack by sending + an out-of-order nonce-count. + + If the response is valid, the server MAY choose to deem that + authentication has succeeded. However, if it has been too long since + the previous authentication, or for any other reason, the server MAY + send a new "digest-challenge" with a new value for nonce. The + challenge MAY contain a "stale" directive with value "true", which + says that the client may respond to the challenge using the password + it used in the previous response; otherwise, the client must solicit + the password anew from the user. This permits the server to make sure + that the user has presented their password recently. (The directive + name refers to the previous nonce being stale, not to the last use of + the password.) Except for the handling of "stale", after sending the + "digest-challenge" authentication proceeds as in the case of initial + authentication. + +2.3 Integrity Protection + + If the server offered "qop=auth-int" and the client responded + "qop=auth-int", then subsequent messages, up to but not including the + next subsequent authentication, between the client and the server + + + + + +Leach & Newman Expires: December 2002 [Page 17] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + + MUST be integrity protected. Using as a base session key the value of + H(A1) as defined above the client and server calculate a pair of + message integrity keys as follows. + + The key for integrity protecting messages from client to server is: + + Kic = MD5({H(A1), + "Digest session key to client-to-server signing key magic constant"}) + + The key for integrity protecting messages from server to client is: + + Kis = MD5({H(A1), + "Digest session key to server-to-client signing key magic constant"}) + + where MD5 is as specified in [RFC 1321]. If message integrity is + negotiated, a MAC block for each message is appended to the message. + The MAC block is 16 bytes: the first 10 bytes of the HMAC-MD5 [RFC + 2104] of the message, a 2-byte message type number in network byte + order with value 1, and the 4-byte sequence number in network byte + order. The message type is to allow for future extensions such as + rekeying. + + MAC(Ki, SeqNum, msg) = (HMAC(Ki, {SeqNum, msg})[0..9], 0x0001, + SeqNum) + + where Ki is Kic for messages sent by the client and Kis for those + sent by the server. The sequence number is initialized to zero, and + incremented by one for each message sent. + + Upon receipt, MAC(Ki, SeqNum, msg) is computed and compared with the + received value; the message is discarded if they differ. + +2.4 Confidentiality Protection + + If the server sent a "cipher-opts" directive and the client responded + with a "cipher" directive, then subsequent messages between the + client and the server MUST be confidentiality protected. Using as a + base session key the value of H(A1) as defined above the client and + server calculate a pair of message integrity keys as follows. + + The key for confidentiality protecting messages from client to server + is: + + Kcc = MD5({H(A1)[0..n-1], + "Digest H(A1) to client-to-server sealing key magic constant"}) + + The key for confidentiality protecting messages from server to client + is: + + + +Leach & Newman Expires: December 2002 [Page 18] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + + Kcs = MD5({H(A1)[0..n-1], + "Digest H(A1) to server-to-client sealing key magic constant"}) + + where MD5 is as specified in [RFC 1321]. For cipher "rc4-40" n is 5; + for "rc4-56" n is 7; for the rest n is 16. The key for the "rc4-*" + ciphers is all 16 bytes of Kcc or Kcs; the key for "des" is the first + 7 bytes; the key for "3des" is the first 14 bytes. The IV for "des" + and "3des" is the last 8 bytes of Kcc or Kcs. + + The MAC block is a variable length padding prefix followed by 16 + bytes formatted as follows: the first 10 bytes of the HMAC-MD5 [RFC + 2104] of the message, a 2-byte message type number in network byte + order with value 1, and the 4-byte sequence number in network byte + order. If the blocksize of the chosen cipher is not 1 byte, the + padding prefix is one or more octets each containing the number of + padding bytes, such that total length of the encrypted part of the + message is a multiple of the blocksize. The padding and first 10 + bytes of the MAC block are encrypted with the chosen cipher along + with the message. + + SEAL(Ki, Kc, SeqNum, msg) = + {CIPHER(Kc, {msg, pad, HMAC(Ki, {SeqNum, msg})[0..9])}), 0x0001, + SeqNum} + + where CIPHER is the chosen cipher, Ki and Kc are Kic and Kcc for + messages sent by the client and Kis and Kcs for those sent by the + server. The sequence number is initialized to zero, and incremented + by one for each message sent. + + Upon receipt, the message is decrypted, HMAC(Ki, {SeqNum, msg}) is + computed and compared with the received value; the message is + discarded if they differ. + +3 Security Considerations + +3.1 Authentication of Clients using Digest Authentication + + Digest Authentication does not provide a strong authentication + mechanism, when compared to public key based mechanisms, for example. + However, since it prevents chosen plaintext attacks, it is stronger + than (e.g.) CRAM-MD5, which has been proposed for use with ACAP [RFC + 2244], POP and IMAP [RFC 2195]. It is intended to replace the much + weaker and even more dangerous use of plaintext passwords; however, + since it is still a password based mechanism it avoids some of the + potential deployabilty issues with public-key, OTP or similar + mechanisms. + + Digest Authentication offers no confidentiality protection beyond + + + +Leach & Newman Expires: December 2002 [Page 19] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + + protecting the actual password. All of the rest of the challenge and + response are available to an eavesdropper, including the user's name + and authentication realm. + +3.2 Comparison of Digest with Plaintext Passwords + + The greatest threat to the type of transactions for which these + protocols are used is network snooping. This kind of transaction + might involve, for example, online access to a mail service whose use + is restricted to paying subscribers. With plaintext password + authentication an eavesdropper can obtain the password of the user. + This not only permits him to access anything in the database, but, + often worse, will permit access to anything else the user protects + with the same password. + +3.3 Replay Attacks + + Replay attacks are defeated if the client or the server chooses a + fresh nonce for each authentication, as this specification requires. + +3.4 Online dictionary attacks + + If the attacker can eavesdrop, then it can test any overheard + nonce/response pairs against a (potentially very large) list of + common words. Such a list is usually much smaller than the total + number of possible passwords. The cost of computing the response for + each password on the list is paid once for each challenge. + + The server can mitigate this attack by not allowing users to select + passwords that are in a dictionary. + +3.5 Offline dictionary attacks + + If the attacker can choose the challenge, then it can precompute the + possible responses to that challenge for a list of common words. Such + a list is usually much smaller than the total number of possible + passwords. The cost of computing the response for each password on + the list is paid just once. + + Offline dictionary attacks are defeated if the client chooses a fresh + nonce for each authentication, as this specification requires. + + + + + + + + + + +Leach & Newman Expires: December 2002 [Page 20] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + +3.6 Man in the Middle + + Digest authentication is vulnerable to "man in the middle" (MITM) + attacks. Clearly, a MITM would present all the problems of + eavesdropping. But it also offers some additional opportunities to + the attacker. + + A possible man-in-the-middle attack would be to substitute a weaker + qop scheme for the one(s) sent by the server; the server will not be + able to detect this attack. For this reason, the client should always + use the strongest scheme that it understands from the choices + offered, and should never choose a scheme that does not meet its + minimum requirements. + +3.7 Chosen plaintext attacks + + A chosen plaintext attack is where a MITM or a malicious server can + arbitrarily choose the challenge that the client will use to compute + the response. The ability to choose the challenge is known to make + cryptanalysis much easier [MD5]. + + However, Digest does not permit the attack to choose the challenge as + long as the client chooses a fresh nonce for each authentication, as + this specification requires. + +3.8 Spoofing by Counterfeit Servers + + If a user can be led to believe that she is connecting to a host + containing information protected by a password she knows, when in + fact she is connecting to a hostile server, then the hostile server + can obtain challenge/response pairs where it was able to partly + choose the challenge. There is no known way that this can be + exploited. + +3.9 Storing passwords + + Digest authentication requires that the authenticating agent (usually + the server) store some data derived from the user's name and password + in a "password file" associated with a given realm. Normally this + might contain pairs consisting of username and H({ username-value, + ":", realm-value, ":", passwd }), which is adequate to compute H(A1) + as described above without directly exposing the user's password. + + The security implications of this are that if this password file is + compromised, then an attacker gains immediate access to documents on + the server using this realm. Unlike, say a standard UNIX password + file, this information need not be decrypted in order to access + documents in the server realm associated with this file. On the other + + + +Leach & Newman Expires: December 2002 [Page 21] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + + hand, decryption, or more likely a brute force attack, would be + necessary to obtain the user's password. This is the reason that the + realm is part of the digested data stored in the password file. It + means that if one Digest authentication password file is compromised, + it does not automatically compromise others with the same username + and password (though it does expose them to brute force attack). + + There are two important security consequences of this. First the + password file must be protected as if it contained plaintext + passwords, because for the purpose of accessing documents in its + realm, it effectively does. + + A second consequence of this is that the realm string should be + unique among all realms that any single user is likely to use. In + particular a realm string should include the name of the host doing + the authentication. + +3.10 Multiple realms + + Use of multiple realms may mean both that compromise of a the + security database for a single realm does not compromise all + security, and that there are more things to protect in order to keep + the whole system secure. + +3.11 Summary + + By modern cryptographic standards Digest Authentication is weak, + compared to (say) public key based mechanisms. But for a large range + of purposes it is valuable as a replacement for plaintext passwords. + Its strength may vary depending on the implementation. + +4 Example + + This example shows the use of the Digest SASL mechanism with the + IMAP4 AUTHENTICATE command [RFC 2060]. + + In this example, "C:" and "S:" represent a line sent by the client or + server respectively including a CRLF at the end. Linebreaks and + indentation within a "C:" or "S:" are editorial and not part of the + protocol. The password in this example was "secret". Note that the + base64 encoding of the challenges and responses is part of the IMAP4 + AUTHENTICATE command, not part of the Digest specification itself. + + S: * OK elwood.innosoft.com PMDF IMAP4rev1 V6.0-9 + C: c CAPABILITY + S: * CAPABILITY IMAP4 IMAP4rev1 ACL LITERAL+ NAMESPACE QUOTA + UIDPLUS AUTH=CRAM-MD5 AUTH=DIGEST-MD5 AUTH=PLAIN + S: c OK Completed + + + +Leach & Newman Expires: December 2002 [Page 22] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + + C: a AUTHENTICATE DIGEST-MD5 + S: + cmVhbG09ImVsd29vZC5pbm5vc29mdC5jb20iLG5vbmNlPSJPQTZNRzl0 + RVFHbTJoaCIscW9wPSJhdXRoIixhbGdvcml0aG09bWQ1LXNlc3MsY2hh + cnNldD11dGYtOA== + C: Y2hhcnNldD11dGYtOCx1c2VybmFtZT0iY2hyaXMiLHJlYWxtPSJlbHdvb2 + QuaW5ub3NvZnQuY29tIixub25jZT0iT0E2TUc5dEVRR20yaGgiLG5jPTAw + MDAwMDAxLGNub25jZT0iT0E2TUhYaDZWcVRyUmsiLGRpZ2VzdC11cmk9Im + ltYXAvZWx3b29kLmlubm9zb2Z0LmNvbSIscmVzcG9uc2U9ZDM4OGRhZDkw + ZDRiYmQ3NjBhMTUyMzIxZjIxNDNhZjcscW9wPWF1dGg= + S: + cnNwYXV0aD1lYTQwZjYwMzM1YzQyN2I1NTI3Yjg0ZGJhYmNkZmZmZA== + C: + S: a OK User logged in + --- + + The base64-decoded version of the SASL exchange is: + + S: realm="elwood.innosoft.com",nonce="OA6MG9tEQGm2hh",qop="auth", + algorithm=md5-sess,charset=utf-8 + C: charset=utf-8,username="chris",realm="elwood.innosoft.com", + nonce="OA6MG9tEQGm2hh",nc=00000001,cnonce="OA6MHXh6VqTrRk", + digest-uri="imap/elwood.innosoft.com", + response=d388dad90d4bbd760a152321f2143af7,qop=auth + S: rspauth=ea40f60335c427b5527b84dbabcdfffd + + The password in this example was "secret". + + This example shows the use of the Digest SASL mechanism with the + ACAP, using the same notational conventions and password as in the + previous example. Note that ACAP does not base64 encode and uses + fewer round trips that IMAP4. + + S: * ACAP (IMPLEMENTATION "Test ACAP server") (SASL "CRAM-MD5" + "DIGEST-MD5" "PLAIN") + C: a AUTHENTICATE "DIGEST-MD5" + S: + {94} + S: realm="elwood.innosoft.com",nonce="OA9BSXrbuRhWay",qop="auth", + algorithm=md5-sess,charset=utf-8 + C: {206} + C: charset=utf-8,username="chris",realm="elwood.innosoft.com", + nonce="OA9BSXrbuRhWay",nc=00000001,cnonce="OA9BSuZWMSpW8m", + digest-uri="acap/elwood.innosoft.com", + response=6084c6db3fede7352c551284490fd0fc,qop=auth + S: a OK (SASL {40} + S: rspauth=2f0b3d7c3c2e486600ef710726aa2eae) "AUTHENTICATE + Completed" + --- + + + + + +Leach & Newman Expires: December 2002 [Page 23] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + + The server uses the values of all the directives, plus knowledge of + the users password (or the hash of the user's name, server's realm + and the user's password) to verify the computations above. If they + check, then the user has authenticated. + +5 References + +5.1 Normative references + + [Digest] Franks, J., et al., "HTTP Authentication: Basic and Digest + Access Authentication", RFC 2617, June 1999. + + [ISO-8859] ISO-8859. International Standard--Information Processing-- + 8-bit Single-Byte Coded Graphic Character Sets -- + Part 1: Latin alphabet No. 1, ISO-8859-1:1987. + Part 2: Latin alphabet No. 2, ISO-8859-2, 1987. + Part 3: Latin alphabet No. 3, ISO-8859-3, 1988. + Part 4: Latin alphabet No. 4, ISO-8859-4, 1988. + Part 5: Latin/Cyrillic alphabet, ISO-8859-5, 1988. + Part 6: Latin/Arabic alphabet, ISO-8859-6, 1987. + Part 7: Latin/Greek alphabet, ISO-8859-7, 1987. + Part 8: Latin/Hebrew alphabet, ISO-8859-8, 1988. + Part 9: Latin alphabet No. 5, ISO-8859-9, 1990. + + [RFC 822] Crocker, D., "Standard for The Format of ARPA Internet + Text Messages," STD 11, RFC 822, August 1982. + + [RFC 1321] Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321, + April 1992. + + [RFC 2052] Gulbrandsen, A. and P. Vixie, "A DNS RR for specifying the + location of services (DNS SRV)", RFC 2052, October 1996. + + [RFC 2104] Krawczyk, H., Bellare, M. and R. Canetti, "HMAC: Keyed- + Hashing for Message Authentication", RFC 2104, February + 1997. + + + + + + + + + + + + + + + +Leach & Newman Expires: December 2002 [Page 24] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + + [RFC 2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [RFC 2222] Myers, J., "Simple Authentication and Security Layer + (SASL)", RFC 2222, October 1997. + + [UNICODE-NORMALIZATION] Davis, Durst, "Unicode Standard Annex #15: + Unicode Normalization Forms", + http://www.unicode.org/unicode/reports/tr15/, March 2001. + + [UTF-8] Yergeau, "UTF-8, a transformation format of ISO 10646", RFC + 2279, Janyary 1998. + + [USASCII] US-ASCII. Coded Character Set - 7-Bit American Standard + Code for Information Interchange. Standard ANSI X3.4-1986, + ANSI, 1986. + + [RFC 2732] Hinden, R., Carpenter, B., Masinter, L., "Format for + Literal IPv6 Addresses in URL's", RFC 2732, December 1999. + + [RFC 2373] Hinden, R., Deering, S., "IP Version 6 Addressing + Architecture", RFC 2373, July 1998. + + [RFC 2396] Berners-Lee, T., Fielding, R., Masinter, L., "Uniform + Resource Identifiers (URI): Generic Syntax", RFC 2396, + August 1998. + +5.2 Informative references + + [RFC 2195] Klensin, J., Catoe, R. and P. Krumviede, "IMAP/POP + AUTHorize Extension for Simple Challenge/Response", RFC + 2195, September 1997. + + [MD5] Kaliski, B.,Robshaw, M., "Message Authentication with MD5", + CryptoBytes, Sping 1995, RSA Inc, + (http://www.rsa.com/rsalabs/pubs/cryptobytes/spring95/md5.htm) + + [RFC 2078] Linn, J., "Generic Security Service Application Program + Interface, Version 2", RFC 2078, January 1997. + + [RFC 2060] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, December 1996. + + [RFC 2244] Newman, C., Myers, J., "ACAP -- Application Configuration + Access Protocol", RFC 2244, November 1997. + + [RFC 2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., + Masinter, L., Leach, P., Berners-Lee, T., "Hypertext + + + +Leach & Newman Expires: December 2002 [Page 25] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + + Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999. + +6 Authors' Addresses + + Paul Leach + Microsoft + 1 Microsoft Way + Redmond, WA 98052 + + EMail: paulle@microsoft.com + + + Chris Newman + Innosoft International, Inc. + 1050 Lakes Drive + West Covina, CA 91790 USA + + EMail: chris.newman@innosoft.com + + + Alexey Melnikov + ACI WorldWide/MessagingDirect + 22 The Quadrant, Richmond, Surrey, TW9 1BP, UK + + Email: mel@messagingdirect.com + + + + + + + + + + + + + + + + + + + + + + + + + + +Leach & Newman Expires: December 2002 [Page 26] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + +7 ABNF + + What follows is the definition of the notation as is used in the + HTTP/1.1 specification [RFC 2616] and the HTTP authentication + specification [Digest]; it is reproduced here for ease of reference. + Since it is intended that a single Digest implementation can support + both HTTP and SASL-based protocols, the same notation is used in both + to facilitate comparison and prevention of unwanted differences. + Since it is cut-and-paste from the HTTP specifications, not all + productions may be used in this specification. It is also not quite + legal ABNF; again, the errors were copied from the HTTP + specifications. + +7.1 Augmented BNF + + All of the mechanisms specified in this document are described in + both prose and an augmented Backus-Naur Form (BNF) similar to that + used by RFC 822 [RFC 822]. Implementers will need to be familiar with + the notation in order to understand this specification. + + The augmented BNF includes the following constructs: + + name = definition + The name of a rule is simply the name itself (without any + enclosing "<" and ">") and is separated from its definition by the + equal "=" character. White space is only significant in that + indentation of continuation lines is used to indicate a rule + definition that spans more than one line. Certain basic rules are + in uppercase, such as SP, LWS, HT, CRLF, DIGIT, ALPHA, etc. Angle + brackets are used within definitions whenever their presence will + facilitate discerning the use of rule names. + + "literal" + Quotation marks surround literal text. Unless stated otherwise, + the text is case-insensitive. + + rule1 | rule2 + Elements separated by a bar ("|") are alternatives, e.g., "yes | + no" will accept yes or no. + + (rule1 rule2) + Elements enclosed in parentheses are treated as a single element. + Thus, "(elem (foo | bar) elem)" allows the token sequences + "elem foo elem" and "elem bar elem". + + *rule + The character "*" preceding an element indicates repetition. The + full form is "*element" indicating at least and at most + + + +Leach & Newman Expires: December 2002 [Page 27] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + + occurrences of element. Default values are 0 and infinity so + that "*(element)" allows any number, including zero; "1*element" + requires at least one; and "1*2element" allows one or two. + + [rule] + Square brackets enclose optional elements; "[foo bar]" is + equivalent to "*1(foo bar)". + + N rule + Specific repetition: "(element)" is equivalent to + "*(element)"; that is, exactly occurrences of (element). + Thus 2DIGIT is a 2-digit number, and 3ALPHA is a string of three + alphabetic characters. + + #rule + A construct "#" is defined, similar to "*", for defining lists of + elements. The full form is "#element" indicating at least + and at most elements, each separated by one or more commas + (",") and OPTIONAL linear white space (LWS). This makes the usual + form of lists very easy; a rule such as + ( *LWS element *( *LWS "," *LWS element )) + can be shown as + 1#element + Wherever this construct is used, null elements are allowed, but do + not contribute to the count of elements present. That is, + "(element), , (element) " is permitted, but counts as only two + elements. Therefore, where at least one element is required, at + least one non-null element MUST be present. Default values are 0 + and infinity so that "#element" allows any number, including zero; + "1#element" requires at least one; and "1#2element" allows one or + two. + + ; comment + A semi-colon, set off some distance to the right of rule text, + starts a comment that continues to the end of line. This is a + simple way of including useful notes in parallel with the + specifications. + + implied *LWS + The grammar described by this specification is word-based. Except + where noted otherwise, linear white space (LWS) can be included + between any two adjacent words (token or quoted-string), and + between adjacent words and separators, without changing the + interpretation of a field. At least one delimiter (LWS and/or + separators) MUST exist between any two tokens (for the definition + of "token" below), since they would otherwise be interpreted as a + single token. + + + + +Leach & Newman Expires: December 2002 [Page 28] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + +7.2 Basic Rules + + The following rules are used throughout this specification to + describe basic parsing constructs. The US-ASCII coded character set + is defined by ANSI X3.4-1986 [USASCII]. + + OCTET = + CHAR = + UPALPHA = + LOALPHA = + ALPHA = UPALPHA | LOALPHA + DIGIT = + CTL = + CR = + LF = + SP = + HT = + <"> = + TEXTCHAR = + CRLF = CR LF + + All linear white space, including folding, has the same semantics as + SP. A recipient MAY replace any linear white space with a single SP + before interpreting the field value or forwarding the message + downstream. + + LWS = [CRLF] 1*( SP | HT ) + + The TEXT rule is only used for descriptive field contents and values + that are not intended to be interpreted by the message parser. Words + of TEXT contains characters either from ISO-8859-1 [ISO-8859] + character set or UTF-8 [UTF-8]. + + TEXT = + + A CRLF is allowed in the definition of TEXT only as part of a header + field continuation. It is expected that the folding LWS will be + replaced with a single SP before interpretation of the TEXT value. + + Hexadecimal numeric characters are used in several protocol elements. + + HEX = "A" | "B" | "C" | "D" | "E" | "F" + | "a" | "b" | "c" | "d" | "e" | "f" | DIGIT + + Many HTTP/1.1 header field values consist of words separated by LWS + or special characters. These special characters MUST be in a quoted + + + +Leach & Newman Expires: December 2002 [Page 29] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + + string to be used within a parameter value. + + token = 1*TOKENCHAR + separators = "(" | ")" | "<" | ">" | "@" + | "," | ";" | ":" | "\" | <"> + | "/" | "[" | "]" | "?" | "=" + | "{" | "}" | SP | HT + TOKENCHAR = + + A string of text is parsed as a single word if it is quoted using + double-quote marks. + + quoted-string = ( <"> qdstr-val <"> ) + qdstr-val = *( qdtext | quoted-pair ) + qdtext = and "\"> + + Note that LWS is NOT implicit between the double-quote marks (<">) + surrounding a qdstr-val and the qdstr-val; any LWS will be considered + part of the qdstr-val. This is also the case for quotation marks + surrounding any other construct. + + The backslash character ("\") MAY be used as a single-character + quoting mechanism only within qdstr-val and comment constructs. + + quoted-pair = "\" CHAR + + The value of this construct is CHAR. Note that an effect of this rule + is that backslash itself MUST be quoted. + + + + + + + + + + + + + + + + + + + + + + + +Leach & Newman Expires: December 2002 [Page 30] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + +8 Sample Code + + The sample implementation in [Digest] also applies to DIGEST-MD5. + + The following code implements the conversion from UTF-8 to 8859-1 if + necessary. + + /* if the string is entirely in the 8859-1 subset of UTF-8, then + * translate to 8859-1 prior to MD5 + */ + void MD5_UTF8_8859_1(MD5_CTX *ctx, const unsigned char *base, + int len) + { + const unsigned char *scan, *end; + unsigned char cbuf; + + end = base + len; + for (scan = base; scan < end; ++scan) { + if (*scan > 0xC3) break; /* abort if outside 8859-1 */ + if (*scan >= 0xC0 && *scan <= 0xC3) { + if (++scan == end || *scan < 0x80 || *scan > 0xBF) + break; + } + } + /* if we found a character outside 8859-1, don't alter string + */ + if (scan < end) { + MD5Update(ctx, base, len); + return; + } + + /* convert to 8859-1 prior to applying hash + */ + do { + for (scan = base; scan < end && *scan < 0xC0; ++scan) + ; + if (scan != base) MD5Update(ctx, base, scan - base); + if (scan + 1 >= end) break; + cbuf = ((scan[0] & 0x3) << 6) | (scan[1] & 0x3f); + MD5Update(ctx, &cbuf, 1); + base = scan + 2; + } while (base < end); + } + + + + + + + + +Leach & Newman Expires: December 2002 [Page 31] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + +9 Interoperability considerations + + 9.1 Implementing DES cipher in CBC mode + + Several cryptographic libraries (Ebones, OpenSSL) provide a convenience + function des_cbc_encrypt for implementing DES cipher in CBC mode. + There is a documented bug in this function: the function doesn't update + IV before returning. If an implementation uses this function to implement + DES cipher in CBC mode, it MUST update IV by copying the last 8 bytes of + the des_cbc_encrypt's output to the IV buffer. + + Note that the function des_ede2_cbc_encrypt that may be used to implement + 3DES (in "two keys mode") in CBC mode works as expected. + +10 Full Copyright Statement + + Copyright (C) The Internet Society (2002). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + +Leach & Newman Expires: December 2002 [Page 32] + + + + + +INTERNET DRAFT Digest SASL Mechanism June 2002 + + +Appendix A: Changes from 2831 + + 1). Fixed various typos in formulas. + + 2). Dropped DES as mandatory to implement cipher (3DES is mandatory + to implement). + + 3). Tighten ABNF. Fixed some bugs. + + 4). Clarified nc-value verification and which side is aborting + exchange. + + 5). Added text saying that for interoperability username/password + MUST be normalized according to Normalization form KC. + + 6). Clarified that unquoted version of the username, etc. used in A1 + calculation. + + 7). Various cleanup to References section. Split all references to + Normative and Informative. + + 8). Added minimal and maximal limits on maxbuf. Clarified how to + calculate max sender size. + + 9). Change ABNF for host to allow for IPv6 addresses. ABNF now + references RFC 2373 and RFC 2396. + + 10). Minor text clarifications. + +Appendix B: Open Issues + + 1). The latest revision prohibits escaped characters in nonce/cnonce. + Any objections? + + 2). Is a realm in UTF-8? + + 3). Normative vs. Informative references must be carefully rechecked. + + 4). Merge DIGEST-MD5 AES cipher with this document? + + 5). What to do about CBC mode attack that affects TLS document and + DIGEST-MD5 as well? + + + + + + + + + +Leach & Newman Expires: December 2002 [Page 33] + + diff --git a/doc/specification/draft-melnikov-sasl-digest-aes-00.txt b/doc/specification/draft-melnikov-sasl-digest-aes-00.txt new file mode 100644 index 0000000..e7d33b0 --- /dev/null +++ b/doc/specification/draft-melnikov-sasl-digest-aes-00.txt @@ -0,0 +1,184 @@ +SASL Working Group A. Melnikov +Internet Draft ACI WorldWide/MessagingDirect +Document: draft-melnikov-sasl-digest-aes-00.txt February 2002 + + + AES Ciphersuites for DIGEST-MD5 SASL mechanism + +Status of this Memo + + This document is an Internet Draft and is in full conformance with + all provisions of Section 10 of RFC 2026. + + Internet Drafts are working documents of the Internet Engineering + Task Force (IETF), its Areas, and its Working Groups. Note that + other groups may also distribute working documents as Internet + Drafts. Internet Drafts are draft documents valid for a maximum of + six months. Internet Drafts may be updated, replaced, or obsoleted + by other documents at any time. It is not appropriate to use + Internet Drafts as reference material or to cite them other than as + ``work in progress''. + + The list of current Internet-Drafts can be accessed at + http://www.ietf.org/ietf/1id-abstracts.txt + + The list of Internet-Draft Shadow Directories can be accessed at + http://www.ietf.org/shadow.html. + + Directories on ds.internic.net, nic.nordu.net, ftp.isi.edu, or + munnari.oz.au. + + A revised version of this draft document will be submitted to the RFC + editor as a Proposed Standard for the Internet Community. Discussion + and suggestions for improvement are requested. Distribution of this + draft is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (2002). All Rights Reserved. + +Abstract + + This document describes the use of the AES Cipher Algorithm in Cipher + Block Chaining Mode, as a confidentiality algorithm for DIGEST-MD5 + SASL mechanism. + + +Table of Contents + + + + +1 Introduction + + At present, the symmetric ciphers supported by DIGEST-MD5 are RC4, + DES and triple DES. The SASL mechanism would be enhanced by the + addition of AES [AES] ciphersuites, for the following reasons: + + 1. RC4 is a subject to intellectual property claims. RSA Security + Inc has claims that the RC4 algorithm is a trade secret. + + 2. DES is not considered secure. + + 3. The AES is computationally and memory efficient and has withstood + extensive cryptanalytic analysis. It is easy implementable on + a variety of software and hardware, including smart cards + and handheld computers. The AES is therefore a desirable choice. + + This document proposes a new DIGEST-MD5 ciphersuite, with the aim of + overcoming these problems. + + +2 Conventions and Notation + + This document uses conventions established by [DIGEST]. + + +3 Definition of AES ciphers for Confidentiality Protection + + This document extends the ABNF definition of cipher-value defined in + section 2.1.1 of [DIGEST]. + + cipher-value |= "aes" + + where + + aes + the Advanced Encryption Standard (AES) cipher [AES] in cipher + block chaining (CBC) mode with a 128 bit key. This mode requires an + Initialization Vector (IV) that is the same size as the block size. + + Section 2.4 of [DIGEST] defines the value of "n" that is used to construct + Kcc and Kcs. For cipher "aes" n is 16. The key for the "aes" cipher is all + 16 bytes of Kcc or Kcs. + + The IV for the "aes" cipher in CBC mode for messages going from client + to server (IVc) consists of 16 bytes calculated as follows: + + IVc = MD5({Kcc, "aes-128"}) + + The IV for the "aes" cipher in CBC mode for messages going from server + to client (IVs) consists of 16 bytes calculated as follows: + + IVs = MD5({Kcs, "aes-128"}) + + The IV is XOR'd with the first plaintext block before it is encrypted. + Then for successive blocks, the previous ciphertext block is XOR'd with + the current plaintext, before it is encrypted. + + +4 Security Considerations + + It is not believed that the new ciphersuite is ever less secure + than the corresponding older ones. The AES is believed to be + secure, and it has withstood extensive cryptanalytic attack. + + The use of MD5 hash in DIGEST-MD5 limits the length of AES key to + 128 bit, because a key is the output of MD5 hash (i.e. it can't be + longer than 128 bit). + + +5 References + + [RFC 2222] Myers, J., "Simple Authentication and Security Layer + (SASL)", RFC 2222, October 1997. + + [DIGEST] Leach, P., Newman, C., "Using Digest Authentication as a + SASL Mechanism", RFC 2831, May 2000. + + [AES] Daemen, J., Rijmen, V., "The Rijndael Block Cipher", + http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf, + 3rd September 1999. + + [RFC 1321] Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321, + April 1992. + + +6 Acknowledgements + + This document borrows some text from draft-ietf-ipsec-ciph-aes-cbc-03.txt + and draft-ietf-tls-ciphersuite-06.txt. + + +7 Authors' Addresses + + Alexey Melnikov + mailto: mel@messagingdirect.com + + ACI WorldWide/MessagingDirect + 900 10117 - Jasper Ave. + Edmonton, Alberta, T5J 1W8, CANADA + + +8 Full Copyright Statement + + Copyright (C) The Internet Society (2002). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. diff --git a/doc/specification/draft-myers-saslrev-02.txt b/doc/specification/draft-myers-saslrev-02.txt new file mode 100644 index 0000000..ab833ee --- /dev/null +++ b/doc/specification/draft-myers-saslrev-02.txt @@ -0,0 +1,958 @@ + + + + + + +Network Working Group J. Myers +Internet Draft April 2002 +Document: draft-myers-saslrev-02.txt + + + Simple Authentication and Security Layer (SASL) + +Status of this Memo + + This document is an Internet Draft and is in full conformance with + all provisions of Section 10 of RFC 2026. + + Internet Drafts are working documents of the Internet Engineering + Task Force (IETF), its Areas, and its Working Groups. Note that + other groups may also distribute working documents as Internet + Drafts. Internet Drafts are draft documents valid for a maximum of + six months. Internet Drafts may be updated, replaced, or obsoleted + by other documents at any time. It is not appropriate to use + Internet Drafts as reference material or to cite them other than as + ``work in progress''. + + + The list of current Internet-Drafts can be accessed at + http://www.ietf.org/1id-abstracts.html + + The list of Internet-Draft Shadow Directories can be accessed at + http://www.ietf.org/shadow.html + + + A revised version of this draft document will be submitted to the RFC + editor as a Draft Standard for the Internet Community. Discussion + and suggestions for improvement are requested. Distribution of this + draft is unlimited. + + + + + + + + + + + + + + + + + + + + + +J. Myers [Page i] + +Internet DRAFT SASL April 6, 2002 + + + + + + Table of Contents + + + +Status of this Memo ............................................... i +1. Abstract .................................................... 2 +2. Organization of this document ............................... 2 +2.1. How to read this document ................................... 2 +2.2. Conventions used in this document ........................... 2 +3. Overview .................................................... 2 +4. Authentication mechanisms ................................... 3 +4.1. Authentication protocol exchange ............................ 4 +4.2. Authorization identities and proxy authentication ........... 4 +4.3. Security layers ............................................. 5 +4.4. Character string issues ..................................... 5 +5. Protocol profile requirements ............................... 6 +6. Specific issues ............................................. 7 +6.1. Client sends data first ..................................... 7 +6.2. Server returns success with additional data ................. 7 +6.3. Multiple authentications .................................... 8 +6.4. Token length limits ......................................... 8 +7. Registration procedures ..................................... 8 +7.1. Comments on SASL mechanism registrations .................... 9 +7.2. Location of registered SASL mechanism list .................. 9 +7.3. Change control .............................................. 9 +7.4. Registration template ....................................... 10 +8. The external mechanism ...................................... 10 +8.1 Formal syntax ............................................... 11 +8.2 Example ..................................................... 11 +9. References .................................................. 12 +10. Security considerations ..................................... 12 +11. Author's address ............................................ 13 +Appendix A. Relation of SASL to transport security ................ 14 +Appendix B. IANA considerations ................................... 15 +Appendix C. Changes since RFC 2222 ................................ 15 + + + + + + + + + + + + + +J. Myers [Page ii] + +Internet DRAFT SASL April 6, 2002 + + +1. Abstract + + SASL provides a method for adding authentication support with an + optional security layer to connection-based protocols. It also + describes a structure for authentication mechanisms. The result is + an abstraction layer between protocols and authentication mechanisms + such that any SASL-compatible authentication mechanism can be used + with any SASL-compatible protocol. + + This document describes how a SASL authentication mechanism is + structured, how a protocol adds support for SASL, defines the + protocol for carrying a security layer over a connection, and defines + the EXTERNAL SASL authentication mechanism. + +2. Organization of this document + +2.1. How to read this document + + This document is written to serve two different audiences, protocol + designers using this specification to support authentication in their + protocol, and implementors of clients or servers for those protocols + using this specification. + + The sections "Overview", "Authentication mechanisms", "Protocol + profile requirements", "Specific issues", and "Security + considerations" cover issues that protocol designers need to + understand and address in profiling this specification for use in a + specific protocol. + + Implementors of a protocol using this specification need the + protocol-specific profiling information in addition to the + information in this document. + +2.2. Conventions used in this document + + In examples, "C:" and "S:" indicate lines sent by the client and + server respectively. + + The key words "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", and "MAY" + in this document are to be interpreted as defined in "Key words for + use in RFCs to Indicate Requirement Levels" [KEYWORDS]. + +3. Overview + + The Simple Authentication and Security Layer (SASL) is a method for + adding authentication support to connection-based protocols. + + The SASL specification has three layers, as indicated in the diagram + + + +J. Myers [Page 2] + +Internet DRAFT SASL April 6, 2002 + + + below. At the top, a protocol definition using SASL specifies a + profile, including a command for identifying and authenticating a + user to a server and for optionally negotiating a security layer for + subsequent protocol interactions. At the bottom, a SASL mechanism + definition specifies an authentication mechanism. The SASL + framework, specified by this document, constrains the behavior of + protocol profiles and mechanisms, separating protocol from mechanism + and defining how they interact. + + SMTP Protocol LDAP Protocol Etc + Profile Profile . . . + \----- | -----/ + \ | / + SASL framework + / | \ + /----- | -----\ + EXTERNAL DIGEST-MD5 Etc + SASL mechanism SASL mechanism . . . + + This separation between the definition of protocols and the + definition of authentication mechanisms is crucial. It permits an + authentication mechanism to be defined once, making it usable by any + SASL protocol profiles. In many implementations, the same SASL + mechanism code is used for multiple protocols. + +4. Authentication mechanisms + + SASL mechanisms are named by strings, from 1 to 20 characters in + length, consisting of upper-case letters, digits, hyphens, and/or + underscores. SASL mechanism names must be registered with the IANA. + IETF Standards Track documents may override this registration + requirement by reserving a portion of the SASL mechanism namespace + for their own use; the GSSAPI mechanism specification [SASL-GSSAPI] + does this. Procedures for registering new SASL mechanisms are given + in the section "Registration procedures". + + The "sasl-mech" rule below defines the syntax of a SASL mechanism + name. This uses the augmented Backus-Naur Form (BNF) notation as + specified in [ABNF] and the ABNF core rules as specified in Appendix + A of the ABNF specification [ABNF]. + + sasl-mech = 1*20mech-char + mech-char = %x41-5A / DIGIT / "-" / "_" + ; mech names restricted to uppercase letters, + ; digits, "-" and "_" + + + + + + +J. Myers [Page 3] + +Internet DRAFT SASL April 6, 2002 + + +4.1. Authentication protocol exchange + + A SASL mechanism is responsible for conducting an authentication + protocol exchange. This consists of a series of server challenges + and client responses, the contents of which are specific to and + defined by the mechanism. To the protocol, the challenges and + responses are opaque binary tokens of arbitrary length. The + protocol's profile then specifies how these binary tokens are then + encoded for transfer over the connection. + + After receiving an authentication command or any client response, a + server mechanism may issue a challenge, indicate failure, or indicate + completion. The server mechanism MAY return additional data with a + completion indication. The protocol's profile specifies how each of + these is then represented over the connection. + + After receiving a challenge, a client mechanism may issue a response + or abort the exchange. The protocol's profile specifies how each of + these is then represented over the connection. + + During the authentication protocol exchange, the mechanism performs + authentication, transmits an authorization identity (frequently known + as a userid) from the client to server, and negotiates the use of a + mechanism-specific security layer. If the use of a security layer is + agreed upon, then the mechanism must also define or negotiate the + maximum security layer buffer size that each side is able to receive. + +4.2. Authorization identities and proxy authentication + + An authorization identity is a string of zero or more ISO 10646 + [ISO-10646] coded characters. The NULL (U+0000) character is not + permitted in authorization identities. The authorization identity is + used by the server as the primary identity for making access policy + decisions. + + The character encoding scheme used for transmitting an authorization + identity over protocol is specified in each authentication mechanism + (with the authentication mechanism's blob being further encoded by + the protocol profile). Per IETF character set policy [CHARSET- + POLICY], authentication mechanisms SHOULD encode these and other + strings in UTF-8 [UTF-8]. While some legacy mechanisms are incapable + of transmitting an authoriation identity other than the empty string, + newly defined mechanisms are expected to be capable of carrying the + entire repertoire produced by the string normalization rules defined + in the section "Character string issues". + + The identity derived from the client's authentication credentials is + known as the "authentication identity". With any mechanism, + + + +J. Myers [Page 4] + +Internet DRAFT SASL April 6, 2002 + + + transmitting an authorization identity of the empty string directs + the server to derive an authorization identity from the client's + authentication identity. + + If the authorization identity transmitted during the authentication + protocol exchange is not the empty string, this is typically referred + to as "proxy authentication". This feature permits agents such as + proxy servers to authenticate using their own credentials, yet + request the access privileges of the identity for which they are + proxying. + + The server makes an implementation defined policy decision as to + whether the authentication identity is permitted to have the access + privileges of the authorization identity and whether the + authorization identity is permitted to receive service. If it is + not, the server indicates failure of the authentication protocol + exchange. + + As a client might not have the same information as the server, + clients SHOULD NOT themselves try to derive authorization identities + from authentication identities when clients could instead transmit an + authorization identity of the empty string. + +4.3. Security layers + + If use of a security layer is negotiated by the authentication + protocol exchange, the security layer is applied to all subsequent + data sent over the connection. The security layer takes effect + immediately following the last response of the authentication + exchange for data sent by the client and the completion indication + for data sent by the server. + + Once the security layer is in effect, the protocol stream is + processed by the security layer into buffers of security encoded + data. Each buffer of security encoded data is transferred over the + connection as a stream of octets prepended with a four octet field in + network byte order that represents the length of the following + buffer. The length of the security encoded data buffer must be no + larger than the maximum size that was either defined in the mechanism + specification or negotiated by the other side during the + authentication protocol exchange. +4.4. Character string issues + + Per IETF character set policy [CHARSET-POLICY], authentication + mechanisms SHOULD encode character strings in UTF-8 [UTF-8]. + + In order to avoid noninteroperability due to differing + normalizations, when a mechanism specifies that a string password be + + + +J. Myers [Page 5] + +Internet DRAFT SASL April 6, 2002 + + + used as input to a cryptographic function it SHOULD specify that the + string first be normalized by the following profile of stringprep + [STRINGPREP]: + + [TODO Insert stringprep profile here. NOT specifying case folding. + Disallowing control characters.] + +5. Protocol profile requirements + + In order to use this specification, a protocol definition MUST supply + the following information: + + + 1. A service name, to be selected from the IANA registry of "service" + elements for the GSSAPI host-based service name form. [GSSAPI] + This service name is made available to the authentication + mechanism. + + The registry is available at the URL + "http://www.isi.edu/in-notes/iana/assignments/gssapi-service-names" + + 2. A definition of the command to initiate the authentication + protocol exchange. This command must have as a parameter the name + of the mechanism being selected by the client. + + The command SHOULD have an optional parameter giving an initial + response. This optional parameter allows the client to avoid a + round trip when using a mechanism which is defined to have the + client send data first. When this initial response is sent by the + client and the selected mechanism is defined to have the server + start with an initial challenge, the command fails. See section + 6.1 of this document for further information. + + 3. A definition of the method by which the authentication protocol + exchange is carried out, including how the challenges and + responses are encoded, how the server indicates completion or + failure of the exchange, how the client aborts an exchange., and + how the exchange method interacts with any line length limits in + the protocol. + + The method defined MUST be capable of transmitting challenge and + response tokens of up to 16384 octets and MUST pass this + requirement onto implementations. This length requirement applies + to the size of a token before any protocol profile specific + encoding. For example, if the protocol profile transmits tokens + encoded in the base64 encoding then the protocol profile needs to + require implementations to be capable of handling base64 token + sequences of up to 21848 characters. + + + +J. Myers [Page 6] + +Internet DRAFT SASL April 6, 2002 + + + The command SHOULD have a method for the server to include an + optional challenge with a success notification. This allows the + server to avoid a round trip when using a mechanism which is + defined to have the server send additional data along with the + indication of successful completion. See section 6.2 of this + document for further information. + + 4. Identification of the octet where any negotiated security layer + starts to take effect, in both directions. + + In addition, a protocol profile SHOULD specify a mechanism through + which a client may obtain the names of the SASL mechanisms + available to it. This is typically done through the protocol's + extensions or capabilities mechanism. + + A protocol profile MAY further refine the definition of an + authorization identity by adding additional syntactic restrictions + and protocol-specific semantics. + + A protocol profile SHOULD NOT attempt to amend the definition of + mechanisms or make mechanism-specific encodings. This breaks the + separation between protocol and mechanism that is fundamental to + the design of SASL. +6. Specific issues + +6.1. Client sends data first + + Some mechanisms specify that the first data sent in the + authentication protocol exchange is from the client to the server. + + If a protocol's profile permits the command which initiates an + authentication protocol exchange to contain an initial client + response, this parameter SHOULD be used with such mechanisms. + + If the initial client response parameter is not given, or if a + protocol's profile does not permit the command which initiates an + authentication protocol exchange to contain an initial client + response, then the server issues a challenge with no data. The + client's response to this challenge is then used as the initial + client response. (The server then proceeds to send the next + challenge, indicates completion, or indicates failure.) + +6.2. Server returns success with additional data + + Some mechanisms may specify that additional data be sent to the + client along with an indication of successful completion of the + exchange. This data would, for example, authenticate the server to + the client. + + + +J. Myers [Page 7] + +Internet DRAFT SASL April 6, 2002 + + + If a protocol's profile does not permit this additional data to be + returned with a success indication, then the server issues the data + as a server challenge, without an indication of successful + completion. The client then responds with no data. After receiving + this empty response, the server then indicates successful completion + (with no additional data). + +6.3. Multiple authentications + + Unless otherwise stated by the protocol's profile, only one + successful SASL negotiation may occur in a protocol session. In this + case, once an authentication protocol exchange has successfully + completed, further attempts to initiate an authentication protocol + exchange fail. + + In the case that a profile explicitly permits multiple successful + SASL negotiations to occur, then in no case may multiple security + layers be simultaneously in effect. If a security layer is in effect + and a subsequent SASL negotiation selects no security layer, the + original security layer remains in effect. If a security layer is in + effect and a subsequent SASL negotiation selects a second security + layer, then the second security layer replaces the first. + +6.4. Token length limits + + The section "Protocol profile requirements" specifies a requirement + that profiles and implementations be capable of handling + authentication tokens of up to a certain size. Protocol profiles and + implementations MAY permit tokens of a larger size, but mechanisms + cannot depend on implementations permitting larger sizes. + + Protocol profiles MAY specify a smaller length limit in their + optional initial response parameter and/or successful completion + challenge field. If the mechanism supplies a larger token than the + protocol profile permits in these fields, then the token is sent + using the fallback procedures specified in the "Client sends data + first" or "Server returns success with additional data" sections. + + If an implementation knows that all of its supported mechansims + conform to a smaller token size limit, it may use the "behave as if" + rule to implement that smaller token size limit. + +7. Registration procedures + + Registration of a SASL mechanism is done by filling in the template + in section 7.4 and sending it in to iana@iana.org. IANA has the + right to reject obviously bogus registrations, but will perform no + review of claims made in the registration form. + + + +J. Myers [Page 8] + +Internet DRAFT SASL April 6, 2002 + + + There is no naming convention for SASL mechanisms; any name that + conforms to the syntax of a SASL mechanism name can be registered. + An IETF Standards Track document may reserve a portion of the SASL + mechanism namespace for its own use, amending the registration rules + for that portion of the namespace. + + While the registration procedures do not require it, authors of SASL + mechanisms are encouraged to seek community review and comment + whenever that is feasible. Authors may seek community review by + posting a specification of their proposed mechanism as an internet- + draft. SASL mechanisms intended for widespread use should be + standardized through the normal IETF process, when appropriate. + +7.1. Comments on SASL mechanism registrations + + Comments on registered SASL mechanisms should first be sent to the + "owner" of the mechanism. Submitters of comments may, after a + reasonable attempt to contact the owner, request IANA to attach their + comment to the SASL mechanism registration itself. If IANA approves + of this the comment will be made accessible in conjunction with the + SASL mechanism registration itself. + +7.2. Location of registered SASL mechanism list + + SASL mechanism registrations are available at the URL + "http://www.isi.edu/in-notes/iana/assignments/sasl-mechanisms" The + SASL mechanism description and other supporting material may also be + published as an Informational RFC by sending it to + "rfc-editor@rfc-editor.org" (please follow the instructions to RFC + authors [RFC-INSTRUCTIONS]). + +7.3. Change control + + Once a SASL mechanism registration has been published by IANA, the + author may request a change to its definition. The change request + follows the same procedure as the registration request. + + The owner of a SASL mechanism may pass responsibility for the SASL + mechanism to another person or agency by informing IANA; this can be + done without discussion or review. + + The IESG may reassign responsibility for a SASL mechanism. The most + common case of this will be to enable changes to be made to + mechanisms where the author of the registration has died, moved out + of contact or is otherwise unable to make changes that are important + to the community. + + SASL mechanism registrations may not be deleted; mechanisms which are + + + +J. Myers [Page 9] + +Internet DRAFT SASL April 6, 2002 + + + no longer believed appropriate for use can be declared OBSOLETE by a + change to their "intended use" field; such SASL mechanisms will be + clearly marked in the lists published by IANA. + + The IESG is considered to be the owner of all SASL mechanisms which + are on the IETF standards track. + +7.4. Registration template + + + To: iana@isi.edu + Subject: Registration of SASL mechanism X + + SASL mechanism name: + + Security considerations: + + Published specification (optional, recommended): + + Person & email address to contact for further information: + + Intended usage: + + (One of COMMON, LIMITED USE or OBSOLETE) + + Owner/Change controller: + + (Any other information that the author deems interesting may be + added below this line.) + +8. The external mechanism + + The mechanism name associated with external authentication is + "EXTERNAL". + + The client sends an initial response with the UTF-8 encoding of the + authorization identity. + + The server uses information, external to SASL, to determine whether + the client is authorized to authenticate as the authorization + identity. If the client is so authorized, the server indicates + successful completion of the authentication exchange; otherwise the + server indicates failure. + + The system providing this external information may be, for example, + IPsec or TLS. + + If the client sends the empty string as the authorization identity + + + +J. Myers [Page 10] + +Internet DRAFT SASL April 6, 2002 + + + (thus requesting the authorization identity be derived from the + client's authentication credentials), the authorization identity is + to be derived from authentication credentials which exist in the + system which is providing the external authentication. + +8.1 Formal syntax + + The following syntax specification uses the augmented Backus-Naur + Form (BNF) notation as specified in [ABNF]. This uses the ABNF core + rules as specified in Appendix A of the ABNF specification [ABNF]. + + The "initial-response" rule below defines the initial response sent + from client to server. + + initial-response = *UTF8 + UTF8 = %x01-7F / UTF8-2 / UTF8-3 / UTF8-4 + UTF8-loworder = %x80-BF + UTF8-2 = %xC1-DF UTF8-loworder + ; Disallow overlong sequences beginning with 0xC0. + UTF8-3 = (%xE0 %xA0-BF UTF8-loworder) / + (%xE1-EC 2UTF8-loworder) / + (%xED %x80-9F UTF8-loworder) / + (%xEE 2UTF8-loworder) / + (%xEF %x80-BE UTF8-loworder) / + (%xEF %xBF %x80-BD) + ; Disallow overlong sequences beginning with 0xE0, + ; disallow encoded surrogate characters, and + ; disallow U+FFFE, U+FFFF. + UTF8-4 = (%xF0 %x90-BF 2UTF8-loworder) / + (%xF1-F7 3UTF8-loworder) + ; Disallow overlong sequences beginning with 0xF0. + +8.2 Example + + The following is an example of an EXTERNAL authentication in the SMTP + protocol [SMTP-AUTH]. In this example, the client is proxy + authenticating, sending the authorization id "fred". The server has + determined the client's identity through IPsec and has a security + policy that permits that identity to proxy authenticate as any other + identity. + + To the protocol profile, the four octet sequence "fred" is an opaque + binary blob. The SASL protocol profile for SMTP specifies that + server challenges and client responses are encoded in BASE64; the + BASE64 encoding of "fred" is "ZnJlZA==". + + S: 220 smtp.example.com ESMTP server ready + C: EHLO jgm.example.com + + + +J. Myers [Page 11] + +Internet DRAFT SASL April 6, 2002 + + + S: 250-smtp.example.com + S: 250 AUTH DIGEST-MD5 EXTERNAL + C: AUTH EXTERNAL ZnJlZA== + S: 235 Authentication successful. + +9. References + + [ABNF] Crocker, Overell, "Augmented BNF for Syntax Specifications: + ABNF", RFC 2234, November 1997 + + [CHARSET-POLICY] Alvestrand, "IETF Policy on Character Sets and + Languages", RFC 2277, January 1998 + + [GSSAPI] Linn, "Generic Security Service Application Program + Interface, Version 2, Update 1", RFC 2743, January 2000 + + [ISO-10646] "Universal Multiple-Octet Coded Character Set (UCS) - + Architecture and Basic Multilingual Plane", ISO/IEC 10646-1 : 1993. + + [KEYWORDS] Bradner, "Key words for use in RFCs to Indicate + Requirement Levels", RFC 2119, March 1997 + + [RFC-INSTRUCTIONS] Postel, Reynolds, "Instructions to RFC Authors", + RFC 2223, October 1997 + + [SASL-GSSAPI] Myers, "SASL GSSAPI mechanisms", draft-ietf-cat-sasl- + gssapi-XX.txt, September 2000 + + [SASL-OTP] Newman, "The One-Time-Password SASL Mechanism", RFC 2444, + October 1998 + + [SMTP-AUTH] Myers, "SMTP Service Extension for Authentication", RFC + 2554, March 1999 + + [STRINGPREP] [TODO] + + [UNICODE-NORMALIZATION] Davis, Durst, "Unicode Standard Annex #15: + Unicode Normalization Forms", March 2001, + http://www.unicode.org/unicode/reports/tr15/ [TODO -- remove?] + + [UTF-8] Yergeau, "UTF-8, a transformation format of ISO 10646", RFC + 2279, Janyary 1998 + +10. Security considerations + + Security issues are discussed throughout this memo. + + The mechanisms that support integrity protection are designed such + + + +J. Myers [Page 12] + +Internet DRAFT SASL April 6, 2002 + + + that the negotiation of the security layer and authorization identity + is integrity protected. When the client selects a security layer + with at least integrity protection, this protects against an active + attacker hijacking the connection and modifying the authentication + exchange to negotiate a plaintext connection. + + When a server or client supports multiple authentication mechanisms, + each of which has a different security strength, it is possible for + an active attacker to cause a party to use the least secure mechanism + supported. To protect against this sort of attack, a client or + server which supports mechanisms of different strengths should have a + configurable minimum strength that it will use. It is not sufficient + for this minimum strength check to only be on the server, since an + active attacker can change which mechanisms the client sees as being + supported, causing the client to send authentication credentials for + its weakest supported mechanism. + + The client's selection of a SASL mechanism is done in the clear and + may be modified by an active attacker. It is important for any new + SASL mechanisms to be designed such that an active attacker cannot + obtain an authentication with weaker security properties by modifying + the SASL mechanism name and/or the challenges and responses. + + Any protocol interactions prior to authentication are performed in + the clear and may be modified by an active attacker. In the case + where a client selects integrity protection, it is important that any + security-sensitive protocol negotiations be performed after + authentication is complete. Protocols should be designed such that + negotiations performed prior to authentication should be either + ignored or revalidated once authentication is complete. + + The EXTERNAL mechanism provides no security protection; it is + vulnerable to spoofing by either client or server, active attack, and + eavesdropping. It should only be used when external security + mechanisms are present and have sufficient strength. + +11. Author's address + + John G. Myers + Netscape Communications + 501 E. Middlefield Road + Mail Stop SCA 15:201 + Mountain View, CA 94043-4042 + + Email: jgmyers@netscape.com + + + + + + +J. Myers [Page 13] + +Internet DRAFT SASL April 6, 2002 + + +Appendix A. Relation of SASL to transport security + + Questions have been raised about the relationship between SASL and + various services (such as IPsec and TLS) which provide a secured + connection. + + Two of the key features of SASL are: + + + 1. The separation of the authorization identity from the identity in + the client's credentials. This permits agents such as proxy + servers to authenticate using their own credentials, yet request + the access privileges of the identity for which they are proxying. + + 2. Upon successful completion of an authentication exchange, the + server knows the authorization identity the client wishes to use. + This allows servers to move to a "user is authenticated" state in + the protocol. + + These features are extremely important to some application protocols, + yet Transport Security services do not always provide them. To + define SASL mechanisms based on these services would be a very messy + task, as the framing of these services would be redundant with the + framing of SASL and some method of providing these important SASL + features would have to be devised. + + Sometimes it is desired to enable within an existing connection the + use of a security service which does not fit the SASL model. (TLS is + an example of such a service.) This can be done by adding a command, + for example "STARTTLS", to the protocol. Such a command is outside + the scope of SASL, and should be different from the command which + starts a SASL authentication protocol exchange. + + In certain situations, it is reasonable to use SASL underneath one of + these Transport Security services. The transport service would + secure the connection, either service would authenticate the client, + and SASL would negotiate the authorization identity. The SASL + negotiation would be what moves the protocol from "unauthenticated" + to "authenticated" state. The "EXTERNAL" SASL mechanism is + explicitly intended to handle the case where the transport service + secures the connection and authenticates the client and SASL + negotiates the authorization identity. + + When using SASL underneath a sufficiently strong Transport Security + service, a SASL security layer would most likely be redundant. The + client and server would thus probably want to negotiate off the use + of a SASL security layer. + + + + +J. Myers [Page 14] + +Internet DRAFT SASL April 6, 2002 + + +Appendix B. IANA considerations + + The IANA is directed to modify the SASL mechanisms registry as + follows: + + + 1. Change the "Intended usage" of the KERBEROS_V4 and SKEY mechanism + registrations to OBSOLETE. + + 2. Change the "Published specification" of the EXTERNAL mechanism to + this document. + +Appendix C. Changes since RFC 2222 + + The GSSAPI mechanism was removed. It is now specified in a separate + document [SASL-GSSAPI]. + + The "KERBEROS_V4" mechanism defined in RFC 2222 is obsolete and has + been removed. + + The "SKEY" mechanism described in RFC 2222 is obsolete and has been + removed. It has been replaced by the OTP mechanism [SASL-OTP]. + + The overview has been substantially reorganized and clarified. + + Clarified the definition and semantics of the authorization identity. + + Prohibited the NULL character in authorization identities. + + Added a section on character string issues and normalization. + + The word "must" in the first paragraph of the "Protocol profile + requirements" section was changed to "MUST". + + Added a requirement that protocol profiles and implementations be + able to handle tokens of up to 16384 octets. + + Specified that protocol profiles SHOULD provide a way for clients to + discover available SASL mechanisms. + + Made the requirement that protocol profiles specify the semantics of + the authorization identity optional to the protocol profile. + Clarified that such a specification is a refinement of the definition + in the base SASL spec. + + Added a requirement discouraging protocol profiles from breaking the + separation between protocol and mechanism. + + + + +J. Myers [Page 15] + +Internet DRAFT SASL April 6, 2002 + + + Mentioned that standards track documents may carve out their own + portions of the SASL mechanism namespace. + + Specified that the authorization identity in the EXTERNAL mechanism + is encoded in UTF-8. + + Added a statement that a protocol profile SHOULD allow challenge data + to be sent with a success indication. + + Added a security consideration for the EXTERNAL mechansim. + + Clarified sections concerning success with addtional data. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +J. Myers [Page 16] + diff --git a/doc/specification/draft-naffah-cat-sasl-sm2-02.txt b/doc/specification/draft-naffah-cat-sasl-sm2-02.txt new file mode 100644 index 0000000..b2b497a --- /dev/null +++ b/doc/specification/draft-naffah-cat-sasl-sm2-02.txt @@ -0,0 +1,1459 @@ + + +Network R. Naffah +Internet-Draft D. Taylor +Expires: May 2, 2002 Forge Research + November 2001 + + + SM2 -- A Session Management Capable SASL Mechanism + draft-naffah-cat-sasl-sm2-02 + +Status of this Memo + + This document is an Internet-Draft and is in full conformance with + all provisions of Section 10 of RFC2026. + + Internet-Drafts are working documents of the Internet Engineering + Task Force (IETF), its areas, and its working groups. Note that + other groups may also distribute working documents as Internet- + Drafts. + + Internet-Drafts are draft documents valid for a maximum of six months + and may be updated, replaced, or obsoleted by other documents at any + time. It is inappropriate to use Internet-Drafts as reference + material or to cite them other than as "work in progress." + + The list of current Internet-Drafts can be accessed at http:// + www.ietf.org/ietf/1id-abstracts.txt. + + The list of Internet-Draft Shadow Directories can be accessed at + http://www.ietf.org/shadow.html. + + This Internet-Draft will expire on May 2, 2002. + +Copyright Notice + + Copyright (C) The Internet Society (2001). All Rights Reserved. + +Abstract + + This document describes a family of SASL mechanisms capable of re- + using cryptographic parameters (SASL Security Context) negotiated in + a prior exchange. + + + + + + + + + + + +Naffah & Taylor Expires May 2, 2002 [Page 1] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + +Table of Contents + + 1. Mechanism Names . . . . . . . . . . . . . . . . . . . . . . 4 + 2. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 5 + 3. Conventions Used in this Document . . . . . . . . . . . . . 6 + 4. Data Element Formats . . . . . . . . . . . . . . . . . . . . 7 + 4.1 Scalar numbers . . . . . . . . . . . . . . . . . . . . . . . 7 + 4.2 Octet sequences . . . . . . . . . . . . . . . . . . . . . . 7 + 4.3 Extended octet sequences . . . . . . . . . . . . . . . . . . 7 + 4.4 Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 + 4.5 Buffers . . . . . . . . . . . . . . . . . . . . . . . . . . 8 + 4.6 Data element size limits . . . . . . . . . . . . . . . . . . 8 + 4.7 Special octets . . . . . . . . . . . . . . . . . . . . . . . 8 + 4.8 Unsigned Integers (UINT) . . . . . . . . . . . . . . . . . . 9 + 5. Protocol Description . . . . . . . . . . . . . . . . . . . . 10 + 5.1 Establishment of a new session . . . . . . . . . . . . . . . 10 + 5.2 Re-use of an existing session . . . . . . . . . . . . . . . 11 + 6. Example . . . . . . . . . . . . . . . . . . . . . . . . . . 13 + 6.1 Example of establishing a new SM2 session . . . . . . . . . 13 + 6.2 Example of an SM2 session re-use . . . . . . . . . . . . . . 15 + 7. Discussion . . . . . . . . . . . . . . . . . . . . . . . . . 16 + 7.1 Extending the Java SASL API . . . . . . . . . . . . . . . . 16 + 7.2 Beyond Java . . . . . . . . . . . . . . . . . . . . . . . . 16 + 7.3 Cache management . . . . . . . . . . . . . . . . . . . . . . 16 + 7.4 DIGEST-MD5 as an underlying mechanism for SM2 . . . . . . . 17 + 8. Security Considerations . . . . . . . . . . . . . . . . . . 18 + 8.1 Caching cryptographic parameters . . . . . . . . . . . . . . 18 + 8.2 Flexibility to use new authentication mechanisms . . . . . . 18 + 8.3 When to invalidate a session . . . . . . . . . . . . . . . . 18 + 8.4 Updating the SASL Security Context from the Evidence . . . . 18 + 9. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . 20 + References . . . . . . . . . . . . . . . . . . . . . . . . . 21 + Authors' Addresses . . . . . . . . . . . . . . . . . . . . . 22 + A. Proposed extension to the Java SASL API . . . . . . . . . . 23 + A.1 public interface SaslClientExt . . . . . . . . . . . . . . . 23 + A.1.1 getSaslSecurityContext . . . . . . . . . . . . . . . . . . . 23 + A.1.2 setSaslSecurityContext . . . . . . . . . . . . . . . . . . . 23 + A.1.3 evaluateEvidence . . . . . . . . . . . . . . . . . . . . . . 24 + A.2 public interface SaslServerExt . . . . . . . . . . . . . . . 24 + A.2.1 getSaslSecurityContext . . . . . . . . . . . . . . . . . . . 24 + A.2.2 setSaslSecurityContext . . . . . . . . . . . . . . . . . . . 25 + A.2.3 evaluateEvidence . . . . . . . . . . . . . . . . . . . . . . 25 + B. Changes since last draft . . . . . . . . . . . . . . . . . . 26 + Full Copyright Statement . . . . . . . . . . . . . . . . . . 27 + + + + + + + +Naffah & Taylor Expires May 2, 2002 [Page 2] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + +1. Mechanism Names + + The family of SASL [RFC-2222] mechanisms associated with the protocol + described in this document are named "SM2-" + where is the canonical name of a SASL Mechanism + other than SM2. For example, "SM2-SRP" shall denote the SASL + mechanism using the protocol described in this document with "SRP" as + its underlying SASL mechanism. + + Note that a server advertising one or more SM2 mechanisms, does not + preclude it from also advertising its support for the underlying + mechanisms used in conjunction with SM2. This ensures + interoperability with clients that only support the underlying + mechanisms but do not yet support that mechanism under SM2. In other + words, an SM2 mechanism constructed over an existing mechanism, say + "SM2-SRP", is not a replacement for "SRP". As such a server wanting, + or able, to provide both mechanisms SHOULD advertise them both. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Naffah & Taylor Expires May 2, 2002 [Page 3] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + +2. Introduction + + SM2 is a caching mechanism. It relies on another SASL mechanism, + referred to as the underlying mechanism, to perform authentication, + and provide security services. The underlying mechanism MUST NOT be + SM2. + + Some SASL mechanisms, such as those based on the SRP protocol [SASL- + SRP] and the Digest authentication [RFC-2831], provide authentication + and the negotiation of a shared session key. The operations involved + in the establishement of connections relying on such mechanisms is + time-consuming, especially when involving computations of + cryptographic primitives and/or shared cryptographic keys. It is + desireable to allow both the client and the server, to be able to re- + use those cryptographic elements, once negotiated in an initial + exchange, without compromising the security of the communication. + + If two entities are using SM2 with the same underlying mechanism, + they can bypass the authentication phase, on their second and + subsequent connections, by re-using the security layer parameters + negotiated during their initial exchange. + + A SASL mechanism is described in terms of its (a) authentication + layer, and optionally its (b) security layer [RFC-2222]. It is worth + noting straight away, that SM2 implies, but does not mandate, that + the underlying SASL mechanism provides meaningful security services. + In other words, the authors do not see any justification for a + session-management based protocol constructed over an underlying + mechanism that does not provide a non-trivial security layer. + + + + + + + + + + + + + + + + + + + + + + +Naffah & Taylor Expires May 2, 2002 [Page 4] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + +3. Conventions Used in this Document + + 1. A hex digit is an element of the set: + + {0, 1, 2, 3, 4, 5, 6, 7, 8 , 9, A, B, C, D, E, F} + + A hex digit is the representation of a 4-bit string. Examples: + + 7 = 0111 + + A = 1010 + + 2. An octet is an 8-bit string. In this document an octet may be + written as a pair of hex digits. Examples: + + 7A = 01111010 + + 02 = 00000010 + + Depending on the context, one octet may be represented as + described above preceded by "0x", for example 0x15 shall + represent the 8-bit sequence 00010101. + + 3. All data is encoded and sent in network byte order (big-endian). + + 4. The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL + NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + [RFC-2119]. + + + + + + + + + + + + + + + + + + + + + + +Naffah & Taylor Expires May 2, 2002 [Page 5] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + +4. Data Element Formats + + This section describes the encoding of the data elements used by the + SASL mechanisms described in this document. + +4.1 Scalar numbers + + Scalar numbers are unsigned quantities. Using b[i] to refer to the + i-th octet being processed, the value of a two-octet scalar is: + + ((b[0] << 8) + b[1]), + + where << is the bit left-shift operator. The value of a four-octet + scalar is: + + ((b[0] << 24) + (b[1] << 16) + (b[2] << 8) + b[3]). + + +4.2 Octet sequences + + These mechanisms generate, use and exchange sequences of octets. + When such entities travel on the wire, they shall be preceded by a + one-octet scalar quantity representing the count of following octets. + + We shall use the syntax os(s) to denote the encoded form of the octet + sequence. + +4.3 Extended octet sequences + + Extended sequences of octets are exchanged when using the security + layer. When these sequences travel on the wire, they shall be + preceded by a four-octet scalar quantity representing the count of + following octets. + + We shall use the syntax eos(s) to denote the encoded form of the + extended octet sequence. + +4.4 Text + + The only character set for text is the UTF-8 encoding [RFC-2279] of + Unicode characters [ISO-10646]. All text MUST be in Unicode + Normalization Form KC [UNICODE-KC] without NUL characters. + + We shall use the syntax utf8(L) to denote the string L in UTF-8 + encoding, preceded by a two-octet scalar quantity representing the + count of following octets. + + + + + +Naffah & Taylor Expires May 2, 2002 [Page 6] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + +4.5 Buffers + + In these SASL mechanisms data is exchanged between the client and + server using buffers. A buffer acts as an envelope for the sequence + of data elements sent by one end-point of the exchange, and expected + by the other. + + A buffer MAY NOT contain other buffers. It may only contain zero, + one or more data elements. + + A buffer shall be encoded as two fields: a four-octet scalar quantity + representing the count of following octets, and the concatenation of + the octets of the data element(s) contained in the buffer. + + We shall use the syntax {A|B|C} to denote a buffer containing A, B + and C in that order. For example: + + { 0x00 | utf8(umn) | eos(umir) } + + is a buffer containing, in the designated order, a 1-octet scalar + quantity, and the encoded forms of a Text (umn) and an Extended Octet + Sequence (umir). + +4.6 Data element size limits + + The following table details the size limit, in number of octets, for + each of the SASL data element encodings described earlier. + + Data element type Header Size limit in octets + (octets) (excluding header) + ------------------------------------------------------------ + Octet Sequence 1 255 + Text 2 65,535 + Extended Octet Sequence 4 2,147,483,383 + Buffer 4 2,147,483,643 + + An implementation MUST signal an exception if any size constraint is + violated. + +4.7 Special octets + + In this mechanism certain octet values have special significance. + These Octets, and the name that they will be referred to, are listed + below: + + The ASCII code point 0x00. It signals the start of an + "establishment of a new session" exchange. + + + + +Naffah & Taylor Expires May 2, 2002 [Page 7] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + + The ASCII code point 0x01. It signals the start of a "re-use + session" exchange. + + The ASCII code point 0x06. It signals the server's acceptance + of a client's request to re-use an existing session; and finally + + The ASCII code point 0x15. It signals the server's rejection + of a client's request to re-use an existing session. + + When such entities travel on the wire, they shall be encoded as 1- + octet Scalar numbers. + +4.8 Unsigned Integers (UINT) + + This mechanism uses unsigned integer values ranging from zero to + 4,294,967,296. + + When such entities travel on the wire, they shall be encoded as 4- + octet Scalar numbers. We shall use the syntax uint(n) to denote the + encoding of an Unsinged Integer n. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Naffah & Taylor Expires May 2, 2002 [Page 8] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + +5. Protocol Description + + The next sections describe the messages exchanged between the SM2 + client and server, and their interaction with their peers in the + underlying mechanism. + +5.1 Establishment of a new session + + The establishment of a new SM2 session delegates to the underlying + mechanism the authentication function. Any parameters required by + the underlying mechanism, MUST be passed into the SM2 mechanism when + it is itself initialised. + + In an SM2 exchange, the client always initiates the exchange. + + The first SASL buffer sent by an SM2 client contains the Special + Octet indicating the initiation of the exchange, followed by + the initial response, which might be 0-octet long, of the client's + underlying mechanism. + + From this point on, the SM2 mechanism passes the challenges and + responses to the underlying mechanism, and passes back the responses + and challenges from the underlying mechanism to the peers. + + When the underlying mechanism exchange has concluded, the SM2 server + sends (a) a session identifier and (b) a Time-To-Live (TTL) + indication to the SM2 client. The session identifier will be used by + the SM2 client if/when it will later re-use this session, while the + TTL indicates to the SM2 client, how long, in seconds, the SM2 server + will attempt to keep valid this session's parameters for later re-use + by the SM2 client. A TTL indicator value of zero means that the + session is valid forever. + + The following diagram shows the data exchanged in this process: + + + + + + + + + + + + + + + + + +Naffah & Taylor Expires May 2, 2002 [Page 9] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + + Figure 1: Establishment of a new session. + + Underlying Underlying + SM2 Mechanism Mechanism SM2 + Client Client Server Server + | | | | + + -- { | eos(umir) } -------------------------------> + + <------------------ challenge -- + -- response -------------------> + ... + + <--------------------------- { utf8(sid) | uint(ttl) } -- + + where: + + umir the underlying mechanism initial response, if it has one, + + sid the session identifier as set by the server. + + ttl the session Time-To-Live indication in seconds. + + +5.2 Re-use of an existing session + + If two entities have already been through the authentication phase, + and have both cached the security layer parameters, a shorter + exchange may take place to re-use those parameters. + + In the exchange below, the Evidence fields (Ec for the client, and Es + for the server) are octet strings, possibly 0-octet long, that + represent mechanism-specific data. An Evidence may be injected into + the underlying mechanism peer's security layer context, to allow + computation of a different shared secret for each re-use of the + session. + + How a new shared secret is computed from a previously known value and + an Evidence is an underlying mechanism specific issue. + + The mechanism data exchange for successfully re-using a session is + shown below: + + + + + + + + + +Naffah & Taylor Expires May 2, 2002 [Page 10] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + + Figure 2: Successful re-use of an existing session. + + Underlying Underlying + SM2 Mechanism Mechanism SM2 + Client Client Server Server + | | | | + + -- { | utf8(sid) | os(Ec) } ----------------------> + + <---------------------------------- { | os(Es) } -- + + where: + + Ec the client evidence, + + Es the server evidence. + + If the server accepts the request for re-using a session, it responds + with the Special Octet and its version of the Evidence (Es). + + On the other hand, if the server rejects the request for re-using a + session (including the case where an unknown session identifier has + been submitted), it responds with the Special Octet only. In + this case, the SM2 client MUST attempt to establish a new session + with the peer, and if this fails it MUST report an authentication + failure. + + This retry facility MUST only be attempted once if re-using a session + fails. + + The data exchange when failing to re-use a session is shown below: + + Figure 3: Failure re-using an existing session. + + + Underlying Underlying + SM2 Mechanism Mechanism SM2 + Client Client Server Server + | | | | + + -- { | utf8(sid) | os(Ec) } ----------------------> + + <------------------------------------------- { } -- + + + + + + + + +Naffah & Taylor Expires May 2, 2002 [Page 11] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + +6. Example + + The following sections show two examples: one for an establishment of + a new SM2 session, and the second one is for a successful re-use of + the session already established. The underlying mechanism used with + SM2 in both examples is an implementation of the SRP mechanism. + Lines starting with "C" denote messages sent from the client side, + while those stating with "S" are from the server side. + +6.1 Example of establishing a new SM2 session + + C1: 0000000F00000000 0A00000006000474 657374 + + S1: 000001C00100AC6B DB41324A9A9BF166 DE5E1389582FAF72 B6651987EE07FC31 + 92943DB56050A373 29CBB4A099ED8193 E0757767A13DD523 12AB4B03310DCD7F + 48A9DA04FD50E808 3969EDB767B0CF60 95179A163AB3661A 05FBD5FAAAE82918 + A9962F0B93B855F9 7993EC975EEAA80D 740ADBF4FF747359 D041D5C33EA71D28 + 1E446B14773BCA97 B43A23FB801676BD 207A436C6481F1D2 B9078717461A5B9D + 32E688F877485445 23B524B0D57D5EA7 7A2775D2ECFA032C FBDBF52FB3786160 + 279004E57AE6AF87 4E7303CE53299CCC 041C7BC308D82A56 98F3A8D0C38271AE + 35F8E9DBFBB694B5 C803D89F7AE435DE 236D525F54759B65 E372FCD68EF20FA7 + 111F9E4AFF730001 020A251CA1230431 ABA188CE00AE6D61 6E6461746F72793D + 7265706C61792064 6574656374696F6E 2C7265706C617920 646574656374696F + 6E2C696E74656772 6974793D686D6163 2D736861312C696E 746567726974793D + 686D61632D6D6435 2C636F6E66696465 6E7469616C697479 3D6165732C636F6E + 666964656E746961 6C6974793D636173 74352C636F6E6669 64656E7469616C69 + 74793D626C6F7766 6973682C6D617862 756666657273697A 653D323134373438 + 33363433 + + C2: 0000015F0100407D 3913C5AAABB611C5 42328A208021C934 53D2FA3F1E3F253B + 3F46A800A8D973EF 893941AFF6E31590 D8FF8B2A3B702979 B961E0EE1F0E6FC4 + 9B0B133587B27982 C2B66EBBEB9B5F1B 8D33E62FC81393F4 88D2463CAFE0AC74 + 4985117CDA14685A F90F0A0A42751F5D B1C2C24F6D54422D D135864E2F5A346F + 6C94836F788FDE45 01D5F30228CBB066 832D1A9E010D94B7 F8D2DC8220F7B950 + 87EA7835AD7CFB52 3D6FE2BAF68DE885 57F29BBACFB1C47F 0025A589AC0603FD + 33BE3FA53B8AE1E9 D77D241EA1458016 B9F57FD7BBA87F9F 80DE53012564A719 + 7ABC0E028C4055BD 825DFEB253A31F48 C7393A9E872140BF 8CE479DD0D975492 + 6E5F0C5DB0860004 7465737400557265 706C617920646574 656374696F6E2C69 + 6E74656772697479 3D686D61632D6D64 352C636F6E666964 656E7469616C6974 + 793D626C6F776669 73682C6D61786275 6666657273697A65 3D32313437343833 + 363433 + + S2: 000001020100A2AC B28D526F4601C90E DDF740243881C345 7B781D1D325DC95F + 0CC8B728062D93AE 10693F97A89DB370 3612F89E130251A7 84C87AF5F016A76B + BAECC1EFC0DA24F2 5C2FAC77CC5A33C4 5562AAF74DB99237 12BF29F5D9B6D15D + 94CE4680B04653C2 663B66F237E3567C 7DED5D4728536E96 3AC8DEC185D508AA + 9F6C993CABE7A037 25BC9B002B72EED7 954F7018194810F2 FFB04F6E239BA11D + AC3179431CBB310D D1A87F5A9BB56C0F 80E90237A17E9982 A8EFD122228F684F + + + +Naffah & Taylor Expires May 2, 2002 [Page 12] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + + 310170A3800F8FC4 DCD94889CE8B6AD7 6CDF0D69DF33A288 98B34AB5EA9575BA + 4070CF3FE7D339A6 BC0B2D395395EACD A5B041B68104B683 B40B9B167B646095 + 4DE567D04338 + + C3: 00000015140020A0 94A727918CC8DC26 92A87C9435D53C7F 70 + + S3: 000000180012534D 322D5349442D3030 3030303030303031 00000000 + + The following is a detailed description of each step: + + C1: An SM2 Client initiates an establishment of a new session + exchange. The SASL buffer contains the Octet, followed by + the SRP client's initial response encoded as an Extended Octet + Sequence. The SRP client's initial response in this example is + the Text 'test' representing U --the username. + + S1: The SM2 server engages in an "establishment of a new session" + exchange. It decodes the SRP client's initial response and passes + it to its underlying SRP server object. The SRP server evaluates + the initial response and sends back a SASL buffer containing: + + 1. The MPI encoding of the public shared modulus N which in this + example is 256-octet long. + + 2. The MPI encoding of the field generator g which in this + example is 1-octet long (value 0x02), + + 3. The Octet Sequence encoding of the user's salt which in this + example is 10-octet long, and finally + + 4. The 174-octet long Text containing the SRP server's available + options. In this example, this list consists of the string + (white spaces added for clarity): mandatory = replay + detection, replay detection, integrity = hmac-sha1, integrity + = hmac-md5, confidentiality = aes, confidentiality = cast5, + confidentiality = blowfish, maxbuffersize = 2147483643. + + C2: The SRP client responds to the SRP server challenge by returning + a SASL buffer containing: + + 1. The 256-octet long MPI A representing the SRP client's + ephemeral public key, + + 2. The 4-octet long Text 'test' representing the authorization ID + for this exchange, and finally + + 3. The 85-octet long Text containing the client's chosen options + list, which in this example is (white spaces added for + + + +Naffah & Taylor Expires May 2, 2002 [Page 13] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + + clarity): replay detection, integrity = hmac-md5, + confidentiality = blowfish, maxbuffersize = 2147483643". + + S2: The SRP server, issues a new challenge containing the 256-octet + long MPI B representing the SRP server's ephemeral publick key. + + C3: The SRP client evaluates the server's challenge and responds with + the 20-octet Octet Sequence representing its Evidence: M1. + + S3: The SM2 server terminates the exchange by sending to the SM2 + client the session ID generated for this session, followed by the + TTL indicator. In this example the session ID is the Text "SM2- + SID-0000000001," while the TTL indicator is zero. + + +6.2 Example of an SM2 session re-use + + C1: 0000001A01001253 4D322D5349442D30 3030303030303030 310465261450 + + S1: 0000000606046526 1450 + + The following is a detailed description of each step: + + C1: An SM2 Client initiates a session re-use exchange. The SASL + buffer contains: + + 1. The Special Octet, + + 2. The session ID encoded as a Text. The value of this ID in the + example is "SM2-SID-0000000001," and finally + + 3. The Evidence of the underlying SRP client in use with the + session in question. In this example this evidence is 4-octet + long. + + S1: The SM2 server accepts the request to re-use the identified + session and sends back the Special Octet followed by its + version of the Evidence (which in this example is 4-octet long). + + + + + + + + + + + + + +Naffah & Taylor Expires May 2, 2002 [Page 14] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + +7. Discussion + +7.1 Extending the Java SASL API + + The recently approved Java SASL API [JSR-28] contains a new property, + javax.security.sasl.Sasl.REUSE, to serve as a hint when instantiating + client and servers, for re-using previously authenticated session + information. + + Appendix A contains a proposed set of interfaces that can be used by + Java Security API Providers to offer modular implementations of SM2- + capable SASL mechanisms. + + The two new interfaces in question, SaslClientExt and SaslServerExt + extend SaslClient and SaslServer (from the javax.security.sasl + package) respectively, and include appropriate methods to handle the + SM2 protocole. + +7.2 Beyond Java + + The authors intend this mechanism to be useful for implementations of + SASL in languages other than Java. However, such implementations + MUST have the following capabilities to allow this mechanism to work: + + 1. A mechanism can create another mechanism. + + 2. The SASL Security Context, containing the crpytographic + parameters of a mechanism may be extracted in a form that can be + stored in a cache. + + 3. A mechanism (or a security layer) can be [re-]initialised from a + SASL Security Context containing cryptographic parameters stored + in a cache. + + +7.3 Cache management + + After a new session is successfully established, the SM2 server sends + a session identifier to the client (see Figure 2). It is the + responsibility of the client to ensure that it will be able to re-use + this value in the future. In other words, the SM2 client should have + access to a mapping function that looks up a session identifier to + re-use, from data included in a request to instantiate a new + underlying mechanism client. If such a session is found, then the + SM2 client would only need to 'recreate' the underlying client with + the SASL Security Context of that session. + + + + + +Naffah & Taylor Expires May 2, 2002 [Page 15] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + +7.4 DIGEST-MD5 as an underlying mechanism for SM2 + + The proposed SASL mechanism DIGEST-MD5 describes a mechanism for re- + use of some data negotiated in a previous exchange (section 2.2 + "Subsequent Authentication" in [RFC-2831]). More specifically: + + "If the client has previously authenticated to the server, and + remembers the values of username, realm, nonce, nonce-count, + cnonce, and qop that it used in that authentication, and the SASL + profile for a protocol permits an initial client response, then it + MAY perform "subsequent authentication", as defined in this + section." + + Such a mechanism can be used as an underlying mechanism for SM2. The + following notes clarify the previous statement: + + 1. An "Initial Authentication" (section 2.1 of [RFC-2831]) is the + exchange used in an SM2 establishment of a new session. + + 2. The SASL Security Context parameters for a DIGEST-MD5 + implementation SHOULD include: username, realm, nonce, nonce- + count, cnonce, and qop (described in section 2.1.2 of [RFC-2831]. + + 3. The client's Evidence Ec in an SM2 session re-use exchange, is a + full DIGEST-MD5 "digest-response" as described in section 2.2.1 + of [RFC-2831]. + + 4. If the DIGEST-MD5 client's mechanism "digest-response" is valid, + and the the DIGEST-MD5 server chose to deem that authentication + has succeeded, the SM2 server can successfully conclude a session + re-use exchnage. + + 5. If the DIGEST-MD5 client's mechanism "digest-response" is + invalid, or if it is valid but the DIGEST-MD5 server decides to + refresh the authentication parameters by sending a new "digest- + challenge", then an SM2 failed session re-use message should be + sent back to the SM2 client. + + + + + + + + + + + + + + +Naffah & Taylor Expires May 2, 2002 [Page 16] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + +8. Security Considerations + +8.1 Caching cryptographic parameters + + SM2 relies on the ability to extract and cache the cryptographic + parameters from an underlying mechanism --the SASL Security Context-- + , and to initialise an instance of the underlying mechanism client + and/or server with that cached context. One might argue against this + practice for security reasons. Yet, most cryptographic software + modules have their parameters somewhere in the program memory, so SM2 + is as safe as those modules. + + In addition, if a salt is used (the Evidence or part of it), the + actual values used for each exchange will be different. This is a + similar concept to caching TLS [RFC-2246] sessions and hence SM2, + coupled with a strong underlying mechanism, should be no less secure. + +8.2 Flexibility to use new authentication mechanisms + + By using a second authentication mechanism to do the actual + authentication function, SM2 can always be configured to use the + latest, proven, authentication techniques for which a SASL mechanism + has been specified and implemented. + +8.3 When to invalidate a session + + The server MUST discard the existing session information when an + attempt to re-use the session fails. The server MUST cache the SASL + Security Context for a session only when a new one is established and + after the authentication function is successfully completed. + + Bound by the above rule, an SM2 server is thus susceptible to a + denial-of-service like attack. Indeed, an attacker may repeatedly + attempt to re-use sessions, thus causing the server to invalidate + those sessions soon after they were established. + + But this would be no different to the attacker carrying out her + attack on the underlying mechanism server if/when SM2 is not used. + The result of such an attack would be that the full underlying + authentication procedure would take place. + +8.4 Updating the SASL Security Context from the Evidence + + The SM2 mechanism will use the security layer provided by its + underlying mechanism. + + The cryptographic parameters of this security layer, contained in a + SASL Security Context, are cached when the authentication phase is + + + +Naffah & Taylor Expires May 2, 2002 [Page 17] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + + complete. These parameters may be varied on a per-connection basis + by means of the optional Evidence parameter passed in during the + session re-use exchange (see Figure 3). + + What if that Evidence is not enough to update the cryptographic + parameters to an acceptable security level; e.g. a weak key is + obtained? Two alternatives are possible: + + 1. An implementation may contain a recovery mechanism that would + allow it to continue the algorithm until a valid and acceptable + value is obtained, or + + 2. An implementation may cause an error condition that would be + intercepted by the SM2 peer. If it was the client, then a new + session would be negotiated, otherwise if it is the server, then + a failed re-use of a session reply would be returned (see Figure + 4). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Naffah & Taylor Expires May 2, 2002 [Page 18] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + +9. Acknowledgments + + The following people provided valuable feedback in the preparation of + this document + + Keith Burdis + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Naffah & Taylor Expires May 2, 2002 [Page 19] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + +References + + [ISO-10646] "International Standard --Information technology-- + Universal Multiple-Octet Coded Character Set (UCS) -- + Part 1 Architecture and Basic Multilingual Plane. UTF-8 + is described in Annex R, adopted but not yet published. + UTF-16 is described in Annex Q, adopted but not yet + published.", ISO/IEC 10646-1, 1993. + + [JSR-28] Weltman, R., "Java SASL Specification (Proposed Final + Draft 2)", March 2002, . + + [RFC-2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 0014, RFC 2119, March 1997, + . + + [RFC-2222] Myers, J., "Simple Authentication and Security Layer + (SASL)", RFC 2222, October 1997, . + + [RFC-2246] Dierks, T. and C. Allen, "The TLS Protocol Version + 1.0", RFC 2246, January 1999, . + + [RFC-2279] Yergeau, F., "UTF-8, a transformation format of Unicode + and ISO 10646", RFC 2279, January 1998, . + + [RFC-2629] Rose, M., "Writing I-Ds and RFCs using XML", RFC 2629, + June 1999, . + + [RFC-2831] Leach, P. and C. Newman, "Using Digest Authentication + as a SASL Mechanism", RFC 2831, May 2000, . + + [SASL-SRP] Burdis, K. and R. Naffah, "Secure Remote Password SASL + Mechanism", November 2001, . + + [UNICODE-KC] Durst, D., "Unicode Standard Annex #15: Unicode + Normalization Forms.", March 2001, . + + + + + + + + +Naffah & Taylor Expires May 2, 2002 [Page 20] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + +Authors' Addresses + + Raif S. Naffah + Forge Research Pty. Limited + Suite 116, Bay 9 + Locomotive Workshop, + Australian Technology Park + Cornwallis Street + Eveleigh, NSW 1430 + AU + + EMail: raif@forge.com.au + + + David Taylor + Forge Research Pty. Limited + Suite 116, Bay 9 + Locomotive Workshop, + Australian Technology Park + Cornwallis Street + Eveleigh, NSW 1430 + AU + + EMail: dtaylor@forge.com.au + + + + + + + + + + + + + + + + + + + + + + + + + + + +Naffah & Taylor Expires May 2, 2002 [Page 21] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + +Appendix A. Proposed extension to the Java SASL API + + In the next sections, the type AlgorithmParamterSpec is imported from + the java.security.spec package. + +A.1 public interface SaslClientExt + + An interface that extends the SaslClient interface. + + An object implementing this interface can negotiate authentication + using one of the IANA-registered mechanisms, and be used as a client- + side underlying mechanism for the SM2 mechanism. + +A.1.1 getSaslSecurityContext + + AlgorithmParameterSpec + getSaslSecurityContext() + throws SaslException; + + Retrieves an object that encapsulates the SASL Security Context + parameters for future re-use. This method can be called only after + the authentication exchange has completed (i.e., when isComplete() + returns true); otherwise, a SaslException is thrown. + +A.1.2 setSaslSecurityContext + + void + setSaslSecurityContext(AlgorithmParameterSpec ctx) + throws SaslException; + + Replaces the current SASL Security Context parameters of an object + with those encapsulated in the designated argument. + + Parameter is: + + ctx + The designated instance of the object encapsulating the new values + of SASL Security Context parameters to use after successful + completion of this method. + + + + + + + + + + + + +Naffah & Taylor Expires May 2, 2002 [Page 22] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + +A.1.3 evaluateEvidence + + byte[] + evaluateEvidence(byte[] peerEvidence) + throws SaslException; + + Computes new values for all or some of the SASL Security Context + parameters and returns an Evidence that will be sent to the peer. + + The rationale for this method is to (a) allow the peers to 're-cycle' + their cryptographic paramemeters so each re-use of the exchange would + be based on different values every time; and (b) allow the peers to + check, in the absence of a full authentication exchange, that the + peer really knows more than just the session ID. + + This method throws a SaslException if during the process of updating + the SASL Security Context parameters, or while generating the + Evidence, it encounters an exception. + + Parameter is: + + peerEvidence + The peer's Evidence as received in a session re-use exchange. + + +A.2 public interface SaslServerExt + + An interface that extends the SaslServer interface. + + An object implementing this interface can negotiate authentication + using one of the IANA-registered mechanisms, and be used as a server- + side underlying mechanism for the SM2 mechanism. + +A.2.1 getSaslSecurityContext + + AlgorithmParameterSpec + getSaslSecurityContext() + throws SaslException; + + Retrieves an object that encapsulates the SASL Security Context + parameters for future re-use. This method can be called only after + the authentication exchange has completed (i.e., when isComplete() + returns true); otherwise, a SaslException is thrown. + + + + + + + + +Naffah & Taylor Expires May 2, 2002 [Page 23] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + + + +A.2.2 setSaslSecurityContext + + void + setSaslSecurityContext(AlgorithmParameterSpec ctx) + throws SaslException; + + Replaces the current SASL Security Context parameters of an object + with those encapsulated in the designated argument. + + Parameter is: + + ctx + The designated instance of the object encapsulating the new values + of SASL Security Context parameters to use after successful + completion of this method. + + +A.2.3 evaluateEvidence + + byte[] + evaluateEvidence(byte[] peerEvidence) + throws SaslException; + + Computes new values for all or some of the SASL Security Context + parameters and returns an Evidence that will be sent to the peer. + + The rationale for this method is to (a) allow the peers to 're-cycle' + their cryptographic paramemeters so each re-use of the exchange would + be based on different values every time; and (b) allow the peers to + check, in the absence of a full authentication exchange, that the + peer really knows more than just the session ID. + + This method throws a SaslException if during the process of updating + the SASL Security Context parameters, or while generating the + Evidence, it encounters an exception. + + Parameter is: + + peerEvidence + The peer's Evidence as received in a session re-use exchange. + + + + + + + + + + + +Naffah & Taylor Expires May 2, 2002 [Page 24] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + +Appendix B. Changes since last draft + + Added the restriction that all text should be in Unicode + Normalization form KC with NULs prohibited. + + Re-worded the section on the Java SASL API. + + Updated the References. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Naffah & Taylor Expires May 2, 2002 [Page 25] + +Internet-Draft The SM2 SASL Mechanism November 2001 + + +Full Copyright Statement + + Copyright (C) The Internet Society (2001). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + +Naffah & Taylor Expires May 2, 2002 [Page 26] + + diff --git a/doc/specification/draft-nerenberg-sasl-crammd5-01.txt b/doc/specification/draft-nerenberg-sasl-crammd5-01.txt new file mode 100644 index 0000000..238e86d --- /dev/null +++ b/doc/specification/draft-nerenberg-sasl-crammd5-01.txt @@ -0,0 +1,371 @@ + + +Network Working Group J. Klensin +Internet Draft: The CRAM-MD5 SASL Mechanism P. Krumviede +Document: draft-nerenberg-sasl-crammd5-01.txt R. Catoe + L. Nerenberg (Ed.) + January 2002 + + + + The CRAM-MD5 SASL Mechanism + + +Status of this memo + + This document is an Internet Draft and is in full conformance with + all provisions of Section 10 of RFC 2026. + + Internet Drafts are working documents of the Internet Engineering + Task Force (IETF), its areas, and its working groups. Note that + other groups may also distribute working documents as Internet + Drafts. + + Internet Drafts are draft documents valid for a maximum of six + months and may be updated, replaced, or obsoleted by other + documents at any time. It is inappropriate to use Internet Drafts + as reference material or to cite them other than as "work in + progress." + + The list of current Internet Drafts can be accessed at + http://www.ietf.org/ietf/1id-abstracts.txt + + The list of Internet Draft Shadow Directories can be accessed at + http://www.ietf.org/shadow.html. + + A revised version of this draft document will be submitted to the + RFC editor as a Proposed Standard for the Internet Community. + Discussion and suggestions for improvement are requested. + Distribution of this draft is unlimited. + +1. How to Read This Document + + The key words "MUST", "MUST NOT", "REQUIRED", "SHOULD", "SHOULD + NOT", "RECOMMENDED" and "MAY" in this document are to be inter- + preted as defined in [KEYWORDS]. + +2. Introduction + + This document defines a simple challenge-response [SASL] authenti- + cation mechanism, using a [KEYED-MD5] digest. + +3. CRAM-MD5 Authentication Mechanism + + The mechanism name associated with CRAM-MD5 is 'CRAM-MD5'. + + This mechanism does not provide a security layer. + + + +Klensin, et al draft-nerenberg-sasl-crammd5-01.txt [Page 1] + +Internet Draft CRAM-MD5 SASL Mechanism January 2002 + + + The data encoded in the challenge contains a presumptively arbi- + trary string of random digits, a timestamp, and the fully-qualified + primary host name of the server. + + The client makes note of the data and then responds with a string + consisting of the user name, a space, and a "digest." The latter + is computed by applying the keyed MD5 algorithm from [KEYED-MD5] + where the key is a shared secret and the digested text is the chal- + lenge (including angle-brackets). The client MUST NOT interpret or + attempt to validate the contents of the challenge in any way. + + This shared secret is a string known only to the client and server. + The "digest" parameter itself is a 16-octet value which is sent in + hexadecimal format, using lower-case US-ASCII characters. + + When the server receives this client response, it verifies the + digest provided. Since the user name may contain the space charac- + ter, the server MUST scan the client response from right to left; + the first space character encountered separates the digest from the + user name. If the digest is correct, the server should consider + the client authenticated and respond appropriately. + + The user name and shared secret MUST be represented in the Unicode + character set [UNICODE], and MUST be normalised using the Unicode + Normalisation Form KC [NFKC]. The resulting values MUST be encoded + as UTF-8 [UTF8]. + + +3.1. Formal Syntax + + The following syntax specification uses the augmented Backus-Naur + Form (ABNF) as specified in [ABNF], and incorporates by reference + the Core Rules defined in that document. + + challenge = "<" 1*DIGIT "." 1*DIGIT "@" hostname ">" + + digest = 32(DIGIT / %x61-66) + ; A hexadecimal string using only lower-case + ; letters + + hostname = 1*(ALPHA / DIGIT) *("." / "-" / ALPHA / DIGIT) + + response = user SP digest + + user = 1*OCTET + + +3.2. Examples + + These examples show the use of the CRAM-MD5 mechanism with the + IMAP4 AUTHENTICATE command [IMAP4]. The base64 encoding of the + challenges and responses is part of the IMAP4 AUTHENTICATE command, + not part of the CRAM-MD5 specification itself. + + + + +Klensin, et al draft-nerenberg-sasl-crammd5-01.txt [Page 2] + +Internet Draft CRAM-MD5 SASL Mechanism January 2002 + + + S: * OK IMAP4rev1 Server + C: A0001 AUTHENTICATE CRAM-MD5 + S: + PDE4OTYuNjk3MTcwOTUyQHBvc3RvZmZpY2UucmVzdG9uLm1jaS5uZXQ+ + C: dGltIGI5MTNhNjAyYzdlZGE3YTQ5NWI0ZTZlNzMzNGQzODkw + S: A0001 OK CRAM-MD5 authentication successful + + In this example, the shared secret is the string + + tanstaaftanstaaf + + Hence, the Keyed MD5 digest is produced by calculating + + MD5((tanstaaftanstaaf XOR opad), + MD5((tanstaaftanstaaf XOR ipad), + <1896.697170952@postoffice.reston.mci.net>)) + + where ipad and opad are as defined in [KEYED-MD5] and the string + shown in the challenge is the base64 encoding of + <1896.697170952@postoffice.reston.mci.net>. The shared secret is + null-padded to a length of 64 bytes. If the shared secret is longer + than 64 bytes, the MD5 digest of the shared secret is used as a 16 + byte input to the keyed MD5 calculation. + + This produces a digest value (in hexadecimal) of + + b913a602c7eda7a495b4e6e7334d3890 + + The user name is then prepended to it, forming + + tim b913a602c7eda7a495b4e6e7334d3890 + + Which is then base64 encoded to meet the requirements of the IMAP4 + AUTHENTICATE command (or the similar POP3 AUTH command), yielding + + dGltIGI5MTNhNjAyYzdlZGE3YTQ5NWI0ZTZlNzMzNGQzODkw + + +4. References + +4.1. Normative References + + + [ABNF] + Crocker, D., P. Overell, "Augmented BNF for Syntax Specifica- + tions: ABNF", RFC2234, Internet Mail Consortium and Demon + Internet Ltd., November 1997. + + + [KEYED-MD5] + Krawczyk, Bellare, Canetti, "HMAC: Keyed-Hashing for Message + Authentication", RFC 2104, IBM and UCSD, February 1997. + + + + + + +Klensin, et al draft-nerenberg-sasl-crammd5-01.txt [Page 3] + +Internet Draft CRAM-MD5 SASL Mechanism January 2002 + + + [KEYWORDS] + Bradner, S., "Key words for use in RFCs to Indicate Require- + ment Levels", BCP 9, RFC2119, Harvard University, March 1997. + + + [MD5] + Rivest, R., "The MD5 Message Digest Algorithm", RFC 1321, MIT + Laboratory for Computer Science and RSA Data Security, Inc., + April 1992. + + + [NFKC] + Davis, M., M. Durst, "Unicode Standard Annex #15: Unicode Nor- + malisation Forms", An integral part of The Unicode Standard, + Version 3.1.1 (http://www.uni- + code.org/reports/tr15/tr15-21.html). + + + [SASL] + Myers, J., "Simple Authentication and Security Layer (SASL)," + RFC 2222, Netscape Communications, October 1997. + + + [UNICODE] + The Unicode Consortium, "The Unicode Standard, Version 3.1.1", + defined by: The Unicode Standard, Version 3.0 (Reading, MA, + Addison-Wesley, 2000. ISBN 0-201-61633-5), as amended by the + Unicode Standard Annex #27: Unicode 3.1 (http://www.uni- + code.org/reports/tr27/) and the Unicode 3.1.1 Update Notice + (http://www.unicode.org/versions/ Unicode3.1.1.html). + + + [UTF8] + Yergeau, F., "UTF-8, a transformation format of ISO 10646", + RFC 2279, Alis Technologies, January 1998. + +4.2. Informative References + + [IMAP4] Crispin, M., "Internet Message Access Protocol - Version + 4rev1," RFC 2060, University of Washington, December 1996. + +5. Security Considerations + + It is conjectured that use of the CRAM-MD5 authentication mechanism + provides replay protection for a session. + + This mechanism does not obscure the user name in any way. Accord- + ingly, a server that implements both a cleartext password command + and this authentication type should not allow both methods of + access for a given user name. + + Keyed MD5 is chosen for this application because of the greater + security imparted to authentication of short messages. In addition, + the use of the techniques described in [KEYED-MD5] for + + + +Klensin, et al draft-nerenberg-sasl-crammd5-01.txt [Page 4] + +Internet Draft CRAM-MD5 SASL Mechanism January 2002 + + + precomputation of intermediate results make it possible to avoid + explicit cleartext storage of the shared secret on the server sys- + tem by instead storing the intermediate results which are known as + "contexts." + + While the saving, on the server, of the MD5 "context" is marginally + better than saving the shared secrets in cleartext, it is not suf- + ficient to protect the secrets if the server itself is compromised. + Consequently, servers that store the secrets or contexts must both + be protected to a level appropriate to the potential information + value in the data and services protected by this mechanism. In + other words, techniques like this one involve a tradeoff between + vulnerability to network sniffing and I/O buffer snooping and vul- + nerability of the server host's databases. If one believes that + the host and its databases are subject to compromise, and the net- + work is not, this technique (and all others like it) is unattrac- + tive. It is perhaps even less attractive than cleartext passwords, + which are typically stored on hosts in one-way hash form. On the + other hand, if the server databases are perceived as reasonably + secure, and one is concerned about client-side or network intercep- + tion of the passwords (secrets), then this (and similar) techniques + are preferable to clear-text passwords by a wide margin. + + As the length of the shared secret increases, so does the diffi- + culty of deriving it. + + While there are now suggestions in the literature that the use of + MD5 and keyed MD5 in authentication procedures probably has a lim- + ited effective lifetime, the technique is now widely deployed and + widely understood. It is believed that this general understanding + may assist with the rapid replacement, by CRAM-MD5, of the current + uses of permanent cleartext passwords in many protocols. This doc- + ument has been deliberately written to permit easy upgrading to use + SHA (or whatever alternatives emerge) when they are considered to + be widely available and adequately safe. + + Even with the use of CRAM-MD5, users are still vulnerable to active + attacks. An example of an increasingly common active attack is + 'TCP Session Hijacking' as described in CERT Advisory CA-95:01. + + + + + + + + + + + + + + + + + + +Klensin, et al draft-nerenberg-sasl-crammd5-01.txt [Page 5] + +Internet Draft CRAM-MD5 SASL Mechanism January 2002 + + +6. Authors' Addresses + + John C. Klensin + MCI Telecommunications + 800 Boylston St, 7th floor + Boston, MA 02199 + USA + + EMail: klensin@mci.net + Phone: +1 617 960 1011 + + Paul Krumviede + MCI Telecommunications + 2100 Reston Parkway + Reston, VA 22091 + USA + + EMail: paul@mci.net + Phone: +1 703 715 7251 + + Randy Catoe + MCI Telecommunications + 2100 Reston Parkway + Reston, VA 22091 + USA + + EMail: randy@mci.net + Phone: +1 703 715 7366 + + Lyndon Nerenberg (Ed.) + ACI Worldwide + Suite 900 + 10117 Jasper Avenue + Edmonton, AB + Canada T5J 1W8 + + Email: lyndon@atg.aciworldwide.com + Phone: +1 780 424 4922 + + + + + + + + + + + + + + + + + + + +Klensin, et al draft-nerenberg-sasl-crammd5-01.txt [Page 6] + diff --git a/doc/specification/draft-nerenberg-sasl-crammd5-02.txt b/doc/specification/draft-nerenberg-sasl-crammd5-02.txt new file mode 100644 index 0000000..058e1c6 --- /dev/null +++ b/doc/specification/draft-nerenberg-sasl-crammd5-02.txt @@ -0,0 +1,371 @@ + + +Network Working Group J. Klensin +Internet Draft: The CRAM-MD5 SASL Mechanism P. Krumviede +Document: draft-nerenberg-sasl-crammd5-02.txt R. Catoe + L. Nerenberg (Ed.) + June 2002 + + + + The CRAM-MD5 SASL Mechanism + + +Status of this memo + + This document is an Internet Draft and is in full conformance with + all provisions of Section 10 of RFC 2026. + + Internet Drafts are working documents of the Internet Engineering + Task Force (IETF), its areas, and its working groups. Note that + other groups may also distribute working documents as Internet + Drafts. + + Internet Drafts are draft documents valid for a maximum of six + months and may be updated, replaced, or obsoleted by other + documents at any time. It is inappropriate to use Internet Drafts + as reference material or to cite them other than as "work in + progress." + + The list of current Internet Drafts can be accessed at + http://www.ietf.org/ietf/1id-abstracts.txt + + The list of Internet Draft Shadow Directories can be accessed at + http://www.ietf.org/shadow.html. + + A revised version of this draft document will be submitted to the + RFC editor as a Proposed Standard for the Internet Community. + Discussion and suggestions for improvement are requested. + Distribution of this draft is unlimited. + +1. How to Read This Document + + The key words "MUST", "MUST NOT", "REQUIRED", "SHOULD", "SHOULD + NOT", "RECOMMENDED" and "MAY" in this document are to be inter- + preted as defined in [KEYWORDS]. + +2. Introduction + + This document defines a simple challenge-response [SASL] authenti- + cation mechanism, using a [KEYED-MD5] digest. + +3. CRAM-MD5 Authentication Mechanism + + The mechanism name associated with CRAM-MD5 is 'CRAM-MD5'. + + This mechanism does not provide a security layer. + + + +Klensin, et al draft-nerenberg-sasl-crammd5-02.txt [Page 1] + +Internet Draft CRAM-MD5 SASL Mechanism June 2002 + + + The data encoded in the challenge contains a presumptively arbi- + trary string of random digits, a timestamp, and the fully-qualified + primary host name of the server. + + The client makes note of the data and then responds with a string + consisting of the user name, a space, and a "digest." The latter + is computed by applying the keyed MD5 algorithm from [KEYED-MD5] + where the key is a shared secret and the digested text is the chal- + lenge (including angle-brackets). The client MUST NOT interpret or + attempt to validate the contents of the challenge in any way. + + This shared secret is a string known only to the client and server. + The "digest" parameter itself is a 16-octet value which is sent in + hexadecimal format, using lower-case US-ASCII characters. + + When the server receives this client response, it verifies the + digest provided. Since the user name may contain the space charac- + ter, the server MUST scan the client response from right to left; + the first space character encountered separates the digest from the + user name. If the digest is correct, the server should consider + the client authenticated and respond appropriately. + + The user name and shared secret MUST be represented in the Unicode + character set [UNICODE], and MUST be normalised using the Unicode + Normalisation Form KC [NFKC]. The resulting values MUST be encoded + as UTF-8 [UTF8]. + + +3.1. Formal Syntax + + The following syntax specification uses the augmented Backus-Naur + Form (ABNF) as specified in [ABNF], and incorporates by reference + the Core Rules defined in that document. + + challenge = "<" 1*DIGIT "." 1*DIGIT "@" hostname ">" + + digest = 32(DIGIT / %x61-66) + ; A hexadecimal string using only lower-case + ; letters + + hostname = 1*(ALPHA / DIGIT) *("." / "-" / ALPHA / DIGIT) + + response = user SP digest + + user = 1*OCTET + + +3.2. Examples + + These examples show the use of the CRAM-MD5 mechanism with the + IMAP4 AUTHENTICATE command [IMAP4]. The base64 encoding of the + challenges and responses is part of the IMAP4 AUTHENTICATE command, + not part of the CRAM-MD5 specification itself. + + + + +Klensin, et al draft-nerenberg-sasl-crammd5-02.txt [Page 2] + +Internet Draft CRAM-MD5 SASL Mechanism June 2002 + + + S: * OK IMAP4rev1 Server + C: A0001 AUTHENTICATE CRAM-MD5 + S: + PDE4OTYuNjk3MTcwOTUyQHBvc3RvZmZpY2UucmVzdG9uLm1jaS5uZXQ+ + C: dGltIGI5MTNhNjAyYzdlZGE3YTQ5NWI0ZTZlNzMzNGQzODkw + S: A0001 OK CRAM-MD5 authentication successful + + In this example, the shared secret is the string + + tanstaaftanstaaf + + Hence, the Keyed MD5 digest is produced by calculating + + MD5((tanstaaftanstaaf XOR opad), + MD5((tanstaaftanstaaf XOR ipad), + <1896.697170952@postoffice.reston.mci.net>)) + + where ipad and opad are as defined in [KEYED-MD5] and the string + shown in the challenge is the base64 encoding of + <1896.697170952@postoffice.reston.mci.net>. The shared secret is + null-padded to a length of 64 bytes. If the shared secret is longer + than 64 bytes, the MD5 digest of the shared secret is used as a 16 + byte input to the keyed MD5 calculation. + + This produces a digest value (in hexadecimal) of + + b913a602c7eda7a495b4e6e7334d3890 + + The user name is then prepended to it, forming + + tim b913a602c7eda7a495b4e6e7334d3890 + + Which is then base64 encoded to meet the requirements of the IMAP4 + AUTHENTICATE command (or the similar POP3 AUTH command), yielding + + dGltIGI5MTNhNjAyYzdlZGE3YTQ5NWI0ZTZlNzMzNGQzODkw + + +4. References + +4.1. Normative References + + + [ABNF] + Crocker, D., P. Overell, "Augmented BNF for Syntax Specifica- + tions: ABNF", RFC2234, Internet Mail Consortium and Demon + Internet Ltd., November 1997. + + + [KEYED-MD5] + Krawczyk, Bellare, Canetti, "HMAC: Keyed-Hashing for Message + Authentication", RFC 2104, IBM and UCSD, February 1997. + + + + + + +Klensin, et al draft-nerenberg-sasl-crammd5-02.txt [Page 3] + +Internet Draft CRAM-MD5 SASL Mechanism June 2002 + + + [KEYWORDS] + Bradner, S., "Key words for use in RFCs to Indicate Require- + ment Levels", BCP 9, RFC2119, Harvard University, March 1997. + + + [MD5] + Rivest, R., "The MD5 Message Digest Algorithm", RFC 1321, MIT + Laboratory for Computer Science and RSA Data Security, Inc., + April 1992. + + + [NFKC] + Davis, M., M. Durst, "Unicode Standard Annex #15: Unicode Nor- + malisation Forms", An integral part of The Unicode Standard, + Version 3.1.1 (http://www.uni- + code.org/reports/tr15/tr15-21.html). + + + [SASL] + Myers, J., "Simple Authentication and Security Layer (SASL)," + RFC 2222, Netscape Communications, October 1997. + + + [UNICODE] + The Unicode Consortium, "The Unicode Standard, Version 3.1.1", + defined by: The Unicode Standard, Version 3.0 (Reading, MA, + Addison-Wesley, 2000. ISBN 0-201-61633-5), as amended by the + Unicode Standard Annex #27: Unicode 3.1 (http://www.uni- + code.org/reports/tr27/) and the Unicode 3.1.1 Update Notice + (http://www.unicode.org/versions/ Unicode3.1.1.html). + + + [UTF8] + Yergeau, F., "UTF-8, a transformation format of ISO 10646", + RFC 2279, Alis Technologies, January 1998. + +4.2. Informative References + + [IMAP4] Crispin, M., "Internet Message Access Protocol - Version + 4rev1," RFC 2060, University of Washington, December 1996. + +5. Security Considerations + + It is conjectured that use of the CRAM-MD5 authentication mechanism + provides replay protection for a session. + + This mechanism does not obscure the user name in any way. Accord- + ingly, a server that implements both a cleartext password command + and this authentication type should not allow both methods of + access for a given user name. + + Keyed MD5 is chosen for this application because of the greater + security imparted to authentication of short messages. In addition, + the use of the techniques described in [KEYED-MD5] for + + + +Klensin, et al draft-nerenberg-sasl-crammd5-02.txt [Page 4] + +Internet Draft CRAM-MD5 SASL Mechanism June 2002 + + + precomputation of intermediate results make it possible to avoid + explicit cleartext storage of the shared secret on the server sys- + tem by instead storing the intermediate results which are known as + "contexts." + + While the saving, on the server, of the MD5 "context" is marginally + better than saving the shared secrets in cleartext, it is not suf- + ficient to protect the secrets if the server itself is compromised. + Consequently, servers that store the secrets or contexts must both + be protected to a level appropriate to the potential information + value in the data and services protected by this mechanism. In + other words, techniques like this one involve a tradeoff between + vulnerability to network sniffing and I/O buffer snooping and vul- + nerability of the server host's databases. If one believes that + the host and its databases are subject to compromise, and the net- + work is not, this technique (and all others like it) is unattrac- + tive. It is perhaps even less attractive than cleartext passwords, + which are typically stored on hosts in one-way hash form. On the + other hand, if the server databases are perceived as reasonably + secure, and one is concerned about client-side or network intercep- + tion of the passwords (secrets), then this (and similar) techniques + are preferable to clear-text passwords by a wide margin. + + As the length of the shared secret increases, so does the diffi- + culty of deriving it. + + While there are now suggestions in the literature that the use of + MD5 and keyed MD5 in authentication procedures probably has a lim- + ited effective lifetime, the technique is now widely deployed and + widely understood. It is believed that this general understanding + may assist with the rapid replacement, by CRAM-MD5, of the current + uses of permanent cleartext passwords in many protocols. This doc- + ument has been deliberately written to permit easy upgrading to use + SHA (or whatever alternatives emerge) when they are considered to + be widely available and adequately safe. + + Even with the use of CRAM-MD5, users are still vulnerable to active + attacks. An example of an increasingly common active attack is + 'TCP Session Hijacking' as described in CERT Advisory CA-95:01. + + + + + + + + + + + + + + + + + + +Klensin, et al draft-nerenberg-sasl-crammd5-02.txt [Page 5] + +Internet Draft CRAM-MD5 SASL Mechanism June 2002 + + +6. Authors' Addresses + + John C. Klensin + MCI Telecommunications + 800 Boylston St, 7th floor + Boston, MA 02199 + USA + + EMail: klensin@mci.net + Phone: +1 617 960 1011 + + Paul Krumviede + MCI Telecommunications + 2100 Reston Parkway + Reston, VA 22091 + USA + + EMail: paul@mci.net + Phone: +1 703 715 7251 + + Randy Catoe + MCI Telecommunications + 2100 Reston Parkway + Reston, VA 22091 + USA + + EMail: randy@mci.net + Phone: +1 703 715 7366 + + Lyndon Nerenberg (Ed.) + ACI Worldwide + Suite 900 + 10117 Jasper Avenue + Edmonton, AB + Canada T5J 1W8 + + Email: lyndon@atg.aciworldwide.com + Phone: +1 780 424 4922 + + + + + + + + + + + + + + + + + + + +Klensin, et al draft-nerenberg-sasl-crammd5-02.txt [Page 6] + diff --git a/doc/specification/draft-newman-auth-scram-03.txt b/doc/specification/draft-newman-auth-scram-03.txt new file mode 100644 index 0000000..ba8ebe8 --- /dev/null +++ b/doc/specification/draft-newman-auth-scram-03.txt @@ -0,0 +1,1457 @@ + + + + + +Network Working Group C. Newman +Internet Draft: SCRAM-MD5 SASL Mechanism Innosoft +Document: draft-newman-auth-scram-03.txt March 1998 + Expires in six months + + + Salted Challenge Response Authentication Mechanism (SCRAM) + + +Status of this memo + + This document is an Internet-Draft. Internet-Drafts are working + documents of the Internet Engineering Task Force (IETF), its areas, + and its working groups. Note that other groups may also distribute + working documents as Internet-Drafts. + + Internet-Drafts are draft documents valid for a maximum of six + months and may be updated, replaced, or obsoleted by other + documents at any time. It is inappropriate to use Internet-Drafts + as reference material or to cite them other than as "work in + progress." + + To view the entire list of current Internet-Drafts, please check + the "1id-abstracts.txt" listing contained in the Internet-Drafts + Shadow Directories on ftp.is.co.za (Africa), ftp.nordu.net + (Europe), munnari.oz.au (Pacific Rim), ds.internic.net (US East + Coast), or ftp.isi.edu (US West Coast). + + +Abstract + + SCRAM is a simple passphrase-based SASL [SASL] authentication + mechanism suitable for a wide variety of usage scenarios. It + combines good properties of CRAM-MD5 [CRAM-MD5] and OTP [OTP], adds + some management features and some protection from active attacks + without a significant increase in complexity. SCRAM is intended + for use with services which need a simple, fast and flexible + authentication mechanism. + + [NOTE: Public discussion of this mechanism may take place on the + ietf-sasl@imc.org mailing list with a subscription address of + ietf-sasl-request@imc.org. Private comments may be sent to the + author]. + + +1. How to Read This Document + + This document has information for several different audiences. + + + +Newman [Page 1] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + Section 2 provides an introduction to SCRAM. Sections 3-6 and 9 + are intended for implementors. Section 7 is intended for system + administrators. Sections 7-10 are intended for security + evaluation. + + The key words "MUST", "MUST NOT", "SHOULD", "SHOULD NOT" and "MAY" + in this document are to be interpreted as defined in "Key words for + use in RFCs to Indicate Requirement Levels" [KEYWORDS]. + + +2. Introduction + + This section describes the design goals, an overview of how SCRAM + operates and the intended use of SCRAM in comparison to OTP. + + +2.1. Design Goals + + The perfect authentication mechanism would be simple, fast, strong, + use publicly available source code and be backwards compatible with + deployed back-end authentication databases. It is impossible to + achieve all these goals so tradeoffs must be made. SCRAM has + simplicity, speed and protection from passive and active attacks on + the connection (with the exception of dictionary attacks) as + primary design goals. It has managability, backwards compatibility + with CRAM-MD5 intermediate HMAC state verifiers, some protection + from a compromised authentication database and publicly + distributable source code as secondary design goals. + + SCRAM has the following characteristics: + + o It is a simple passphrase-based mechanism which does not require + complicated infrastructures or public key technology. The + majority of the source code necessary to implement SCRAM is + included in the MD5 specification [MD5] and Appendices B and C + of this specification. + + o It does not require plain-text-equivalent verifiers on the + server, so it improves network security over traditional + plain-text password systems without eliminating security of the + server authentication database. + + o It supports proxy authentication by including an authorization + identity (user to login as) separate from the authentication + identity (server authentication database entry to use). + + o It supports mutual authentication. + + + + +Newman [Page 2] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + o It supports a limited service trust management model. This + means a centralized authentication server could restrict the + services offered by application servers. + + o It is backwards-compatible with CRAM-MD5 server authentication + databases. + + o It includes an optional SASL integrity protection layer for + lightweight protection from many active attacks. + + +2.2. Basic Operation of SCRAM + + SCRAM is built using only a simple one-way hash function, the HMAC + [HMAC] construction and the exclusive-or operation. There are + three fundamental components to the exchange: + + o the client key which is derived from the passphrase and salt + + o the client verifier which is simply the one-way hash function + applied to the client key + + o the server key which is also derived from the passphrase and + salt + + The server has access to the salt, client verifier and server key + for each user. The salt and client verifier are used to + authenticate the client to the server and the salt and server key + are used to authenticate the server to the client. + + The mechanism relies on the one-way characteristic of the hash + function to assure that the client key can't be derived from the + client verifier and that the server key can't be derived from + either the client key or client verifier. + + SCRAM uses HMAC to sign client and server nonces with the client + verifier to produce a shared key. The client exclusive-ors the + shared key with the client key and sends that to the server which + uses the shared key to reverse the exclusive-or operation, extract + the client key, and then verify that the hash function applied to + the client key matches the client verifier. The server uses HMAC + to sign the client and server nonces with the server key and sends + that to the client to authenticate. + +2.3. Intended Use + + SCRAM is designed for a usage scenario where simplicity and/or + speed is important, frequent authentications may occur and the + + + +Newman [Page 3] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + primary threat is passive and active network attacks. A good + example of protocols whose usage and threat model fit SCRAM are + IMAP [IMAP4] and POP3 [POP3]. SCRAM provides limited protection + against threats to the server authentication database, but OTP + [OTP] may be preferable for usage scenarios where the threat to the + server is more serious and active attacks are not an issue. + + +3. Client Implementation of SCRAM-MD5 + + This section includes a step-by-step guide for client implementors. + Section 6 contains the formal definition of the syntax and is the + authoritative reference in case of errors here. + + When used with SASL the mechanism name is "SCRAM-MD5". The + mechanism does not provide a privacy layer, but does include an + optional integrity protection layer. + + The client begins by sending a message to the server containing the + following three pieces of information. + + (1) An authorization identity. When the empty string is used, this + defaults to the authentication identity. This is used by system + administrators or proxy servers to login with a different user + identity. This field may be up to 255 octets and is terminated by + a NUL (0) octet. US-ASCII printable characters are preferred, + although UTF-8 [UTF-8] printable characters are permitted to + support international names. Use of character sets other than + US-ASCII and UTF-8 is forbidden. + + (2) An authentication identity. The identity whose passphrase will + be used. This field may be up to 255 octets and is terminated by a + NUL (0) octet. US-ASCII printable characters are preferred, + although UTF-8 [UTF-8] printable characters are permitted to + support international names. Use of character sets other than + US-ASCII and UTF-8 is forbidden. + + (3) A "client nonce." It is important that this be globally + unique. One common technique for generating globally unique + identifiers combines a process identifier with the system clock, a + sequence number, a random number and the client's domain name. The + random number is important as clocks are often synchronized using + insecure protocols and are predictable. Advice for generating good + random numbers can be found in [RANDOM]. + + The server responds by sending a message containing three pieces of + information: + + + + +Newman [Page 4] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + (4) An 8-octet salt value, specific to the authentication identity. + + (5) A one-octet bit-mask specifying security layers supported by + the server. Bit 0 (value 1) indicates support for no security + layer and bit 1 (value 2) indicates support for an integrity + protection layer. The other bits are reserved for future use (the + server MUST set them to zero until they are defined in a standards + track specification). If the client doesn't support a security + layer and bit 0 is cleared, then the authentication immediately + fails. + + (6) A three-octet number in network byte order (big endian), + containing the maximum cipher-text buffer size the server is able + to receive. This may be 0 if the server supports no security + layers. + + (7) A service id consisting of the service name of the protocol's + SASL profile followed by an "@" followed by the domain name of the + server and terminated by NUL. The client SHOULD verify this is + correct. + + (8) A "server nonce". As the domain name is included in (7), this + only has to be unique to the server. + + The client then does the following: + + (A) Create a buffer containing the user's passphrase. The client + MUST support passphrases of at least 64 octets. US-ASCII + characters are preferred, although UTF-8 characters are permitted. + Character sets other than US-ASCII and UTF-8 MUST NOT be used. + + (B) Apply the HMAC-MD5 function with (A) as the key and the 8-octet + salt as the data, producing a 16-octet result. Once this is done, + (A) SHOULD be erased from memory. + + (C) Apply the MD5 function to the result of (B). This produces a + 16-octet result. + + (D) Apply the MD5 function to the result of (C). This produces a + 16-octet result. + + (E) Create a buffer containing the server's response (4)-(8), + immediately followed by the initial client message (1)-(3) and the + client's security layer selection (9)-(10) below. + + (F) Apply the HMAC-MD5 function with the result of (D) as the key + and the buffer from (E) as the data. This produces a 16-octet + result. + + + +Newman [Page 5] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + (G) Create a 16-octet buffer containing the exclusive-or of (C) and + (F). + + The client then sends a message to the server containing the + following: + + (9) A bit-mask indicating the client selected security layer from + step (5). This has a value of 01 for no security layer and 02 for + an integrity protection layer. + + (10) A three octet number indicating the maximum cipher-text buffer + size the client is able to receive in network byte order. If the + client doesn't select a security layer, this may be all zeros. + + (11) The 16-octet result of step (G). + + The server will respond with: + + (12) A 16-octet server authentication verifier. + + The client SHOULD verify this with the following procedure: + + (H) Apply the HMAC-MD5 function with the result of (B) as the key + and the 8-octet salt as the data. This produces a 16-octet result. + + (I) Create a buffer containing the initial client message (1)-(3) + immediately followed by the initial server response (4)-(8) and the + client's security layer selection (9)-(10). + + (J) Apply the HMAC-MD5 function with the result of (H) as the key + and the buffer from (I) as the data. + + (K) If the result of (J) matches (12), the server is authenticated. + + A secured client MAY store the result of (B) to re-authenticate to + services using the same salt, or the intermediate HMAC state from + (B) to re-authenticate to any service. Clients SHOULD NOT store + the passphrase itself. + + If integrity protection is negotiated on, the following procedure + is applied to each SASL security layer packet sent by the client: + + (L) Apply the HMAC-MD5 function with the output of step (C) as the + key and the buffer from step (E) as the value. + + (M) A buffer is created containing a four octet client packet + number in network byte order followed by the 16-octet output of + step (L). The first packet sent under the SASL security layer is + + + +Newman [Page 6] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + given number 1. + + (N) Apply the HMAC-MD5 function with (M) as the key and the + contents of the packet as the data. The result is appended to the + end of the packet. + + The integrity protection on packets from the server is verified as + follows: + + (O) A buffer is created containing a four octet server packet + number in network byte order followed by the 16-octet output of + step (L) above. This first packet sent under the SASL security + layer is given number 1. + + (P) Apply the HMAC-MD5 function with (O) as the key and all but the + last 16 octets of the packet as the value. + + (Q) Compare the last 16 octets of the packet to the output of (P). + If they do not match, an integrity error is produced. + + +4. Server Implementation of SCRAM-MD5 + + The section includes a step-by-step guide for server implementors + building on the previous section. Section 6 contains the formal + definition of the syntax and is the authoritative reference in case + of errors here. + + The server's authentication database contains an 8-octet salt, + 16-octet client verifier and a 16-octet server key for each local + user. The server MUST support "user@host" syntax for the + authentication identity at least to the extent of stripping "@host" + when it matches the local host name or rejecting the authentication + if the host name doesn't match. The server MAY support remote user + authentication using this syntax. + + The stored client verifier is equal to the result of step (D) + above, and the stored server key is equal to the result of step (H) + above. To create its initial response, the server simply looks up + the authentication identity to fetch the salt, and generates an 8 + to 248 octet nonce. This nonce MUST be unique for the server to + prevent replay attacks. It can be generated by appending a system + clock to a process and/or thread identifier and a random number + [RANDOM]. To verify the client's credentials, the server performs + the following steps: + + (a) Generate a buffer identical to step (E) above. + + + + +Newman [Page 7] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + (b) Apply the HMAC-MD5 function with the stored client verifier as + the key and the result of (a) as the data. This produces a + 16-octet result equal to step (F) above. + + (c) Exclusive-or the result of (b) with message (11) from the + client. This produces a 16-octet result which should be equal to + the result of step (C) above. + + (d) Apply the MD5 function to the output of step (c). This + produces a 16-octet result which should be equal to the result of + step (D) above. + + (e) if the result of (d) is equal to the stored verifier, then the + user is authenticated. + + If no client challenge was provided in step (3), the server is now + done and responds with the appropriate status code. Otherwise the + server continues as follows: + + (f) Generate a buffer identical to step (I) above. + + (g) Apply the HMAC-MD5 function with the stored server verifier as + the key and the buffer from (f) as the data. This produces a + 16-octet result. + + The result of (g) is sent to the client to authenticate the server. + + If integrity protection is negotiated on, the integrity key is + computed as follows: + + (h) Apply the HMAC-MD5 function with the output of step (c) as the + key and the buffer from step (a) as the data. + + Integrity generation and verification works in the same fashion as + the client. + + +5. Example + + In these examples, "C:" represents lines sent from the client to + the server and "S:" represents lines sent from the server to the + client. The wrapped lines are for editorial clarity -- there are + no actual newlines in the middle of the messages. + + The following is an example of the SCRAM-MD5 mechanism using the + IMAP [IMAP4] profile of SASL. For this example, the user "chris", + with an empty authorization identity is using the passphrase + "secret stuff". The client nonce is + + + +Newman [Page 8] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + "" and the server + nonce is "jhcNZlRuPbziFp+vLV+NCw". No security layer is supported, + the salt is "testsalt" and the service identity is + "imap@eleanor.innosoft.com". The complete 40 octet verifier stored + on the server, in hexadecimal is "74657374 73616c74 16484d56 + 7ee02f47 ac5f8a5a d5795570 90d55334 d2002df6 24cb8c8b 75708f4e." + + C: a001 AUTHENTICATE SCRAM-MD5 + S: + + C: AGNocmlzADx0NG40UGFiOUhCMEFtL1FMWEI3MmVnQGVsZWFub3IuaW + 5ub3NvZnQuY29tPg== + S: + dGVzdHNhbHQBAAAAaW1hcEBlbGVhbm9yLmlubm9zb2Z0LmNvbQBq + aGNOWmxSdVBiemlGcCt2TFYrTkN3 + C: AQAAAMg9jU8CeB4KOfk7sUhSQPs= + S: + U0odqYw3B7XIIW0oSz65OQ== + C: + S: a001 OK AUTHENTICATE completed + + Note that base64 encoding and the lack of an initial client + response with the first command are characteristics of the IMAP + profile of SASL and not characteristics of SASL or SCRAM-MD5. Here + is another example using the ACAP [ACAP] profile of SASL. This + uses the same salt, passphrase and verifier as the previous + example. In this example, binary data is represented as + hexadecimal digits enclosed in square brackets: + + C: a001 AUTHENTICATE "SCRAM-MD5" {52} + C: [00]chris[00] + S: + {60} + S: testsalt[01000000]acap@eleanor.innosoft.com[00] + m6HdEYWZA5W8keNbiY40aA + C: {20} + C: [01000000 19b66406 4ce8138a e0af7b0b f0ed20ea] + S: a001 OK (SASL {16} + S: [44d7c1c4 0630fea6 5c49cb40 717a2ba5]) "Successful" + + Note that arbitrary binary values may be used for the salt and + nonces, as long as the client nonce is globally unique. + + +6. Formal Syntax of SCRAM-MD5 Messages + + This is the formal syntactic definition of the client and server + messages. This uses ABNF [ABNF] notation including the core rules. + + client-msg-1 = [authorize-id] NUL authenticate-id NUL nonce + + server-msg-1 = salt security-info service-id NUL nonce + + + +Newman [Page 9] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + client-msg-2 = security-info client-proof + + server-msg-2 = server-proof + + passphrase = *UTF8-SAFE + ;; At least 64 octets MUST be supported + + authorize-id = *UTF8-PRINT + ;; No more than 255 octets + + authenticate-id = *UTF8-PRINT + ;; No more than 255 octets + + security-info = secbits bufsize + + bufsize = 3OCTET + ;; in network byte order (big-endian) + + secbits = OCTET + ;; bit 0 = no protection, bit 1 = integrity, + ;; other bits set to 0 and reserved + + service-id = service-name "@" server-domain + + service-name = *VCHAR + ;; a SASL/GSSAPI service name + + server-domain = *VCHAR + ;; an internet domain name + + nonce = 8*OCTET + + salt = 8OCTET + + client-proof = 16OCTET + + server-proof = 16OCTET + + NUL = %x00 ;; US-ASCII NUL character + + UTF8-SAFE = %x01-09 / %x0B-0C / %x0E-7F / UTF8-MULTI + ;; Any character except CR, LF, NUL + + UTF8-PRINT = %x20-7E / UTF8-MULTI + ;; Any character except CTLs + + UTF8-MULTI = UTF8-2 / UTF8-3 / UTF8-4 / UTF8-5 / UTF8-6 + ;; UTF-8 Multi-octet characters + + + +Newman [Page 10] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + UTF8-1 = %x80-BF + + UTF8-2 = %xC0-DF UTF8-1 + + UTF8-3 = %xE0-EF 2UTF8-1 + + UTF8-4 = %xF0-F7 3UTF8-1 + + UTF8-5 = %xF8-FB 4UTF8-1 + + UTF8-6 = %xFC-FD 5UTF8-1 + + +7. System Administrator Advice + + This section includes advice for system administrators using this + mechanism. + + A SCRAM server stores three pieces of information for each user: a + salt, a client verifier and server key. The latter two are derived + from the salt and the user's passphrase. + + The salt prevents global dictionary attacks, similar to the salt + used in Unix /etc/passwd files. As the 12 bits of salt in Unix + /etc/passwd has proved to be insufficient, SCRAM uses 64 bits of + salt. See [SCHNEIER] for a good discussion of salt and dictionary + attacks. In a multi-server site, security can be increased by + using a different salt on each server. + + Although the verifiers used by SCRAM-MD5 have roughly comparable + security to those used by current plain-text mechanisms (such as + Unix /etc/passwd), it is still very important to keep them secret. + Just as tools exist to try common passwords against Unix + /etc/passwd files, it is also possible to build such tools for + SCRAM-MD5. In addition, once a SCRAM-MD5 verifier is stolen, a + passive (undetectable) eavesdropper of that user logging in gains + the output of step (C) above, which is sufficient to impersonate + the user to all services with the same salt. This is better than + current plain-text mechanisms where a passive eavesdropper always + recovers the user's password, but is still a serious concern. + + Verifiers SHOULD be kept hidden from all users on the server. + Sites which distribute verifiers among multiple servers, SHOULD + encrypt them when transferring them over the network. + + SCRAM-MD5 is only a good mechanism if passphrases are well chosen. + For this reason, implementations should use the term "passphrase" + rather than "password" and when a user's passphrase is set, site + + + +Newman [Page 11] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + policy restrictions should be applied. A reasonably secure site + policy would require passphrases of at least 10 characters with at + least one non-alphanumeric character. + + SCRAM-MD5 doesn't protect the privacy of data exchanged after + authentication. Use of TLS [TLS], IP security ESP [IPESP] or a + stronger SASL mechanism such as Kerberos is encouraged if this + functionality is needed. + + +8. SCRAM Functional Notation + + This section is designed to provide a quick understanding of SCRAM + for those who like functional notation. + + + octet concatenation + XOR the exclusive-or function + AU is the authentication user identity (NUL terminated) + AZ is the authorization user identity (NUL terminated) + if AZ is the same as AU, a single NUL is used instead. + csecinfo client security layer option bits and buffer size + ssecinfo server security layer option bits and buffer size + service is the name of the service and server (NUL terminated) + pass is the plain-text passphrase + H(x) is a one-way hash function applied to "x", such as MD5 + MAC(x,y) is a message authentication code (MAC) such as HMAC-MD5 + "y" is the key and "x" is the text signed by the key. + salt is a per-user salt value the server stores + Us is a unique nonce the server sends to the client + Uc is a unique nonce the client sends to the server + + The SCRAM computations and exchange are as follows: + + client-msg-1 = AZ + AU + Uc + (1) client -> server: client-msg-1 + server-msg-1 = salt + ssecinfo + service + Us + (2) server -> client: server-msg-1 + salted-pass = MAC(salt, pass) + client-key = H(salted-pass) + client-verifier = H(client-key) + shared-key = MAC(server-msg-1 + client-msg-1 + csecinfo, + client-verifier) + client-proof = client-key XOR shared-key + (3) client -> server: csecinfo + client-proof + server-key = MAC(salt, salted-pass) + server-proof = MAC(client-msg-1 + server-msg-1 + csecinfo, + server-key) + (4) server -> client: server-proof + + + +Newman [Page 12] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + integrity-key = MAC(server-msg-1 + client-msg-1 + csecinfo, + client-key) + + The server stores the salt, client-verifier and server-key. It + authenticates the client by computing: + + H(client-proof XOR shared-key) + + after step 3 and comparing it to the stored client-verifier. The + server computes the integrity-key with: + + MAC(server-msg-1 + client-msg-1, client-proof XOR shared-key) + + The client verifies the server by computing the server-proof + directly and comparing. + + +9. Security Considerations + + Security considerations are discussed throughout this document. + The security considerations of MD5 [MD5] and HMAC [HMAC] also + apply. SCRAM relies primarily on the one-way characteristic of MD5 + and HMAC-MD5 for security. The weaknesses found in MD5 are not + believed to impact this use. In the interest of avoiding + proliferation of authentication mechanisms, it is hoped that it + will be easy to deploy public-key technology before a hash function + upgrade becomes necessary. + + SCRAM does use the output of an HMAC function and exclusive-or to + construct a simple 16-octet encryption function. While + constructing an encryption function from a hash function is + normally a questionable practice [SCHNEIER], in this case both the + key and the data are outputs of a one-way hash function with a good + bit-distribution and the key is used only once (as long as the + combined nonces are unique). + + An analysis of different attacks follows: + + Passive Network Attacks + + SCRAM is resistant to replay attacks as long as the appropriate + nonce is unique. + + SCRAM is not resistant to passive dictionary attacks. User + education, passphrase setting policy and external confidentiality + services can be used to protect against such attacks. + + SCRAM does not protect against session data eavesdropping. An + + + +Newman [Page 13] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + external confidentiality service is necessary to protect against + eavesdropping. TLS [TLS] and IP security ESP [IPESP] are examples + of IETF standards-track mechanisms to provide confidentiality. + + Active Network Attacks + + If the client fails to verify the server proof, then SCRAM provides + no protection from active attacks. + + SCRAM protects against server impersonation with the server mutual + authentication. + + An attacker could use SCRAM to probe for users by trying each user + name twice to see if the salt varies. The server can prevent this + attack by inventing consistent salt values for non-users. One way + to do this would be to store a random secret and generate the salt + using HMAC(user-name, random-secret). + + SASL is susceptible to downgrade active attacks which reduce the + advertised authentication mechanisms to the weakest the server + offers. If SCRAM is the weakest mechanism, such attacks can be + detected if integrity protection is negotiated on and the client + requests a duplicate copy of the server's capability list after + authentication (e.g., by re-issuing the CAPABILITY command in + IMAP). For a protocol such as ACAP [ACAP], the server SHOULD + repeat the greeting line immediately after authentication is + completed whenever integrity protection is negotiated on. + + SCRAM can detect insertion, deletion and modification of session + data only if integrity protection is negotiated on. TLS [TLS] or + IP security services [IPAUTH, IPESP] may also be used to protect + against such tampering. If TLS or IP security integrity protection + is active, then the SCRAM integrity layer is unnecessary and SHOULD + be negotiated off. + + Upper level security services, such as SCRAM and TLS, can not + protect against denial of service attacks on the TCP/IP layer. In + addition, if no integrity layer is used, then SCRAM is vulnerable + to TCP session stealing attacks [CERT-IPSPOOF]. IP security + services [IPAUTH, IPESP] can protect against many of these attacks. + + SCRAM is not susceptible to the race and denial of service attacks + mentioned in section 9 of the OTP specification [OTP]. + + Server Attacks + + A server implementation which does not tolerate input of any length + with any content may be susceptible to attacks which permit + + + +Newman [Page 14] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + privileged access to the server. For this reason server + implementations MUST be able to accept input of any length with any + content although server implementations MAY refuse to authenticate + the client if messages exceed the specified maximum lengths. Note + that the ANSI C gets() library function does not meet this + requirement. + + An attacker which has access to both the SCRAM verifier and a + client exchange for a particular user gains the ability to + impersonate that user to other servers using the same salt. An + external confidentiality service can make it more difficult to + obtain the client exchange, but can not defend against installation + of a trojan horse on a compromised server. + + In the process of authentication, the server gains access to the + client-key which is sufficient to impersonate the user to other + services with the same salt. + + The limited service trust feature (step 7 above) includes the + service name and the server host name. A server host which is + authorized to provide one service can impersonate that service at + other hosts in the same realm by an active attack on the DNS system + when used by the client. Use of secure DNS [DNSSEC] on the client + limits this vulnerability. + + Client Attacks + + As SCRAM is designed for user entry of a plain-text passphrase, it + is vulnerable to passphrase hijacking by trojan horse clients. OTP + [OTP] with an external portable OTP calculator can limit the + vulnerability to a single session. + + +10. Intellectual Property Issues and Prior Art + + The author is not aware of any patents or pending patents which + apply to this mechanism. + + This is primarily a derivative of simple hash-based challenge + response systems. The hash-based challenge response idea has + existed since at least 1992, when the RIPE project published the + SKID algorithm according to [SCHNEIER]. + + The repeated-hash idea used to verify the client's authenticator is + derived from S/KEY [SKEY]. + + The idea of using salt to protect against global dictionary attacks + dates back to at least the Unix /etc/passwd system. There is some + + + +Newman [Page 15] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + discussion of this in [SCHNEIER]. + + SCRAM combines these techniques. The author of this specification + first proposed this idea on a public mailing list on July 16, 1997. + + +11. Multinational Considerations + + As remote access is a crucial service, users are encouraged to + restrict user names and passphrases to the US-ASCII character set. + However, if characters outside the US-ASCII character set are used + in user names and passphrases, then they are interpreted according + to UTF-8 [UTF-8] and it is a protocol error to include any octet + sequences not legal for UTF-8. Servers are encouraged to enforce + this restriction to discourage clients which use unlabeled + character sets in this context. + + +12. References + + [ABNF] Crocker, Overell, "Augmented BNF for Syntax Specifications: + ABNF", RFC 2234, Internet Mail Consortium, Demon Internet Ltd, + November 1997. + + [ACAP] Newman, Myers, "ACAP -- Application Configuration Access + Protocol", RFC 2244, Innosoft, Netscape, November 1997. + + [CERT-IPSPOOF] CERT, "TCP SYN Flooding and IP Spoofing Attacks", + CERT CA-96.21, CERT, September 1996. + + [CRAM-MD5] Klensin, Catoe, Krumviede, "IMAP/POP AUTHorize Extension + for Simple Challenge/Response", RFC 2195, MCI, September 1997. + + [DNSSEC] Eastlake, Kaufman, "Domain Name System Security + Extensions", RFC 2065, CyberCash, Iris, January 1997. + + [HMAC] Krawczyk, Bellare, Canetti, "HMAC: Keyed-Hashing for Message + Authentication", RFC 2104, IBM, UCSD, February 1997. + + [IMAP4] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, University of Washington, December 1996. + + [IPAUTH] Atkinson, "IP Authentication Header", RFC 1826, Naval + Research Laboratory, August 1995. + + [IPESP] Atkinson, "IP Encapsulating Security Payload (ESP)", RFC + 1827, Naval Research Laboratory, August 1995. + + + + +Newman [Page 16] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + [KEYWORDS] Bradner, "Key words for use in RFCs to Indicate + Requirement Levels", RFC 2119, Harvard University, March 1997. + + [MD5] Rivest, "The MD5 Message Digest Algorithm", RFC 1321, MIT + Laboratory for Computer Science, April 1992. + + [OTP] Haller, Metz, "A One-Time Password System", RFC 1938, + Bellcore, Kaman Sciences Corporation, May 1996. + + [OTP-EXT] Metz, "OTP Extended Responses", RFC 2243, The Inner Net, + November 1997. + + [POP3] Myers, J., Rose, M., "Post Office Protocol - Version 3", RFC + 1939, Carnegie Mellon, Dover Beach Consulting, Inc., May 1996. + + [RANDOM] Eastlake, Crocker, Schiller, "Randomness Recommendations + for Security", RFC 1750, DEC, Cybercash, MIT, December 1994. + + [SASL] Myers, "Simple Authentication and Security Layer (SASL)", + RFC 2222, Netscape Communications, October 1997. + + [SCHNEIER] Schneier, "Applied Cryptography: Protocols, Algorithms + and Source Code in C," John Wiley and Sons, Inc., 1996. + + [SKEY] Haller, Neil M. "The S/Key One-Time Password System", RFC + 1760, Bellcore, February 1995. + + [TLS] Dierks, Allen, "The TLS Protocol Version 1.0", Work in + progress. + + [UTF8] Yergeau, F. "UTF-8, a transformation format of ISO 10646", + RFC 2279, Alis Technologies, January 1998. + + +13. Author's Address + + Chris Newman + Innosoft International, Inc. + 1050 Lakes Drive + West Covina, CA 91790 USA + + Email: chris.newman@innosoft.com + + +A. Appendix - Additional Services + + Several additional services are needed to make SCRAM useful in more + usage scenarios. These include remote authentication database + + + +Newman [Page 17] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + support for servers, authentication database APIs for servers, + remote passphrase change support for clients, single-sign-on APIs + for clients and management tools. The service-id and server-key + are included to facilitate the remote authentication database + service. Otherwise these issues are deferred for future work. + +B. Appendix - HMAC-MD5 Sample Source Code + + The following sample C source code calls the source code in the MD5 + specification [MD5] and is derived from the source code in [HMAC]. + It is needed by the SCRAM source code in the next section. + + The client may call hmac_md5_precalc() to save the intermediate + HMAC result for later use in hmac_md5_import(). This can be used + by a CRAM-MD5 [CRAM-MD5] or a SCRAM-MD5 [SCRAM-MD5] client to save + an intermediate result suitable for use with any server without + saving the plain-text passphrase. + + /* hmac-md5.h -- HMAC_MD5 functions + */ + #define HMAC_MD5_SIZE 16 + + /* intermediate MD5 context */ + typedef struct HMAC_MD5_CTX_s { + MD5_CTX ictx, octx; + } HMAC_MD5_CTX; + + /* intermediate HMAC state + * values stored in network byte order (Big Endian) + */ + typedef struct HMAC_MD5_STATE_s { + UINT4 istate[4]; + UINT4 ostate[4]; + } HMAC_MD5_STATE; + + /* One step hmac computation + * + * digest may be same as text or key + */ + void hmac_md5(const unsigned char *text, int text_len, + const unsigned char *key, int key_len, + unsigned char digest[HMAC_MD5_SIZE]); + + /* create context from key + */ + void hmac_md5_init(HMAC_MD5_CTX *hmac, + const unsigned char *key, int key_len); + + + + +Newman [Page 18] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + /* precalculate intermediate state from key + */ + void hmac_md5_precalc(HMAC_MD5_STATE *hmac, + const unsigned char *key, int key_len); + + /* initialize context from intermediate state + */ + void hmac_md5_import(HMAC_MD5_CTX *hmac, HMAC_MD5_STATE *state); + + #define hmac_md5_update(hmac, text, text_len) \ + MD5Update(&(hmac)->ictx, (text), (text_len)) + + /* finish hmac from intermediate result. + * Intermediate result is erased. + */ + void hmac_md5_final(unsigned char digest[HMAC_MD5_SIZE], + HMAC_MD5_CTX *hmac); + + + /* hmac-md5.c -- HMAC MD5 Keyed-Hashing by Chris Newman + * derived from RFC 2104 by H. Krawczyk, M. Bellare, R.Canetti + */ + #include + #include + #include "md5.h" + #include "hmac-md5.h" + + /* for htonl() and ntohl() */ + #include + #include + + /* MD5 block size */ + #define BLOCK_SIZE 64 + + void hmac_md5_init(HMAC_MD5_CTX *hmac, + const unsigned char *key, int key_len) + { + unsigned char k_pad[BLOCK_SIZE]; /* padded key */ + int i; + + /* if key longer than BLOCK_SIZE bytes reset to MD5(key) */ + if (key_len > BLOCK_SIZE) { + MD5Init(&hmac->ictx); + MD5Update(&hmac->ictx, key, key_len); + MD5Final(k_pad, &hmac->ictx); + key = k_pad; + key_len = HMAC_MD5_SIZE; + } + + + +Newman [Page 19] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + + /* XOR padded key with inner pad value */ + for (i = 0; i < key_len; i++) { + k_pad[i] = key[i] ^ 0x36; + } + while (i < BLOCK_SIZE) { + k_pad[i++] = 0x36; + } + + /* Begin inner MD5 */ + MD5Init(&hmac->ictx); + MD5Update(&hmac->ictx, k_pad, BLOCK_SIZE); + + /* XOR padded key with outer pad value */ + for (i = 0; i < BLOCK_SIZE; ++i) { + k_pad[i] ^= (0x36 ^ 0x5c); + } + + /* Begin outer MD5 */ + MD5Init(&hmac->octx); + MD5Update(&hmac->octx, k_pad, BLOCK_SIZE); + + /* clean up workspace */ + memset(k_pad, 0, BLOCK_SIZE); + } + + void hmac_md5_final(unsigned char digest[HMAC_MD5_SIZE], + HMAC_MD5_CTX *hmac) + { + /* finish inner MD5 */ + MD5Final(digest, &hmac->ictx); + /* finish outer MD5 */ + MD5Update(&hmac->octx, digest, HMAC_MD5_SIZE); + MD5Final(digest, &hmac->octx); + /* MD5Final zeros context */ + } + + void hmac_md5(const unsigned char *text, int text_len, + const unsigned char *key, int key_len, + unsigned char digest[HMAC_MD5_SIZE]) + { + HMAC_MD5_CTX hmac; + + hmac_md5_init(&hmac, key, key_len); + hmac_md5_update(&hmac, text, text_len); + hmac_md5_final(digest, &hmac); + } + + + + +Newman [Page 20] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + void hmac_md5_precalc(HMAC_MD5_STATE *ctx, + const unsigned char *pass, int passlen) + { + HMAC_MD5_CTX hctx; + + if (passlen == 0) passlen = strlen((const char *) pass); + hmac_md5_init(&hctx, pass, passlen); + ctx->istate[0] = htonl(hctx.ictx.state[0]); + ctx->istate[1] = htonl(hctx.ictx.state[1]); + ctx->istate[2] = htonl(hctx.ictx.state[2]); + ctx->istate[3] = htonl(hctx.ictx.state[3]); + ctx->ostate[0] = htonl(hctx.octx.state[0]); + ctx->ostate[1] = htonl(hctx.octx.state[1]); + ctx->ostate[2] = htonl(hctx.octx.state[2]); + ctx->ostate[3] = htonl(hctx.octx.state[3]); + memset(&hctx, 0, sizeof (hctx)); + } + + + void hmac_md5_import(HMAC_MD5_CTX *hctx, HMAC_MD5_STATE *ctx) + { + hctx->ictx.state[0] = ntohl(ctx->istate[0]); + hctx->ictx.state[1] = ntohl(ctx->istate[1]); + hctx->ictx.state[2] = ntohl(ctx->istate[2]); + hctx->ictx.state[3] = ntohl(ctx->istate[3]); + hctx->octx.state[0] = ntohl(ctx->ostate[0]); + hctx->octx.state[1] = ntohl(ctx->ostate[1]); + hctx->octx.state[2] = ntohl(ctx->ostate[2]); + hctx->octx.state[3] = ntohl(ctx->ostate[3]); + hctx->ictx.count[0] = hctx->octx.count[0] = BLOCK_SIZE << 3; + hctx->ictx.count[1] = hctx->octx.count[1] = 0; + } + + + + + + + + + + + + + + + + + + + +Newman [Page 21] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + +C. Appendix - SCRAM sample source code + + The following sample source code implements SCRAM itself for both + server and client. + + Please note the lines marked "XXX: ..." as they need to be + translated from English to computer readable code. + + A client implementation simply calls scram_md5_generate() with the + passphrase after receiving the first server reply. The cproof + parameter will hold the message to send to the server and the + sproof parameter will hold the expected server mutual + authentication. The clidata parameter holds the client's security + layer selections. A client may also call hmac_md5_precalc() to + turn a passphrase into CRAM/SCRAM credentials for later use in + scram_md5_generate(). + + A server implementation simply calls scram_md5_generate() with the + stored verifier, the second client message and the SCRAM_VERIFY + option. Server verifiers are generated by creating a random salt + and calling scram_md5_vgen() with either the passphrase or + CRAM/SCRAM credentials. + + If integrity protection is desired, the integrity_key parameter may + be provided to scram_md5_generate() and will receive the resulting + key. Generating an verifying the integrity protection is left as + an exercise to the reader. + + /* scram.h -- scram utility functions + */ + /* size of SCRAM_MD5 salt and verifier */ + #define SCRAM_MD5_SALTSIZE 8 + #define SCRAM_MD5_DATASIZE 16 + + /* SCRAM verifier */ + typedef struct SCRAM_MD5_VRFY_s { + unsigned char salt[SCRAM_MD5_SALTSIZE]; + unsigned char clidata[SCRAM_MD5_DATASIZE]; + unsigned char svrdata[SCRAM_MD5_DATASIZE]; + } SCRAM_MD5_VRFY; + + /* Client proof message */ + typedef struct SCRAM_MD5_CLIENT_s { + unsigned char secprops[4]; + unsigned char cproof[SCRAM_MD5_DATASIZE]; + } SCRAM_MD5_CLIENT; + + /* generate SCRAM-MD5 verifier + + + +Newman [Page 22] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + * vptr -- gets result + * salt -- contains salt of SCRAM_MD5_SALTSIZE + * pass -- passphrase or verifier + * passlen -- len of pass/verifier (0 ok if NUL terminated) + * plainflag -- 1 = plaintext passphrase, + * 0 = result of hmac_md5_precalc() + * clientkey -- cache for client proof, usually NULL + */ + void scram_md5_vgen(SCRAM_MD5_VRFY *vptr, + const unsigned char *salt, + const char *pass, int passlen, int plainflag, + unsigned char *clientkey); + + /* scram secret action type */ + #define SCRAM_CREDENTIAL 0 /* generate replies using credentials */ + #define SCRAM_PLAINTEXT 1 /* generate replies using plaintext */ + #define SCRAM_VERIFY 2 /* use SCRAM_MD5_VRFY to verify client, + and generate server reply */ + + /* generate or verify SCRAM-MD5 + * input params: + * cchal -- client challenge string + * cchallen -- length of client challenge + * schal -- server challenge string + * schallen -- length of server challenge + * secret -- passphrase, credentials, or verifier + * secretlen -- length of passphrase (0 ok if NUL terminated) + * action -- see above + * in/out: + * clidata -- client data for client response + * output: + * sproof -- server proof of length SCRAM_MD5_DATASIZE + * integrity_key -- integrity key of length SCRAM_MD5_DATASIZE + * caller may pass NULL if no integrity needed + * returns: + * -2 if params invalid + * -1 if verify fails + * 0 on success + */ + int scram_md5_generate(const char *cchal, int cchallen, + const char *schal, int schallen, + const char *secret, int secretlen, + int action, + SCRAM_MD5_CLIENT *clidata, + unsigned char *sproof, + unsigned char *integrity_key); + + + + + +Newman [Page 23] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + /* scram.c -- routines for SCRAM-MD5 calculations + */ + #include + #include + #include + #include "md5.h" + #include "hmac-md5.h" + #include "scram.h" + + void scram_md5_vgen(SCRAM_MD5_VRFY *vptr, + const unsigned char *salt, + const char *pass, int passlen, int plainflag, + unsigned char *clientkey) + { + HMAC_MD5_CTX hctx; + + if (clientkey == NULL) clientkey = vptr->clidata; + + /* get context */ + if (plainflag) { + if (passlen == 0) passlen = strlen(pass); + hmac_md5_init(&hctx, (const unsigned char *) pass, + passlen); + } else { + hmac_md5_import(&hctx, (HMAC_MD5_STATE *) pass); + } + + /* generate salted passphrase */ + hmac_md5_update(&hctx, salt, SCRAM_MD5_SALTSIZE); + hmac_md5_final(vptr->clidata, &hctx); + + /* generate server proof */ + hmac_md5(salt, SCRAM_MD5_SALTSIZE, vptr->clidata, + sizeof (vptr->clidata), vptr->svrdata); + + /* generate client key and client verifier */ + MD5Init(&hctx.ictx); + MD5Update(&hctx.ictx, vptr->clidata, sizeof (vptr->clidata)); + MD5Final(clientkey, &hctx.ictx); + MD5Init(&hctx.ictx); + MD5Update(&hctx.ictx, clientkey, SCRAM_MD5_DATASIZE); + MD5Final(vptr->clidata, &hctx.ictx); + + /* copy salt to verifier */ + if (salt != vptr->salt) { + memcpy(vptr->salt, salt, SCRAM_MD5_SALTSIZE); + } + } + + + +Newman [Page 24] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + int scram_md5_generate(const char *cchal, int cchallen, + const char *schal, int schallen, + const char *secret, int secretlen, + int action, + SCRAM_MD5_CLIENT *clidata, + unsigned char *sproof, + unsigned char *integrity_key) + { + SCRAM_MD5_VRFY verifier, *vptr; + HMAC_MD5_CTX hctx; + unsigned char clientkey[HMAC_MD5_SIZE]; + unsigned char sharedkey[HMAC_MD5_SIZE]; + int i, result = 0; + + /* check params */ + if ((action == SCRAM_CREDENTIAL + && secretlen != sizeof (HMAC_MD5_STATE)) + || (action == SCRAM_VERIFY + && secretlen != sizeof (verifier)) + || schallen < SCRAM_MD5_SALTSIZE) { + return (-2); + } + + /* get verifier */ + if (action == SCRAM_VERIFY) { + vptr = (SCRAM_MD5_VRFY *) secret; + } else { + scram_md5_vgen(&verifier, (const unsigned char *) schal, + secret, secretlen, action, clientkey); + vptr = &verifier; + } + + /* calculate shared key */ + hmac_md5_init(&hctx, vptr->clidata, sizeof (vptr->clidata)); + hmac_md5_update(&hctx, (unsigned char *) schal, schallen); + hmac_md5_update(&hctx, (unsigned char *) cchal, cchallen); + hmac_md5_update(&hctx, clidata->secprops, 4); + hmac_md5_final(sharedkey, &hctx); + + if (action == SCRAM_VERIFY) { + /* verify client proof */ + for (i = 0; i < HMAC_MD5_SIZE; ++i) { + XXX: the line which belongs here is omitted due to + U.S. export regulations, but it exclusive-ors the + "sharedkey" with the "clidata->cproof" and places the + result in "clientkey" (see step (c) above) + } + MD5Init(&hctx.ictx); + + + +Newman [Page 25] + +Internet Draft SCRAM-MD5 SASL Mechanism March 1998 + + + MD5Update(&hctx.ictx, clientkey, sizeof (clientkey)); + MD5Final(sharedkey, &hctx.ictx); + if (memcmp(sharedkey, vptr->clidata, + sizeof (sharedkey)) != 0) { + result = -1; + } + } else { + /* generate client proof */ + for (i = 0; i < HMAC_MD5_SIZE; ++i) { + XXX: the line which belongs here is omitted due to + U.S. export regulations, but it exclusive-ors the + "sharedkey" with the "clientkey" and places the + result in "clidata->cproof" (see step (G) above) + } + } + + /* calculate integrity key */ + if (integrity_key != NULL) { + hmac_md5_init(&hctx, clientkey, HMAC_MD5_SIZE); + hmac_md5_update(&hctx, (unsigned char *) schal, schallen); + hmac_md5_update(&hctx, (unsigned char *) cchal, cchallen); + hmac_md5_update(&hctx, clidata->secprops, 4); + hmac_md5_final(integrity_key, &hctx); + } + + /* calculate server result */ + if (result == 0) { + hmac_md5_init(&hctx, vptr->svrdata, HMAC_MD5_SIZE); + hmac_md5_update(&hctx, (unsigned char *) cchal, cchallen); + hmac_md5_update(&hctx, (unsigned char *) schal, schallen); + hmac_md5_update(&hctx, clidata->secprops, 4); + hmac_md5_final(sproof, &hctx); + } + + /* cleanup workspace */ + memset(clientkey, 0, sizeof (clientkey)); + memset(sharedkey, 0, sizeof (sharedkey)); + if (vptr == &verifier) memset(&verifier, 0, sizeof (verifier)); + + return (result); + } + + + + + + + + + + +Newman [Page 26] diff --git a/doc/specification/draft-newman-sasl-passdss-01.txt b/doc/specification/draft-newman-sasl-passdss-01.txt new file mode 100644 index 0000000..4aa7cb8 --- /dev/null +++ b/doc/specification/draft-newman-sasl-passdss-01.txt @@ -0,0 +1,1122 @@ + + + + + + +Network Working Group C. Newman +Internet Draft: PASSDSS-3DES-1 SASL Mechanism Innosoft +Document: draft-newman-sasl-passdss-01.txt March 1998 + Expires in six months + + + DSS Secured Password Authentication Mechanism + + +Status of this memo + + This document is an Internet-Draft. Internet-Drafts are working + documents of the Internet Engineering Task Force (IETF), its areas, + and its working groups. Note that other groups may also distribute + working documents as Internet-Drafts. + + Internet-Drafts are draft documents valid for a maximum of six + months and may be updated, replaced, or obsoleted by other + documents at any time. It is inappropriate to use Internet-Drafts + as reference material or to cite them other than as "work in + progress." + + To view the entire list of current Internet-Drafts, please check + the "1id-abstracts.txt" listing contained in the Internet-Drafts + Shadow Directories on ftp.is.co.za (Africa), ftp.nordu.net + (Europe), munnari.oz.au (Pacific Rim), ds.internic.net (US East + Coast), or ftp.isi.edu (US West Coast). + + +Abstract + + Some system administrators are faced with a choice between + deploying a new authentication infrastructure or sending + unencrypted passwords in the clear over the Internet. Deploying a + new authentication infrastructure often involves modifying + operating system services or keeping parallel authentication + databases up to date and is thus unacceptable to many + administrators. + + Solutions which encrypt the entire session are often crippled with + weak keys (due to government restrictions) which are unsuitable for + passwords. In addition, such solutions often reduce performance of + the entire session to an unacceptable level. This specification + defines a SASL [SASL] mechanism which is compatible with existing + password-based authentication databases and does not require a + security layer for the remainder of the session. + + [NOTE: Public discussion of this mechanism may take place on the + + + +Newman [Page 1] + +Internet Draft PASSDSS-3DES-1 SASL Mechanism March 1998 + + + ietf-sasl@imc.org mailing list with a subscription address of + ietf-sasl-request@imc.org. Private comments may be sent to the + author]. + +1. How to Read This Document + + This document is intended primarily for a programmer. If + successful, it should be possible for a competent programmer to + write a client implementation using this specification, the SASL + [SASL] specification, an understanding of how to generate random + numbers [RANDOM], a description or implementation of the DES and + SHA1 [SHA1] algorithms and a multi-precision integer math library. + A cryptographic library or a copy of "Applied Cryptography" + [SCHNEIER] or similar reference is helpful for any implementation + and necessary for server DSS key generation. + + The key words "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", and "MAY" + in this document are to be interpreted as defined in "Key words for + use in RFCs to Indicate Requirement Levels" [KEYWORDS]. + +1.1. Data Types Used in this Document + + A list of data types used in this document follows. Note that the + majority of this section is copied from the secure shell + specification [SSH-ARCH]. + + octet A basic 8-bit unit of data. + + uint32 A 32-bit unsigned integer. Stored as four octets in + network byte order (also known as big endian or most + significant byte [MSB] first). For example, the decimal + value 699921578 (hexadecimal 29b7f4aa) is represented with + the hexadecimal octet sequence 29 b7 f4 aa. + + string A string is a length-prefixed octet string. The length is + represented as a uint32 with the data immediately + following. A length of 0 indicates an empty string. The + string MAY contain NUL or 8-bit octets. When used to + represent textual strings, the characters are interpreted + in UTF-8 [UTF-8]. Other character encoding schemes MUST + NOT be used. + + mpint Represents multiple precision integers in two's complement + format, stored as a string, most significant octet first. + Negative numbers have one in the most significant bit of + the first octet of the string data. If the most significant + bit would be set for a positive number, the number MUST be + preceded by a zero byte. Unnecessary leading zero or 255 + + + +Newman [Page 2] + +Internet Draft PASSDSS-3DES-1 SASL Mechanism March 1998 + + + bytes MUST NOT be included. The value zero MUST be stored + as a string with zero bytes of data. + + By convention, a number that is used in modular + computations in the field of integers mod n SHOULD be + represented in the range 0 <= x < n. + + Examples: + + value (hex) representation (hex) + ----------------------------------------------------------- + 0 00 00 00 00 + 9a378f9b2e332a7 00 00 00 08 09 a3 78 f9 b2 e3 32 a7 + 80 00 00 00 02 00 80 + -1234 00 00 00 02 ed cc + -deadbeef 00 00 00 05 ff 21 52 41 11 + +1.2. Glossary + + This section includes some acronyms used in this document. + + DES The U.S. Government Data Encryption Standard is a symmetric + encryption algorithm introduced in 1975 which uses a 56 bit + key. The algorithm is documented in [SCHNEIER]. + + DSA The U.S. Government Digital Signature Algorithm standard. A + public key signature algorithm available for unrestricted use + without a license. + + DSS The U.S. Government Digital Signature Standard [DSS] which + employs the DSA algorithm. + + HMAC A hash-based message authentication code [HMAC] summarized in + Appendix A.4. Test cases are available in [HMAC-TEST]. + + SHA The Secure Hash Algorithm (version 1) which is part of the DSS + standard. + + triple-DES + Use of the DES algorithm three times in an encrypt-decrypt- + encrypt mode with three independent keys as described in + appendix A.3. + +2. Overview + + This section includes a brief discussion of design goals, intended + use and an overview for this SASL mechanism. An overview of some + of the algorithms used is in Appendix A. + + + +Newman [Page 3] + +Internet Draft PASSDSS-3DES-1 SASL Mechanism March 1998 + + +2.1. Design Goals + + The ideal authentication mechanism would be simple, fast, fully + secure, freely distributable without restrictions and backwards + compatible with deployed back-end authentication databases. + Unfortunately, it is not possible to achieve all these goals so + priorities and tradeoffs are necessary. This mechanism has + compatibility with deployed back-end authentication databases and + protection from passive and active attacks on the underlying + connection as primary design goals. Simplicity and unrestricted + binary distribution are secondary design goals. + + Backwards compatibility is achieved by using plain-text + passphrases. Protection from passive and active attacks is + achieved by using public and symmetric key technology to encrypt + the passphrase and optionally protect the remainder of the session. + Some simplicity is achieved by avoiding complicated public key + certification issues and formats as well as making the SASL session + security layer and certification by the client optional. + Unrestricted binary distribution is hopefully achieved by using + unencumbered algorithms and making the SASL privacy layer optional. + +2.2. Intended Use + + This is intended as a plug-and-play mechanism for services layered + on top of deployed passphrase-based back-end authentication + databases. When no security layer is implemented it can be added + to a SASL-based protocol without modifying or substituting network + read and write APIs. When the optional session privacy protection + is omitted, the author speculates that it may be possible to make a + binary implementation which would be exportable from the United + States. + + For cases where simplicity, speed or unrestricted source code + distribution is more desirable than backwards compatibility or + security, a mechanism such as CRAM-MD5 [CRAM-MD5] or SCRAM [SCRAM] + is preferred. + + The optional SASL integrity and privacy protection is provided as a + simple alternative to full service security layers such as TLS + [TLS] or Secure Shell [SSH-ARCH]. However, there are many + advantages to full service security layers such as compression, + faster symmetric cipher options, and the ability to leverage other + public key infrastructures. An implementation which supports TLS + may have no incentive to support SASL security layers at all. The + complexity verses functionality tradeoff is significant enough that + these mechanisms do not compete. + + + + +Newman [Page 4] + +Internet Draft PASSDSS-3DES-1 SASL Mechanism March 1998 + + +2.3. Mechanism Overview + + The PASSDSS-3DES-1 mechanism uses three components to perform a + secure authentication against a legacy passphrase database. + + In order to protect against active attacks, a DSS public key in a + format compatible with Secure Shell [SSH-TRANS] is used to + authenticate the server to the client. The client is presumed to + have the server's public key or a SHA-1 hash thereof stored locally + in a secure database. If the client is willing to risk exposure to + active attacks, it may skip the public key certification step + altogether or do a one-time initialization of its local database, + perhaps with user interaction. + + In addition to the DSS public key, a Diffie-Hellman key exchange is + used to generate a key for encrypting the passphrase. The + "PASSDSS-3DES-1" variant of this mechanism uses the same fixed + Diffie-Hellman group used by Secure Shell's diffie-hellman-group1- + sha1 key exchange [SSH-TRANS]. If more groups are necessary, they + will be assigned to mechanism variants "PASSDSS-3DES-2" and so + forth. + + Finally, the triple-DES algorithm is used to encrypt the client's + passphrase and send it to the server. + +2.4. Message Format Overview + + This section provides a quick overview of the format of the + messages. The formal definition of the syntax for these messages + is in section 6. A detailed discussion of their implementation on + clients and servers is in sections 3 and 4 respectively. + + First message from client to server: + string azname ; the user name to login as, may be empty if + same as authentication name + string authname ; the authentication name + mpint X ; Diffie-Hellman parameter X + + The challenge from server to client is as follows: + uint32 pklength ; length of SSH-style DSA server public key + string "ssh-dss" ; constant string "ssh-dss" (lower case) + mpint p ; DSA public key parameters + mpint q + mpint g + mpint y + mpint Y ; Diffie-Hellman parameter Y + OCTET ssecmask ; SASL security layers offered + 3 OCTET sbuflen ; maximum server security layer block size + + + +Newman [Page 5] + +Internet Draft PASSDSS-3DES-1 SASL Mechanism March 1998 + + + uint32 siglength ; length of SSH-style dss signature + string "ssh-dss" ; constant string "ssh-dss" (lower case) + mpint r ; DSA signature parameters + mpint s + + The client then sends the following message encrypted with + triple-DES: + OCTET csecmask ; SASL security layer selection + 3 OCTET cbuflen ; maximum client block size + string passphrase ; the user's passphrase + 20 OCTET cli-hmac ; a client HMAC-SHA-1 signature + +3. Client Implementation of PASSDSS-3DES-1 + + This section includes a step-by-step guide for client implementors. + Although section 6 contains the formal definition of the syntax and + is the authoritative reference in case of errors here, this section + should be sufficient to build a correct implementation. + + The SASL mechanism name is "PASSDSS-3DES-1". + + The value of n used for the Diffie-Hellman exchange is as follows + (represented as an unsigned hexadecimal integer): + + FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 + 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD + EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 + E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED + EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381 + FFFFFFFF FFFFFFFF. + + When represented as an "mpint", this would have a prefix of + "0000008100." The value of g is 2. This group was taken from the + ISAKMP/Oakley specification, and was originally generated by + Richard Schroeppel at the University of Arizona. Properties of + this prime are described in [Orm96]. + + The client begins by doing the following: + + (A) Generate the Diffie-Hellman private value "x". This should be + less than (n - 1)/2. The number of bits of entropy to use in "x" + is an important decision, as shorter lengths will be less secure + and longer lengths will noticeably reduce performance. At the time + this was written, 192 bits of entropy [RANDOM] is probably + sufficient. For more information on this topic, see [SHORT-EXP]. + + + + + + +Newman [Page 6] + +Internet Draft PASSDSS-3DES-1 SASL Mechanism March 1998 + + + (B) Compute the Diffie-Hellman public value "X" as follows. If X + has a value of 0, repeat step (A). + x + X = 2 mod n + + The client then sends the following three pieces of information to + the server: + + (1) An authorization identity represented as a string. When the + empty string is used, this defaults to the authentication identity. + This is used by system administrators or proxy servers to login + with a different user identity. + + (2) An authentication identity represented as a string. This is + the identity whose passphrase will be used. + + (3) The "X" result from step (B) represented as an mpint. + + The server responds by sending a message containing the following + information: + + (4) An "ssh-dss" public key compatible with Secure Shell, including + the 32-bit length prefix in network byte order, the Secure Shell + string "ssh-dss" and mpints for "p", "q", "g" and "y" (see Appendix + A.1). + + (5) The mpint "Y" as defined for the Diffie-Hellman key exchange + (see Appendix A.2). + + (6) A single octet bit mask representing the security layers + available in the same format used by the KERBEROS_V4 mechanism + [SASL]. Bit 0 (value 1) indicates it is permissible to have no + security layer. Bit 1 (value 2) indicates integrity protection is + permissible. Bit 2 (value 4) indicates privacy protection for the + rest of the session is available. The remaining bits are reserved + for future use. + + (7) A three octet unsigned integer in network byte order + representing the maximum cipher-text buffer size the server is able + to receive. If this is less than 32, it indicates that a SASL + security layer is not supported. + + (8) A DSA signature, including a 32-bit length, the Secure Shell + string "ssh-dss" and mpints for "r" and "s". + + The client then does the following: + + (C) Verify that "Y" is between 1 and n - 1 inclusive. If "Y" is + + + +Newman [Page 7] + +Internet Draft PASSDSS-3DES-1 SASL Mechanism March 1998 + + + outside this range, the client MUST cancel the authentication. + + (D) Verify that the public key from step (4) belongs to the server. + This can be done either with a database of SSH public keys or with + a database of SHA1 hashes of such public keys. If the client does + not have a matching entry for the server or does not have a public + key database, it MAY skip this step although it SHOULD alert the + user that the connection is susceptible to active attacks if it + does so. It MAY also record the public key (or SHA1 hash thereof) + in its database with permission from the user. + + (E) Compute the Diffie-Hellman key K as follows. It may be + necessary to mask timing attacks [TIMING]. + x + K = Y mod n + + (F) Create a buffer containing data from steps (1) through (7) in + order immediately followed by K represented as an mpint. + + (G) Compute the SHA1 hash of the buffer from (F). This produces a + 20 octet result. + + (H) If the public key from step (4) was not certified, this step + MAY be skipped. Otherwise, verify that the DSS signature is a + signature of (G). This computation is done as defined in appendix + A.1 where the output of step (G) represents the message "m" (note + that this results in SHA1 being applied twice). + + (I) Compute the following 20-octet values. K represents the output + of step (E) in mpint format. H represents the output of step (G). + The || symbol represents string concatenation. "A" represents a + single octet containing the US-ASCII value of capital letter A. + cs-encryption-iv = SHA1( K || "A" || H ) + sc-encryption-iv = SHA1( K || "B" || H ) + cs-encryption-key-1 = SHA1( K || "C" || H ) + cs-encryption-key-2 = SHA1( K || cs-encryption-key-1 ) + cs-encryption-key = cs-encryption-key-1 || cs-encryption-key-2 + sc-encryption-key-1 = SHA1( K || "D" || H ) + sc-encryption-key-2 = SHA1( K || sc-encryption-key-1 ) + sc-encryption-key = sc-encryption-key-1 || sc-encryption-key-2 + cs-integrity-key = SHA1( K || "E" || H ) + sc-integrity-key = SHA1( K || "F" || H ) + + (J) Create a buffer beginning with a bit mask for the selected + security layer (it MUST be one offered in 6) followed by three + octets representing the maximum cipher-text buffer size (at least + 32) the client can accept in network byte order. This is followed + by a string containing the passphrase. Note that integrity + + + +Newman [Page 8] + +Internet Draft PASSDSS-3DES-1 SASL Mechanism March 1998 + + + protection is pointless unless the public key was certified in + step (D) and the signature was verified in step (H). + + (K) Create a buffer containing items (1) through (7) immediately + followed by the first four octets of (J). + + (L) Compute HMAC-SHA-1 with (K) as the data and the cs-integrity- + key from step (I) as the key. This produces a 20 octet result. A + summary of the HMAC-SHA-1 algorithm [HMAC] is in appendix A.4. + + (M) Create a buffer containing (J) followed by (L) followed by an + arbitrary number of zero octets as necessary to reach the block + size of DES and conceal the passphrase length from an eavesdropper. + + (N) Apply the triple-DES algorithm to (M) with the first 8 octets + of cs-encryption-iv from step (I) as the initialization vector and + the first 24 octets of cs-encryption-key as the key. If optional + privacy protection is negotiated on, the triple-DES state is not + reset. + + The client then sends a message to the server containing the + following: + + (9) The output of step (N). + + If a SASL security layer is negotiated on, the following steps are + used when sending a message: + + (O) Create a buffer containing a uint32 client packet number + (starting from 0) immediately followed by the cs-integrity-key from + step (I). + + (P) Compute HMAC-SHA-1 with (O) as the key and the data to transmit + as the data. + + (Q) Create a buffer containing the data to transmit followed by the + 20-octet output of (P). If privacy was negotiated on, this is + followed by zero to seven padding octets followed by one more octet + indicating the number of padding octets. The total size MUST be a + multiple of the DES block size. + + (R) The result of step (Q) is encrypted with triple-DES if privacy + was negotiated and is sent prefixed by a uint32 length, as required + by SASL. + + If a SASL security layer was negotiated on, the following steps are + taken when receiving a message: + + + + +Newman [Page 9] + +Internet Draft PASSDSS-3DES-1 SASL Mechanism March 1998 + + + (S) If privacy was negotiated on, the message is decrypted using + triple-DES with the first 24 octets of sc-encryption-key as the + key. The value of the last octet plus one indicates the number of + octets to ignore at the end of the output. The sc-encryption-iv is + used to initialize triple-DES state the first time this is done. + + (T) Create a buffer containing a uint32 server packet number + (starting from 0) immediately followed by the sc-integrity-key. + + (U) Compute HMAC-SHA-1 with (T) as the key over the portion of the + data excluding the 20 octet signature and any encryption padding. + If this is the same as the 20 octet signature, then the data is not + corrupted. + +4. Server Implementation of PASSDSS-3DES-1 + + The section includes a step-by-step guide for server implementors. + It is intended to be read in conjunction with section 3. + + The server MUST have a persistent DSS-SSH public key. Mechanisms + for generating such keys are described in [SCHNEIER] and [DSS]. + + IMPORTANT NOTE: The server MUST be able to process any message from + the client, including messages of any size, messages with invalid + content and messages with NULs in the middle of strings. When + input is illegal, the server MUST gracefully reject authentication + or in extreme cases gracefully terminate the connection. + Particular care to avoid buffer overruns is important if the user + name or passphrase strings are copied. + + The server performs the following computations prior to or during + the connection by the client: + + (a) Select a random number k less than (p - 1)/2. It is important + to generate a good random number [RANDOM]. + + (b) Compute signature component "r" as follows: + k + r = (g mod p) mod q + + (c) Optionally pre-compute the group inverse of k, mod q and the + value xr. + + (d) Select a random Diffie-Hellman private key y less than (n - + 1)/2. Follow the same guidance as in (A) above. + + + + + + +Newman [Page 10] + +Internet Draft PASSDSS-3DES-1 SASL Mechanism March 1998 + + + (e) Compute the Diffie-Hellman public value Y as follows. If Y has + a value of 0, repeat step (d) above. + y + Y = 2 mod n + + (f) Verify that the value X from the client is between 1 and (n - + 1). If it isn't, fail the authentication. + + (g) Compute the Diffie-Hellman shared key K as follows. It may be + necessary to mask timing attacks [TIMING]. + y + K = X mod n + + (h) Create a buffer containing items (1) through (7) above followed + by K represented as an mpint. + + (i) Compute the SHA-1 hash of the buffer from (h). This produces a + 20 octet result. + + (j) Generate a DSS signature of (i). The signature is made up of + "r" from step (b) and the result following computation (partially + completed in step c): + -1 + s = (k (SHA1(h) + xr)) mod q + + (k) Create a buffer containing items (4) through (8) and send it to + the client. + + (l) Perform the computations as described in step (I) where K is + the result of step (g) in mpint format and H is the result of step + (i). + + (m) Decrypt message (9) from the client using triple-DES with cs- + encryption-iv as the initialization vector and the first 24 octets + of cs-encryption-key as the key. + + (n) Verify the passphrase from the output of step (m) against the + authentication database. Fail the authentication if verification + fails. + + (o) Verify that the selected security layer is permitted and the + cipher text buffer size is at least 32. If not, fail the + authentication. + + (p) Create a buffer containing steps (1) through (7) followed by + the first four octets of the result from (m). + + (q) Compute the HMAC-SHA-1 of (p) with cs-integrity-key as the key. + + + +Newman [Page 11] + +Internet Draft PASSDSS-3DES-1 SASL Mechanism March 1998 + + + This produces a 20-octet result. + + (r) Compare the output of (q) with the 20 octet signature after the + passphrase in the output of (m). If they don't match, fail the + authentication. + + If a SASL security layer is negotiated on, sending and receiving + procedures are similar to steps (O)-(U), with client and server + roles exchanged (and thus sc-* values and cs-* value exchanged). + Note that triple-DES state from step (m) is not reset. + +5. Example + + The following is an example of the PASSDSS-3DES-1 mechanism using + the IMAP [IMAP4] profile of SASL. Note that base64 encoding and + the lack of an initial client response with the first command are + characteristics of the IMAP profile of SASL and not characteristics + of SASL or this mechanism. + + In this example, "C:" represents lines sent from the client to the + server and "S:" represents lines sent from the server to the + client. The wrapped lines are for editorial clarity -- there are + no actual newlines in the middle of the messages. + + C: a001 AUTHENTICATE PASSDSS-3DES-1 + S: + + C: AAAAAAAAAAVjaHJpcwAAAIEAhuVbMxdLxrAQVyUWbAp+X09h6QmZ2Jebz + H7YhtcbQyLbB9AGi1eIdojZYtAuVeE+PYkKUANLHI9XzWSFliIGMeUvBc + bflHr+s9tZ5/5YZh9blb33km3tUYVKyB5XP530bDn+lY1lAv6tXHKZPrx + b0zPhc+JGgpWGlmT5k9vx2Wk= + S: + AAAA8gAAAAdzc2gtZHNzAAAAQQDPVlO6nFefrq6fA/dQKIoNj75Jjpp + kVv3DkyILABCox2dMql0bnO48rHFuo167y6oukT/ocKupIw6bgKmdofgd + AAAAFQDRpB6FrxemUGRuLjY/oiH/Qef14QAAAEEAkVr9rOlB58k5XoqmP + NYTrVGZKWbCPcYtaL92ANxgWyjyRo49+m0+fHPNhNibQoLddEZF8lHPKW + gb7z7qz0QMdgAAAEARcIEiMz5jTZo8COf2njL3BTWRND5NGAgZY7s1YOm + 2BfjVyf1/MkOiQMiXeonrsfMc0sWQGgpRYRtJWpe56cc2AAAAgQDoV5Uk + bcy3Gjf16MZwPLlJlvmjpSNv2dSSApoddd4+BgZr01zyt7hzb0yRruaN5 + fG43DbJLkk7mtL1Hw8aYXBMQQzrPpHtx+anpCDoN2jlersCGFY2cnjxTf + HqY139ohA8vVXYpapeXxKXR4//Ib/ApTGmwlOeIikKDrBmEGX/JgEAAAA + AAAA8AAAAB3NzaC1kc3MAAAAVAI7j3HG8HyjCOxaGFOUTwZqe0xSHAAAA + FHSqU41vPHTCRTqmxNFwXqazPlJH + C: Obp6vQ83q1O/OnQDifZB1rWOci9LaSck8VxNB4UAFhRI56BAs4XPLqOWI + CoB3LYZ + S: a001 OK Authentication Completed + + The following private values were used in this example. These + values are all represented as an mpint in hexadecimal (msb first). + + + + +Newman [Page 12] + +Internet Draft PASSDSS-3DES-1 SASL Mechanism March 1998 + + + The client private Diffie-Hellman "x" value: + + 00000018 666E35B4 3BF4BF2B 40E31359 7A5D3AD0 61FD4F6F 736A6114 + + The server private Diffie-Hellman "y" value: + + 00000018 587BDFD6 800D101C 8E82E233 3B5A07AA DB87B8F1 68DC194D + + The Diffie-Hellman shared secret: + + 00000080 3B46D3A8 D2163930 1C33D9FE EAFA528D F4B881CF DF906A03 + 33249A88 42547FF6 49FDC149 1A5084B1 B425A105 CE571283 AC61D896 + AF8F7AF7 F95643F3 00A91E57 BCB8CFD7 77A25CBD 35F59A9E 59E98BEA + EA866339 7F0F9AA0 2F0F335C 8C6AAFF7 76BDB668 DF4D51AF 5B4FB807 + 81A70901 F478FB86 BF42055C BAF46094 EC72E98A + + The DSA private key value (the public key is in the exchange): + + 00000014 252BCBFA 5634D706 6ED43128 972E181E 66BF9C30 + + The SHA-1 hash value used to compute the keys: + + 26 75 97 06 EB FE E3 69 C9 03 7D 49 64 19 D5 D2 97 66 E8 CE + +6. Formal Syntax of PASSDSS-3DES-1 Messages + + This is the formal syntactic definition of the client and server + messages. This uses ABNF [ABNF] notation including the core rules. + The first three rules define the formal exchange. The later rules + define the elements of the exchange. + + client-msg-1 = [azname] authname diffie-hellman-X + + server-msg-1 = dss-public-key diffie-hellman-Y + ssecmask sbuflen dss-signature + + client-msg-2 = client-blob + + + authname = string + ;; interpreted as UTF-8 [UTF-8] + + azname = string + ;; interpreted as UTF-8 [UTF-8] + + cbuflen = 3OCTET + ;; Big endian binary unsigned integer + ;; max length of client read buffer + + + +Newman [Page 13] + +Internet Draft PASSDSS-3DES-1 SASL Mechanism March 1998 + + + cli-hmac = 20OCTET + + client-blob = 8*OCTET + ;; encrypted version of client-encrypted + + client-encrypted = csecmask cbuflen passphrase cli-hmac *NUL + ;; MUST be multiple of DES block size + + csecmask = OCTET + ;; client selected protection layer + + diffie-hellman-X = mpint + + diffie-hellman-Y = mpint + + dss-g = mpint + + dss-p = mpint + + dss-public-key = length NUL NUL NUL %x07 "ssh-dss" + dss-p dss-q dss-g dss-y + ;; length is total length of remainder + ;; as defined in [SSH-TRANS] + + dss-q = mpint + + dss-r = mpint + + dss-signature = length NUL NUL NUL %x07 "ssh-dss" + dss-r dss-s + ;; length is total length of remainder + + dss-s = mpint + + dss-y = mpint + + length = 4OCTET + ;; binary number, big endian format (MSB first) + + mpint = length *OCTET + ;; length specifies number of octets + ;; see section 1 for detailed mpint definition + + passphrase = string + ;; At least 64 octets MUST be supported + + + + + + +Newman [Page 14] + +Internet Draft PASSDSS-3DES-1 SASL Mechanism March 1998 + + + sbuflen = 3OCTET + ;; Big endian binary unsigned integer + ;; max length of server read buffer + + ssecmask = OCTET + ;; server protection layer mask + + string = length *OCTET + ;; the length determines the number of octets + ;; OCTETs are interpreted as UTF-8 + + NUL = %x00 ;; US-ASCII NUL character + +7. Security Considerations + + Security considerations are discussed throughout this memo. + + This mechanism supplies the server with the plain-text passphrase, + so the server gains the ability to masquerade as the user to any + other services which share the same passphrase. + + If the public key certification step is skipped, then an active + attacker can gain the client's passphrase and thus the ability to + masquerade as the user to any other services which share the same + passphrase. Negotiating a security layer will fail to provide + protection from an active attacker in this case. + + If no security layer is negotiated, the rest of the protocol + session is subject to active and passive attacks. + + If an integrity-only layer is negotiated, the rest of the protocol + is subject to passive eavesdropping. + + The quality of this mechanism depends on the quality of the random + number generator used. See [RANDOM] for more information. + +8. Multinational Considerations + + As remote access is a crucial service, users are encouraged to + restrict user names and passphrases to the US-ASCII character set. + However, if characters outside the US-ASCII character set are used + in user names and passphrases, then they are interpreted according + to UTF-8 [UTF-8] and it is a protocol error to include any octet + sequences not legal for UTF-8. Servers are encouraged to enforce + this restriction to discourage clients from using non-interoperable + local character sets in this context. + + + + + +Newman [Page 15] + +Internet Draft PASSDSS-3DES-1 SASL Mechanism March 1998 + + +9. Intellectual Property Issues and Acknowledgments + + David Kravitz holds U.S. Patent #5,231,668 on the DSA algorithm. + NIST has made this patent available world-wide on a royalty-free + basis. + + Diffie-Hellman was first published in 1976 [DIFFIE-HELLMAN]. U.S. + Patent #4,200,770 granted April 1980 has expired. Canada Patent + #1,121,480 was granted April 6, 1982 and may still apply at this + time. + + DES is covered under U.S. Patent #3,962,539 granted June 1978, + which has expired. + + The majority of the constructions in this specification were copied + from the Secure Shell specifications [SSH-ARCH, SSH-TRANS]. + Additional information is paraphrased from "Applied Cryptography" + [SCHNEIER]. + +10. References + + [ABNF] Crocker, Overell, "Augmented BNF for Syntax Specifications: + ABNF", RFC 2234, Internet Mail Consortium, Demon Internet Ltd, + November 1997. + + [CRAM-MD5] Klensin, Catoe, Krumviede, "IMAP/POP AUTHorize Extension + for Simple Challenge/Response", RFC 2195, MCI, September 1997. + + [DIFFIE-HELLMAN] Diffie, W., Hellman, M.E., "Privacy and + Authentication: An introduction to Cryptography," Proceedings of + the IEEE, v. 67, n. 3, March 1979, pp. 397-427. + + [DSS] National Institute of Standards and Technology, "Digital + Signature Standard," NIST FIPS PUB 186, U.S. Department of + Commerce, May 1994. + + [HMAC] Krawczyk, Bellare, Canetti, "HMAC: Keyed-Hashing for Message + Authentication", RFC 2104, IBM, UCSD, February 1997. + + [HMAC-TEST] Cheng, Glenn, "Test Cases for HMAC-MD5 and HMAC-SHA-1", + RFC 2202, IBM, NIST, September 1997. + + [IMAP4] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, University of Washington, December 1996. + + [KEYWORDS] Bradner, "Key words for use in RFCs to Indicate + Requirement Levels", RFC 2119, Harvard University, March 1997. + + + + +Newman [Page 16] + +Internet Draft PASSDSS-3DES-1 SASL Mechanism March 1998 + + + [Orm96] Orman, H., "The Oakley Key Determination Protocol", version + 1, TR97-92, Department of Computer Science Technical Report, + University of Arizona. + + [RANDOM] Eastlake, Crocker, Schiller, "Randomness Recommendations + for Security", RFC 1750, DEC, Cybercash, MIT, December 1994. + + [SASL] Myers, "Simple Authentication and Security Layer (SASL)", + RFC 2222, Netscape Communications, October 1997. + + [SCHNEIER] Schneier, B., "Applied Cryptography: Protocols, + Algorithms and Source Code in C," John Wiley and Sons, Inc., 1996. + + [SCRAM] Newman, "Salted Challenge Response Authentication Mechanism + (SCRAM)", work in progress, January 1998. + + [SHA1] NIST FIPS PUB 180-1, "Secure Hash Standard," National + Institute of Standards and Technology, U.S. Department of Commerce, + April 1995. + + [SHORT-EXP] van Oorschot, P., Wiener, M., "On Diffie-Hellman Key + Agreement with Short Exponents", Advances in Cryptography -- + EUROCRYPT Springer-Verlag, ISBN 3-540-61186-X, pp. 332-343. + + [SSH-ARCH] Ylonen, Kivinen, Saarinen, "SSH Protocol Architecture", + Work in progress, SSH, October 1997. + + [SSH-TRANS] Ylonen, Kivinen, Saarinen, "SSH Transport Layer + Protocol", Work in progress, SSH, October 1997. + + [TIMING] Kocher, P., "Timing Attacks on Implementations of Diffie- + Hellman, RSA, DSS and Other Systems", Advances in Cryptography -- + CRYPTO '96 Proceedings, Lecture Notes in Computer Science, Vol + 1109, Springer-Verlag, ISBN 3-540-61512-1, pp. 104-113. + + [TLS] Dierks, Allen, "The TLS Protocol Version 1.0", Work in + progress. + + [UTF8] Yergeau, "UTF-8, a transformation format of ISO 10646", + RFC 2279, Alis Technologies, January 1998. + + + + + + + + + + + +Newman [Page 17] + +Internet Draft PASSDSS-3DES-1 SASL Mechanism March 1998 + + +11. Author's Address + + Chris Newman + Innosoft International, Inc. + 1050 Lakes Drive + West Covina, CA 91790 USA + + Email: chris.newman@innosoft.com + +Appendix A. Algorithm Overview + + This section provides a quick overview of the algorithms used. For + a full understanding, the reader is encouraged to read "Applied + Cryptography" [SCHNEIER]. The follow descriptions are paraphrased + from that source. + + Note that an overview of the DES algorithm is not included as + publicly available implementations and descriptions are very + common. + +Appendix A.1. DSA Algorithm + + The DSA algorithm is a public key algorithm which can be used to + sign messages such that the source can be verified using a public + key. The algorithm has the following parameters: + + p is a prime number L bits long. Implementations MUST support L + between 512 and 1024 bits. + + q is a 160-bit prime factor of (p - 1). + + (p - 1)/q + g = h mod p where h is any number less than p - 1 such + + (p - 1)/q + that h is greater than 1. + + x is a number less than q and represents the private key. + + x + y = g mod p and represents the public key. + + To sign a message m, the client generates a random number k less + than q and computes: + + k + r = (g mod p) mod q + + + + +Newman [Page 18] + +Internet Draft PASSDSS-3DES-1 SASL Mechanism March 1998 + + + -1 + s = (k (SHA1(m) + xr)) mod q + + The signature is represented as r and s, and is verified as + follows: + + -1 + w = s mod q + + u1 = (SHA1(m) * w) mod q + + u2 = (rw) mod q + + u1 u2 + v = ((g * y ) mod p) mod q + + If v = r then the signature is verified. + +Appendix A.2. Diffie-Hellman Algorithm + + The Diffie-Hellman algorithm is a key-exchange algorithm. It + allows two ends of a communications channel to establish a shared + secret which a passive eavesdropper can not easily determine. This + key can then be used in a symmetric algorithm such as triple-DES. + The two ends have a prior agreement on two numbers: + + n a large prime number + + g a primitive mod n. + + The client chooses a random large integer x and computes: + + x + X = g mod n + + and sends X to the server. The server chooses a random large + integer y and computes: + + y + Y = g mod n + + y + K = X mod n + + The server sends Y to the client. The client computes: + + x + K = Y mod n + + + +Newman [Page 19] + +Internet Draft PASSDSS-3DES-1 SASL Mechanism March 1998 + + + At this point, the client and server share the same secret K. + +Appendix A.3. Triple-DES Algorithm in EDE/outer-CBC Mode + + The DES algorithm uses an 8 octet (64 bit) key of which 56 bits are + significant. The triple-DES EDE algorithm uses a 24 octet (192 + bit) key of which roughly 112 bits are significant see [SCHNEIER] + for more details. The "EDE" refers to encrypt-decrypt-encrypt, and + the "CBC" refers to cipher-block-chaining where each cipher block + affects future cipher blocks. If E() is the DES encryption + function, D() is the DES decryption function, C is a cipher text + block and P is a plain-text block, then triple-DES EDE in CBC mode + with outer chaining is: + + C = E (D (E (P XOR C ))) + i K3 K2 K1 i i-1 + + NOTE: C is the initialization vector + 0 + + and the decryption function is: + + P = C XOR D (E (D (C ))) + i i-1 K3 K2 K1 i + + K1 is the first 8 octets of the triple-DES key, K2 is the second 8 + octets and K3 is the final 8 octets. + +Appendix A.4. HMAC-SHA-1 Keyed hash function + + HMAC-SHA-1 uses the SHA-1 hash function to create a keyed hash + function suitable for use as an integrity protection function. A + more complete description is in [HMAC]. A brief summary of the + algorithm follows: + + (A) If the key is longer than 64 octets, it is run through the + SHA-1 function to produce a 20 octet key. + + (B) The key is exclusive-ored with a 64 octet buffer filled with + the octet value 0x36. + + (C) SHA-1 is computed over (B) followed by the input text. + + (D) The key is exclusive-ored with a 64 octet buffer filled with + the octet value 0x5C. + + (E) SHA-1 is computed over (D) followed by the output of (C). + + + + +Newman [Page 20] diff --git a/doc/specification/draft-newman-telnet-sasl-01.txt b/doc/specification/draft-newman-telnet-sasl-01.txt new file mode 100644 index 0000000..40dd6bc --- /dev/null +++ b/doc/specification/draft-newman-telnet-sasl-01.txt @@ -0,0 +1,450 @@ + + + + + + +Network Working Group C. Newman +Internet Draft: Telnet SASL Option Innosoft +Document: draft-newman-telnet-sasl-01.txt November 1998 + + + Telnet SASL Option + + +Status of this memo + + This document is an Internet-Draft. Internet-Drafts are working + documents of the Internet Engineering Task Force (IETF), its areas, + and its working groups. Note that other groups may also distribute + working documents as Internet-Drafts. + + Internet-Drafts are draft documents valid for a maximum of six + months and may be updated, replaced, or obsoleted by other + documents at any time. It is inappropriate to use Internet-Drafts + as reference material or to cite them other than as "work in + progress." + + To view the entire list of current Internet-Drafts, please check + the "1id-abstracts.txt" listing contained in the Internet-Drafts + Shadow Directories on ftp.is.co.za (Africa), ftp.nordu.net + (Europe), munnari.oz.au (Pacific Rim), ftp.ietf.org (US East + Coast), or ftp.isi.edu (US West Coast). + +Abstract + + It is common today for Internet client software to implement + multiple Internet protocols. SASL [SASL] provides an + authentication framework which permits multi-protocol clients and + servers to reuse security-sensitive authentication code. This memo + defines a SASL profile for the Telnet [TELNET] protocol. + + This proposal will be discussed on the telnet-ietf mailing list. + To subscribe, send the word "subscribe" to + . + +1. Conventions Used in this Document + + The key words "REQUIRED", "MUST", "MUST NOT", "SHOULD", "SHOULD + NOT", and "MAY" in this document are to be interpreted as described + in "Key words for use in RFCs to Indicate Requirement Levels" + [KEYWORDS]. + + In examples, "C:" and "S:" indicate data sent by the client (end + which does a TCP active option) and server (end which does a TCP + + + +Newman [Page 1] + +Internet Draft Telnet SASL Option November 1998 + + + passive open) respectively. + +2. Background for this Proposal + + Telnet has its own single-protocol authentication framework defined + in "Telnet Authentication Option" [TELNET-AUTH] which predates SASL + [SASL]. This old Telnet authentication option and the associated + encryption option [TELNET-ENC] do not provide integrity protection + facilities, machine parsible error codes (e.g. to alert the client + of an expired passphrase), or a way to integrate GSSAPI [GSSAPI] + into Telnet. + + Adding SASL and using it for new authentication mechanisms will + improve reuse of security-sensitive code in multi-protocol clients + in addition to addressing the other issues. While it would be + possible to layer SASL support on top of the existing + authentication option, it could result in an extra round-trip and + would have potentially confusing interactions with the modifiers + field in the Telnet authentication option. + +3. Kerberos Compatibility + + Both SASL and the old Telnet authentication option offer Kerberos + V4 mechanisms. It is usually not desirable to deploy two + incompatible mechanisms for the same function, however, the + KERBEROS_V4 SASL mechanism is more resistant to reply attacks and + provides integrity services. Currently deployed Kerberos V4 Telnet + implementations have no integrity protection and the encryption + service is subject to an active down negotiation attack. + + Implementations which offer support for the KERBEROS_V4 SASL + mechanism SHOULD also implement the old Telnet authentication + option Kerberos v4 mechanism. This will provide better + interoperability with deployed implementations. When both options + are available, the KERBEROS_V4 SASL mechanism SHOULD be used in + preference to the old Telnet authentication mechanism, unless + encryption without integrity protection is desired. + + Both the SASL GSSAPI mechanism and the old Telnet authentication + option offer Kerberos V5 mechanisms. The only difference is that + the SASL GSSAPI Kerberos 5 mechanism includes integrity protection + not available via the old authentication and encryption options. A + server supporting Kerberos V5 SHOULD implement the old Kerberos V5 + authentication option for backwards compatibility. + +4. SASL Telnet Option + + The GSSAPI/SASL service name for this profile of SASL is "rcmd". + + + +Newman [Page 2] + +Internet Draft Telnet SASL Option November 1998 + + + The SASL Telnet option is Telnet option number XXX. It has the + following subnegotiation options: + + LIST 0 + START 1 + STEP 2 + CANCEL 3 + DONE 4 + + The DONE subnegotiation option has the following codes: + + SUCCESS 0 + CANCELLED 1 + BADAUTH 2 + BADPROT 3 + NOTAUTHZ 4 + EXPIRED 5 + ENCRYPT 6 + TOOWEAK 7 + TRANS 8 + DISABLED 9 + + The SASL Telnet option is negotiated only one way. The server asks + the client to use SASL with "DO SASL" and the client announces + support with a "WILL SASL" message. Once the option is + successfully negotiated, the server sends the LIST subnegotiation + containing an ASCII string with a space separated list of available + SASL mechanisms: + + S: IAC DO SASL + C: IAC WILL SASL + S: IAC SB SASL LIST "KERBEROS_V4 GSSAPI CRAM-MD5 OTP" IAC SB + + The client sends the START subnegotiation to begin a SASL exchange + with the server. The START subnegotiation contains the desired + mechanism name optionally followed by an ASCII NUL character and an + initial client response. The client is not required to wait for + the LIST message from the server prior to sending a START message. + + C: IAC SB SASL START "CRAM-MD5" IAC SE + + This is followed by a series of STEP messages containing SASL + messages for the client and server respectively: + + S: IAC SB SASL STEP + "<1896.697170952@postoffice.reston.mci.net>" IAC SE + C: IAC SB SASL STEP "tim b913a602c7eda7a495b4e6e7334d3890" IAC SE + + + + +Newman [Page 3] + +Internet Draft Telnet SASL Option November 1998 + + + Note that it is important to perform IAC doubling if the octet + value 255 occurs in any SASL data. This applies to data in the + START, STEP and DONE suboptions. + + When a client receives a STEP message from the server, it MAY + cancel the authentication with the CANCEL message. The server will + respond with a DONE CANCELLED message. If the client wishes to + begin a new authentication, it MAY send a START message without + waiting for the server DONE CANCELLED message. + + C: IAC SB SASL CANCEL IAC SE + S: IAC SB SASL DONE CANCELLED IAC SE + + The server indicates successful completion of the exchange by + sending the DONE subnegotiation with SUCCESS status, which MAY + contain final server authentication data (usually for mutual + authentication purposes). + + S: IAC SB SASL DONE SUCCESS IAC SE + + If a SASL security layer is negotiated, it begins on the server end + immediately after the DONE SUCCESS subnegotiation, and begins on + the client end immediately after the last client START or STEP + subnegotiation once the SUCCESS subnegotiation is received. + + For those cases where a security layer including integrity + protection is negotiated, the server SHOULD send another LIST + suboption message matching the one initially sent. If the client + supports any stronger authentication mechanism, it SHOULD verify + that the new LIST suboption matches the one sent prior to + authentication. + + The server indicates failure by sending the DONE message with a + code other than SUCCESS, followed by a human readable string in the + character set currently active on the Telnet channel. If no + character set has been negotiated through prior agreement or the + Telnet CHARSET option [TELNET-CHARSET], then UTF-8 [UTF-8] is + assumed. + + S: IAC SB SASL DONE BADAUTH "Authentication Failed" IAC SE + + The following error codes are defined by this specification. When + in doubt of the appropriate error code, the BADAUTH error code + should be used. Additional error codes MAY be defined by future + standards track or IESG approved experimental RFCs. + + CANCELLED + The authentication was cancelled by the client. + + + +Newman [Page 4] + +Internet Draft Telnet SASL Option November 1998 + + + BADAUTH + This indicates that the user does not exist or the + authentication failed for a reason other than those listed + below. + + BADPROT + This indicates the client attempted to use a mechanism not + supported by the server, or the protocol for the SASL + mechanism was not followed. + + NOTAUTHZ + This indicates the client successfully authenticated, but is + not authorized to login to the service with the requested SASL + authorization identity. + + EXPIRED + This indicates that the client passphrase, public key + certificate or other credential has expired and can be updated + with an appropriate passphrase/credential change protocol. + + ENCRYPT + This indicates that the requested client mechanism is not + permitted without an encryption layer, such as that provided + by TLS. The client may activate such encryption, or try a + stronger mechanism. + + TOOWEAK + This indicates that security policy does not permit the + requested user to use the requested mechanism. For example, + an administrative user might be required to use a stronger + mechanism. + + TRANS + This indicates the user has a valid verifier in a server + authentication database but the requested mechanism can not be + used with that verifier. This also indicates that if the + client changes the passphrase or does a one-time + authentication with a clear-text passphrase mechanism + (preferably encrypted), then the appropriate authentication + database for the requested mechanism will be initialized. + + DISABLED + This indicates that the user's account has been disabled. The + user must contact a system administrator to get their account + re-enabled. + + + + + + +Newman [Page 5] + +Internet Draft Telnet SASL Option November 1998 + + +5. Formal Syntax + + The following formal syntax uses ABNF [ABNF]: + + IAC = %d255 ; standard Telnet symbols + DO = %d253 + WILL = %d251 + SB = %d250 + SE = %d240 + SASL = %dXXX ; Telnet SASL option + LIST = %d0 ; Telnet SASL sub-options + START = %d1 + STEP = %d2 + CANCEL = %d3 + DONE = %d4 + + ; Miscellaneous single-character symbols + DIGIT = %d30-39 ; US-ASCII digit character + UPALPHA = %d65-90 ; Uppercase alphabetic characters + MECH-CHAR = %d65-90 / DIGIT / "-" / "_" + SAFE-DATA = %d0-254 ; octets which don't need quoting + TEXT = %d1-254 ; human readable text + SP = %d32 ; US-ASCII space + NUL = %d0 ; US-ASCII NUL + + ; Miscellaneous multi-character symbols + quoted-255 = %d255 %d255 + sasl-mech = 1*20mech-char + subopt-data = SAFE-DATA / quoted-255 + text = *subopt-data ; human readable text + sasl-data = *subopt-data + success = %d0 sasl-data + error = %d1-254 text + + ; Telnet SASL messages + sasl-do = IAC DO SASL + sasl-will = IAC WILL SASL + sasl-list = IAC SB SASL LIST *(sasl-mech SP) sasl-mech IAC SE + sasl-start = IAC SB SASL START sasl-mech [NUL sasl-data] IAC SE + sasl-step = IAC SB SASL STEP sasl-data IAC SE + sasl-cancel = IAC SB SASL CANCEL IAC SE + sasl-done = IAC SB SASL DONE (success / error) IAC SE + +6. Security Considerations + + This inherits the security considerations of SASL [SASL] and any + underlying mechanism used. + + + + +Newman [Page 6] + +Internet Draft Telnet SASL Option November 1998 + + + The SASL LIST subnegotiation is not integrity protected and is thus + susceptible to tampering by an active attacker. There are two ways + to mitigate this attack: (1) have the client explicitly configured + to use a specific mechanism and never fall back to a weaker one. + (2) have the client configurable to require integrity protection, + and verify that the LIST suboption value is the same both before + and after the integrity protection is applied. + + With some SASL mechanisms, the ENCRYPT or TOOWEAK error codes will + be generated after sensitive information has been exposed. For + this reason, clients SHOULD be configurable to disable weaker + mechanisms which might reveal sensitive information and SHOULD do + so for user, mechanism and server combinations which result in + these error codes. + + The TRANS error code could be spuriously generated by an active + attacker. For this reason, the client SHOULD NOT use a weaker + mechanism in response to a TRANS error code without explicit user + permission. The TRANS error code can also be used to probe for + untransitioned users at a site. For this reason, sites must + consider the tradeoffs between a user-friendly transition to a + stronger mechanism and the risks entailed by permitting such + transitions. + + Telnet server and client implementations MUST check for buffer + overrun on Telnet subnegotiations and deal with more data than will + fit in an internal buffer gracefully. + +7. References + + [ABNF] Crocker, Overell, "Augmented BNF for Syntax Specifications: + ABNF", RFC 2234, Internet Mail Consortium, Demon Internet Ltd, + November 1997. + + [CRAM-MD5] Klensin, Catoe, Krumviede, "IMAP/POP AUTHorize Extension + for Simple Challenge/Response", RFC 2195, MCI, September 1997. + + [GSSAPI] Linn, "Generic Security Service Application Program + Interface, Version 2", RFC 2078, OpenVision Technologies, January + 1997. + + [KEYWORDS] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", RFC 2119, Harvard University, March 1997. + + [OTP-SASL] Newman, C., "The One-Time-Password SASL mechanism", RFC + 2444, Innosoft, October 1998. + + + + + +Newman [Page 7] + +Internet Draft Telnet SASL Option November 1998 + + + [SASL] Myers, "Simple Authentication and Security Layer (SASL)", + RFC 2222, Netscape Communications, October 1997. + + [TELNET] Postel, J., Reynolds, J., "TELNET PROTOCOL SPECIFICATION", + RFC 854, ISI, May 1983. + + [TELNET-AUTH] Borman, "Telnet Authentication Option", RFC 1416, + Cray Research, Inc., February 1993. + + [TELNET-CHARSET] Gellens, R., "TELNET CHARSET Option", RFC 2066, + Unisys, January 1997. + + [TELNET-ENC] Ts'o, T., "Telnet Data Encryption Option", work in + progress. + + [TELNET-KRB] Borman, "Telnet Authentication: Kerberos Version 4", + RFC 1411, Cray Research, Inc., January 1993. + + [UTF-8] Yergeau, F. "UTF-8, a transformation format of ISO 10646", + RFC 2279, Alis Technologies, January 1998. + +8. Author's Address + + Chris Newman + Innosoft International, Inc. + 1050 Lakes Drive + West Covina, CA 91790 USA + + Email: chris.newman@innosoft.com + + + + + + + + + + + + + + + + + + + + + + +Newman [Page 8] diff --git a/doc/specification/draft-overell-roaming-elgamal-sasl-00.txt b/doc/specification/draft-overell-roaming-elgamal-sasl-00.txt new file mode 100644 index 0000000..60ee5e0 --- /dev/null +++ b/doc/specification/draft-overell-roaming-elgamal-sasl-00.txt @@ -0,0 +1,300 @@ + + +Network Working Group P. Overell +Internet Draft: ROAMING-ELGAMAL Demon Internet Ltd +Document: draft-overell-roaming-elgamal-sasl-00.txt February 1998 + Expires: August 1998 + + + ROAMING-ELGAMAL SASL Authentication Mechanism + +Status of this Memo + + This document is an Internet-Draft. Internet-Drafts are working + documents of the Internet Engineering Task Force (IETF), its + areas, and its working groups. Note that other groups may also + distribute working documents as Internet-Drafts. + + Internet-Drafts are draft documents valid for a maximum of six + months and may be updated, replaced, or obsoleted by other + documents at any time. It is inappropriate to use Internet- + Drafts as reference material or to cite them other than as + "work in progress." + + To view the entire list of current Internet-Drafts, please check + the "1id-abstracts.txt" listing contained in the Internet-Drafts + Shadow Directories on ftp.is.co.za (Africa), ftp.nordu.net + (Europe), munnari.oz.au (Pacific Rim), ds.internic.net (US East + (Coast), or ftp.isi.edu (US West Coast). + +Abstract + + ROAMING-ELGAMAL is an SASL [SASL] authentication mechanism in which + ElGamal [ELG] public key cryptography is used to encrypt the persona + and password thus giving a high degree of security. + + Although specifically designed for the Simple Roaming Authentication + Protocol [SRAP], ROAMING-ELGAMAL is intended to be a registered SASL + mechanism and so could be adapted to other protocols. The mechanism + has been designed to resist attack from interception, man in the + middle, and replay. The security of the mechanism rests with the + protection of the private key. + +1. Conventions Used in this Document + + In SASL terminology "server" means the authenticator and "client" + means the authenticatee. Data from the server to the client is a + "challenge", data from the client to the server is a "response". + + All syntax is specified using ABNF [ABNF] and its core definitions. + + + + + +Overell [Page 1] + + + +Internet Draft ROAMING-ELGAMAL February 1998 + + + + +2. ROAMING-ELGAMAL Mechanism + + The SASL authentication type associated with ROAMING-ELGAMAL is + "ROAMING-ELGAMAL". + + This memo is only concerned with authentication, however, a security + layer could be easily added either by continuing to use ElGamal + encryption for the remainder of the conversation; or by using a + symmetric cipher with a session key derived from the calculated + value of y^k, a value known to both parties only after + authentication is complete. + +2.1 Initial Server Challenge + + The data encoded in the initial challenge is a persona, a + fingerprint and a cookie. + + The persona indicates which persona/password pair the server is + seeking authentication for. If no persona is specified (zero size) + then the client may choose either to return any of its + persona/passwords or fail the command. If the persona is specified + but not recognized then the client SHOULD fail the command. An + implementation MAY choose the persona to be the same as a "username" + or "user id" but this memo does not require this interpretation. + + The fingerprint indicates which public key the client should use to + encrypt its response. The fingerprint MAY be the MD5 or SHA-1 of + the public key as per PGP, but this memo does not require this + interpretation. + + The cookie is a presumptively arbitrary string of random octets. + The cookie should be unique and unpredictable, preferably a + cryptographically strong random number. Its purpose is to defeat + replay attack. + + This memo does not define the length or content of the persona, + fingerprint or cookie. To permit any octet to be used each element + is preceded by its size in octets expressed as a number in text + enclosed in braces. The encoding used is defined by the host + protocol. + + Syntax + + unencoded-challenge = size persona size fingerprint size cookie + + persona = *OCTET + + fingerprint = *OCTET + + + + +Overell [Page 2] + + + +Internet Draft ROAMING-ELGAMAL February 1998 + + + + + cookie = *OCTET + + size = "{" 1*DIGIT "}" + + Example (fictitious) + + {4}paul{32}AB246508F5217B54C77D3400239BCA45{16}9723763476348973 + +2.2 Client's Response + + If the client wishes to proceed then it responds with an encoded + string of the ElGamal encrypted string of the PKCS#1 [PKCS#1] packed + string consisting of the client's persona, password and the server's + cookie. The server's public key is used for the encryption. This + memo does not describe how the client may obtain the server's public + key. The encoding used is defined by the host protocol + + This memo places no restriction whatsoever on the content or length + of persona, password or cookie. In the unpacked-response each + element is preceded by its size in octets expressed as a number in + text enclosed in braces. + + Syntax + + persona = *OCTET + + password = *OCTET + + cookie = *OCTET + + size = "{" 1*DIGIT "}" + + unpacked-response = size persona size password size cookie + + packed-response = %x00 %x02 8*padding %x00 unpacked-response + + padding = %x01-FF + + Example (fictitious) + + {4}paul{8}sausages{20}b_basdlwyweyfbc73m8f + +2.2.1 Packing and Encryption + + Let L be the length in octets of the ElGamal encryption modulus. + + If the length of the unpacked-response is greater than L - 11 octets + then the unpacked-response is split into sections, each of which + must be less than or equal to L - 11 octets long. + + + +Overell [Page 3] + + + +Internet Draft ROAMING-ELGAMAL February 1998 + + + + + Each unpacked-response-section is then packed according to [PKCS#1] + by preceding the unpacked-response-section with octet 0, octet 2, a + padding string, and an octet 0. The padding string consists of at + least eight non-zero random octets. The total length of the packed + form is the same as the length of the ElGamal encryption modulus. + + To encrypt a packed-response-section + + Given the client's public key (p, g, y) where p is the prime modulus + and y = g^x mod p where x is the private key. + + M is the packed-response-section considered to be an integer with + the first octet being the most significant. + + Pick a random number k + + a = g^k mod p + + b = y^k M mod p + + The encrypted-response-section is ab. These two numbers are + expressed as string consisting of two multiprecision fields as + defined in [PGPFormat]. + + Definition. A multiprecision field is the concatenation of two + fields: + + (a) a whole number field of length 2, with value B; + (b) a whole number field, with value V. + + Field (b) is of length [(B+7)/8], i.e., the greatest integer + which is no larger than (B+7)/8. The value of the + multiprecision field is defined to be V. V must be between + 2^{B-1} and 2^B - 1 inclusive. In other words B must be exactly + the number of significant bits in V. + + The encrypted-response is formed by concatenating all of the + encrypted-response-sections. + + The encrypted-response is then encoded according to the host + protocol. + +2.3 Authentication + + The server then decodes, decrypts and unpacks the string and then + verifies the persona, password and cookie. If correct the client is + deemed to be authenticated. + + + + + +Overell [Page 4] + + + +Internet Draft ROAMING-ELGAMAL February 1998 + + + + + ElGamal decryption is given by + + M = b/a^x mod p + +3. References + + [ABNF] RFC2234, "Augmented BNF for syntax specifications: ABNF", + D. Crocker and P. Overell, November 1997. + + [ELG] "A Public-Key Cryptosystem and a Signature Scheme Based + on Discrete Logarithms". T. ElGamal, IEEE Transactions + on Information Theory, v. IT-31, n. 4, 1985, pp. 469-472. + + [PGPForm] RFC1991, "PGP Message Exchange Formats". D. Atkins et + al. August 1996. + + [PKCS#1] RSA Data Security, Inc. Public-Key Cryptography + Standards (PKCS). PKCS #1, "RSA Encryption Standard". + An RSA Laboratories Technical Note, version 1.5, revised + November 1, 1993. + + [SASL] RFC2222, "Simple Authentication and Security Layer + (SASL)". J. Myers, Netscape Communications, October + 1997. + + [SRAP] Work in progress, "Simple Roaming Authentication + Protocol", P. Overell, Demon Internet Ltd. February 1998 + +4. Security Considerations + + The use of ElGamal public key encryption together with a + cryptographically strong cookie should make this mechanism resistant + to interception, man in the middle and replay attacks. + +5. Author's Address + + P. Overell + Demon Internet Ltd + Dorking Business Park + Dorking + Surrey + RH4 1HN + UK + + mailto:paulo@turnpike.com + + + + + + + +Overell [Page 5] + diff --git a/doc/specification/draft-sasl-login.txt b/doc/specification/draft-sasl-login.txt new file mode 100644 index 0000000..5449b68 --- /dev/null +++ b/doc/specification/draft-sasl-login.txt @@ -0,0 +1,33 @@ +Here is the specification for LOGIN: + +LOGIN mechanism + + The mechanism name associated with the LOGIN mechanism is "LOGIN". + The authorization identity is the same string as the "user name" in + the traditional (non-SASL) LOGIN or USER commands; the authorization + authenticator is the same string as the traditional "password". + +1. Client side of authentication protocol exchange + + The client expects the server to issue a challenge. The client then + responds with the authorization identity. The client then expects + the server to issue a second challenge. The client then responds + with the authorization authenticator. The contents of both challenges + are ignored. + + This completes the client-side LOGIN authentication. + +2. Server side of authentication protocol exchange + + The server issues a string which SHOULD be "User Name" in challenge, + and receives a client response. This response is recorded as the + authorization identity. The server then issues a string which SHOULD + be "Password" in challenge, and receives a client response. This + response is recorded as the authorization authenticator. The server + must verify that the authorization authenticator permits login as the + authorization identity. + +3. Security layer + + There are no security layers in the LOGIN mechanism. + diff --git a/doc/specification/draft-weltman-java-sasl-05.txt b/doc/specification/draft-weltman-java-sasl-05.txt new file mode 100644 index 0000000..61a6347 --- /dev/null +++ b/doc/specification/draft-weltman-java-sasl-05.txt @@ -0,0 +1,2043 @@ + + +Network Working Group Rosanna Lee +INTERNET-DRAFT Sun Microsystems +Intended Category: Standards Track Rob Weltman + Coscend Corp. + May, 2001 + + + The Java SASL Application Program Interface + draft-weltman-java-sasl-05.txt + + +Status of this Memo + + This document is an Internet-Draft and is in full conformance with + all provisions of Section 10 of RFC2026. + + Internet-Drafts are working documents of the Internet Task Force + (IETF), its areas, and its working groups. Note that other groups + may also distribute working documents as Internet-Drafts. + + Internet-Drafts are draft documents valid for a maximum of six months + and may be updated, replaced, or obsoleted by other documents at any + time. It is inappropriate to use Internet Drafts as reference + material or to cite them other than as "work in progress." + + The list of current Internet-Drafts can be accessed at + http://www.ietf.org/ietf/1id-abstracts.txt + + The list of Internet-Draft Shadow Directories can be accessed at + http://www.ietf.org/shadow.html. + + +Abstract + + This document defines a client-side and a server-side Java language + interface for using the Simple Authentication and Security Layer + (SASL) mechanisms for adding authentication support to connection- + based protocols. The interface promotes sharing of SASL Mechanism + Drivers and security layers between applications using different + protocols. It complements but does not replace [SASL], which defines + and exemplifies use of the SASL protocol in a language-independent + way. + + + + + + + + + + + + + +Expires November 2001 [Page 1] + +JAVA SASL API May, 2001 + + + +1. Introduction....................................................4 +2. Overview of the SASL classes....................................6 +2.1 Interfaces.....................................................6 +2.2 Classes........................................................7 +3. Overview of SASL API Use........................................7 +4. The Java SASL classes...........................................9 +4.1 public class Sasl..............................................9 +4.1.1 createSaslClient...............................................9 +4.1.2 setSaslClientFactory..........................................11 +4.1.3 createSaslServer..............................................11 +4.1.4 setSaslServerFactory..........................................12 +4.1.5 getSaslClientFactories........................................13 +4.1.6 getSaslServerFactories........................................13 +4.1.7 Standard Properties...........................................14 +4.2 public interface SaslClient...................................16 +4.2.1 evaluateChallenge.............................................16 +4.2.2 hasInitialResponse............................................17 +4.2.3 isComplete....................................................17 +4.2.4 unwrap........................................................17 +4.2.5 wrap..........................................................18 +4.2.6 getMechanismName..............................................18 +4.2.7 getNegotiatedProperty.........................................18 +4.2.8 dispose.......................................................19 +4.3 public interface SaslClientFactory............................19 +4.3.1 createSaslClient..............................................19 +4.3.2 getMechanismNames.............................................20 +4.4 public interface SaslServer...................................21 +4.4.1 evaluateResponse..............................................21 +4.4.2 isComplete....................................................21 +4.4.3 unwrap........................................................22 +4.4.4 wrap..........................................................22 +4.4.5 getMechanismName..............................................23 +4.4.6 getAuthorizationID............................................23 +4.4.7 getNegotiatedProperty.........................................23 +4.4.8 dispose.......................................................24 +4.5 public interface SaslServerFactory............................24 +4.5.1 createSaslServer..............................................24 +4.5.2 getMechanismNames.............................................25 +4.6 public class AuthorizeCallback................................25 +4.6.1 Constructors..................................................26 +4.6.2 getAuthenticationID...........................................26 +4.6.3 getAuthorizationID............................................26 +4.6.4 isAuthorized..................................................26 +4.6.5 setAuthorized.................................................26 +4.6.6 getAuthorizedID...............................................26 +4.6.7 setAuthorizedID...............................................27 +4.7 public class RealmCallback....................................27 +4.7.1 Constructors..................................................27 +4.8 public class RealmChoiceCallback..............................27 +4.8.1 Constructors..................................................28 +4.9 public class SaslException extends IOException................28 +4.9.1 Constructors..................................................28 + +Expires November 2001 [Page 2 + +JAVA SASL API May, 2001 + + +4.9.2 getCause......................................................29 +4.9.3 printStackTrace...............................................29 +5. Security Considerations........................................30 +6. Copyright......................................................30 +7. Bibliography...................................................30 +8. Authors' Addresses.............................................31 +9. Acknowledgements...............................................31 +10. Changes from draft-weltman-java-sasl-04.txt....................31 +11. Changes from draft-weltman-java-sasl-03.txt....................32 +12. Changes from draft-weltman-java-sasl-02.txt....................32 +13. Appendix A - Sample Java LDAP program using SASL...............34 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Expires November 2001 [Page 3 + +JAVA SASL API May, 2001 + + +1. Introduction + + See [SASL], section 3, for an introduction to and overview of the + SASL framework for authentication and negotiation of a security + layer. The following presents an outline of the concepts. + + --------------- ------------------- ----------------- + | Application |-----| Protocol Driver |------| MD5 | + --------------- ------------------- | ----------------- + | + | ----------------- + |--| Kerberos v5 | + | ----------------- + | + | ----------------- + |--| PKCS-11 | + | ----------------- + | + | + | + | - - - - - - - - - + |--| xxxYYYxxx | + - - - - - - - - - + + An application chooses a Protocol Driver specific to the protocol it + wants to use, and specifies one or more acceptable mechanisms. The + Protocol Driver controls the socket, and knows the format/packaging + of bytes sent down and received from the socket, but does not know + how to authenticate or to encrypt/ decrypt the bytes. It uses one of + the Mechanism Drivers to help it perform authentication. The Protocol + Driver examines each byte string received from the server during the + authentication in a protocol-specific way to determine if the + authentication process has been completed. If not, the byte string is + passed to the Mechanism Driver to be interpreted as a server + challenge; the Mechanism Driver returns an appropriate response, + which the Protocol Driver can encode in a protocol-specific way and + return to the server. + + If the Protocol Driver concludes from the byte string received from + the server that authentication is complete, it may query the + Mechanism Driver if it considers the authentication process complete, + in order to thwart early completion messages inserted by an intruder. + + On completed authentication, the Protocol Driver may use the + Mechanism Driver to encode and decode any data exchanged through the + socket if a security layer was negotiated. + + A complication here is that some authentication methods may require + additional user/application input. That means that a Mechanism + Driver may need to call up to an application during the + authentication process. To satisfy this requirement, the application + can supply a javax.security.auth.callback.CallbackHandler instance + + +Expires November 2001 [Page 4 + +JAVA SASL API May, 2001 + + + [JAAS] that can be used by the Mechanism Driver to prompt the user + for additional input. + + Protocol Drivers are protocol-dependent and may be built in to a + protocol package or an application. There is a generalized framework + for registering and finding Mechanism Drivers. The framework uses a + factory to produce an appropriate Mechanism Driver. The factory may + be preconfigured, explicitly specified by the caller, specified as a + list of packages by the caller, or be identified based on a list of + packages in the System properties. + + The Mechanism Drivers are protocol-independent, and don't deal + directly with network connections, just byte arrays, so they can be + implemented in a generalizable way for all protocols. + + The negotiated security layer is implemented by encoding and decoding + routines in the Mechanism Driver, using parameters and resolutions + reached during authentication. + + Different Mechanism Drivers may require different parameters to carry + out the authentication process. This is handled by passing a + java.util.Hashtable object as an argument to instantiation methods. + + In the following discussion, 'client' refers to the client-side + Protocol Driver that is using the SASL mechanism while 'server' + refers to the server-side Protocol Driver that is using the SASL + mechanism. + + + + + + + + + + + + + + + + + + + + + + + + + + + +Expires November 2001 [Page 5 + +JAVA SASL API May, 2001 + + + In the Java SASL environment, the SaslClient interface represents the + client's view of the Mechanism Driver, while the SaslServer interface + represents the server's view. + + --------------- --------------- + | Application |--+ +--| Server | + --------------- | | --------------- + | | + ------------------- ------------------- + | Protocol Driver |--+ <- - - - -> +--| Protocol Driver | + ------------------- | | ------------------- + | | + ------------------- ------------------- + | SaslClient | | SaslServer | + ------------------- ------------------- + | | + ----------------- | | ----------------- + | MD5 |----| |---| MD5 | + ----------------- | | ----------------- + | | + ----------------- | | ----------------- + | Kerberos v5 |----| |---| Kerberos v5 | + ----------------- | | ----------------- + | | + ----------------- | | ----------------- + | PKCS-11 |----| |---| PKCS-11 | + ----------------- | | ----------------- + | | + - - - - - - - - - | | - - - - - - - - - + | xxxYYYxxx |----+ +---| xxxYYYxxx | + - - - - - - - - - - - - - - - - - - + + A client using the Java SASL API may communicate with any server + implementing the SASL protocol, and a server may use the API to + process authentication requests from any client using the SASL + protocol. It is not required that both sides use the same language + bindings. + + +2. Overview of the SASL classes + + +2.1 Interfaces + + SaslClient Performs SASL authentication as a + client. + + SaslClientFactory An interface for creating instances of + SaslClient. It is not normally accessed + directly by a client, which will use the + Sasl static methods instead. However, a + particular environment may provide and + +Expires November 2001 [Page 6 + +JAVA SASL API May, 2001 + + + install a new or different + SaslClientFactory. + + SaslServer Performs SASL authentication as a + server. + + SaslServerFactory An interface for creating instances of + SaslServer. It is not normally accessed + directly by a server, which will use the + Sasl static methods instead. However, a + particular environment may provide and + install a new or different + SaslServerFactory. + + +2.2 Classes + + + Sasl A static class for creating SASL clients + and servers. It transparently locates + and uses any available + SaslClientFactory/SaslServerFactory + instances. + + AuthorizeCallback This callback is used by SaslServer to + determine whether one entity (identified + by an authenticated authentication id) + can act on behalf of another entity + (identified by an authorization id). + + RealmCallback This callback is used by SaslClient and + SaslServer to retrieve realm information. + + RealmChoiceCallback This callback is used by SaslClient and + SaslServer to obtain one or more realms + given a list of realm choices. + + SaslException Exception thrown on errors and failures + in the authentication process. + + +3. Overview of SASL API Use + + An application generally uses the SASL API as follows: + + - Create an object implementing the client authentication + callback interfaces, which can provide credentials when + required by the SaslClient. + + - Pass a list of acceptable or known Mechanisms and a callback + handler to Sasl.createSaslClient. The method returns an object + implementing SaslClient on success. + +Expires November 2001 [Page 7 + +JAVA SASL API May, 2001 + + + + + - Have the SaslClient object begin the authentication process by + providing an initial server response, if the protocol supports + an initial response. + + - Responses/challenges are exchanged with the server. If a + response indicates authentication has completed, SaslClient is + queried for validation, and methods for encoding and decoding + data according to the negotiated security layer may be invoked + on it. If not, the SaslClient is queried for an appropriate + next response to the server. This continues until + authentication has completed. + + - If a security layer has been negotiated, for the rest of the + session, messages to the server are first encoded by using + SaslClient before being written, and messages from the server + are first decoded by using SaslClient before being processed in + the application. + + + A server generally uses the SASL API as follows: + + - It receives a request from the client requesting authentication + for a particular SASL mechanism, accompanied by an optional + initial response. + + - It processes the initial response and generates a challenge + specific to the SASL mechanism to be sent back to the client if + the response is processed successfully. If the response is + not processed successfully, it sends an error to the client and + terminates the authentication session. + + - Responses/challenges are exchanged with the client. If the + server cannot successfully process a response, the server sends + an error to the client and terminates the authentication. If + the server has completed the authentication and has no more + challenges to send, it sends a success indication to the + client. + + - If the authentication has completed successfully, the server + extracts the authorization ID of the client from the SaslServer + instance (if appropriate) to be used for subsequent access + control checks. + + - For the rest of the session, messages to and from the client are + encoded and decoded by using SaslServer to implement the + negotiated security layer (if any). + + The following sections describe the SASL classes in more detail. + + + + +Expires November 2001 [Page 8 + +JAVA SASL API May, 2001 + + +4. The Java SASL classes + + +4.1 public class Sasl + +A class capable of providing a SaslClient or SaslServer. + + +4.1.1 createSaslClient + + public static SaslClient + createSaslClient(String[] mechanisms, + String authorizationID, + String protocol, + String serverName, + Hashtable props, + javax.security.auth.callback.CallbackHandler cbh) + throws SaslException + + Creates a SaslClient using the parameters supplied. It returns null + if no SaslClient can be created using the parameters supplied. Throws + SaslException if it cannot create a SaslClient because of an error. + + The algorithm for selection is as follows: + + 1. If a factory has been installed via setSaslClientFactory(), + invoke createSaslClient() on it. If the method invocation returns + a non-null SaslClient instance, return the SaslClient instance; + otherwise continue. + 2. Create a list of fully qualified class names using the package + names listed in the CLIENT_PKGS + ("javax.security.sasl.client.pkgs") property in props and the + class name ClientFactory. Each class name in this list identifies + a SaslClientFactory implementation. Starting with the first class + on the list, create an instance of SaslClientFactory using the + class' public no-argument constructor and invoke + createSaslClient() on it. If the method invocation returns a non- + null SaslClient instance, return it; otherwise repeat using the + next class on the list until a non-null SaslClient is produced or + the list is exhausted. + 3. Repeat the previous step using the CLIENT_PKGS + ("javax.security.sasl.client.pkgs") System property instead of + the property in props. + 4. As per the Java 2 Standard Edition version 1.3 service provider + guidelines, check for the existence of one of more files named + META-INF/services/javax.security.sasl.SaslClientFactory in the + classpath and installed JAR files. Each file lists the fully + qualified class names of the factories (i.e. implementations of + SaslClientFactory) found in the JAR files or classpath. Construct + a merged list of class names using these files and repeat Step 2 + using this list. If there are more than one of these files, the + + +Expires November 2001 [Page 9 + +JAVA SASL API May, 2001 + + + order in which they are processed is undefined. If no non-null + SaslClient instance is produced, return null. + + Parameters are: + + mechanisms The non-null list of mechanism names to try. Each + is the IANA-registered name of a SASL mechanism + (e.g. "GSSAPI", "CRAM-MD5"). + + authorizationID The possibly null protocol-dependent + identification to be used for authorization. If + null or empty, the server derives an + authorization ID from the client's authentication + credentials. When the SASL authentication + completes successfully, the specified entity is + granted access. + + protocol The non-null string name of the protocol for + which the authentication is being performed, e.g + "pop", "ldap". + + serverName The non-null fully qualified host name of the + server to authenticate to. + + props The possibly null set of properties used to + select the SASL mechanism and to configure the + authentication exchange of the selected + mechanism. For example, if props includes the + Sasl.POLICY_NOPLAINTEXT property with the value + "true", then the selected SASL mechanism must not + be susceptible to simple plain passive attacks. + + In addition to the standard properties of this + class, other, possibly mechanism-specific, + properties can be included. + Properties not relevant to the selected mechanism + are ignored. + See Standard Properties for a list of standard + properties. + + cbh The possibly null callback handler to be used by + the SASL mechanisms to get further information + from the application/library to complete the + authentication. For example, a SASL mechanism + might require the authentication ID, password and + realm from the caller. The authentication ID is + requested by using a NameCallback. The password + is requested by using a PasswordCallback. The + realm is requested by using a RealmChoiceCallback + if there is a list of realms to choose from, and + by using a RealmCallback if the realm must be + entered. + + +Expires November 2001 [Page 10 + +JAVA SASL API May, 2001 + + +4.1.2 setSaslClientFactory + + public static void + setSaslClientFactory(SaslClientFactory fac) + + Sets the default SaslClientFactory to use. This method sets fac to be + the default factory. It can only be called with a non-null value once + per VM. If a factory has been set already, this method throws + IllegalStateException. The method throws java.lang.SecurityException + if the caller does not have the necessary permission to set the + factory. + + Parameters are: + + fac The possibly null factory to set. If null, it + doesn't do anything. + + +4.1.3 createSaslServer + + public static SaslServer + createSaslServer(String mechanism, + String protocol, + String serverName, + Hashtable props, + javax.security.auth.callback.CallbackHandler cbh) + throws SaslException + + This method creates a SaslServer for the specified mechanism. It + returns null if no SaslServer can be created for the specified + mechanism. + + The algorithm for selection is as follows: + + 1. If a factory has been installed via setSaslServerFactory(), + invoke createSaslServer() on it. If the method invocation returns + a non-null SaslServer instance, return the SaslServer instance; + otherwise continue. + 2. Create a list of fully qualified class names using the package + names listed in the SERVER_PKGS + ("javax.security.sasl.server.pkgs") property in props and the + class name ServerFactory. Each class name in this list identifies + a SaslServerFactory implementation. Starting with the first class + on the list, create an instance of SaslServerFactory using the + class' public no-argument constructor and invoke + createSaslServer() on it. If the method invocation returns a non- + null SaslServer instance, return it; otherwise repeat using the + next class on the list until a non-null SaslServer is produced or + the list is exhausted. + 3. Repeat the previous step using the SERVER_PKGS + ("javax.security.sasl.server.pkgs") System property instead of + the property in props. + +Expires November 2001 [Page 11 + +JAVA SASL API May, 2001 + + + 4. As per the Java 2 Standard Edition version 1.3 service provider + guidelines, check for the existence of one of more files named + META-INF/services/javax.security.sasl.SaslServerFactory in the + classpath and installed JAR files. Each file lists the fully + qualified class names of the factories (i.e. implementations of + SaslServerFactory) found in the JAR files or classpath. Construct + a merged list of class names using these files and repeat Step 2 + using this list. If there are more than one of these files, the + order in which they are processed is undefined. If no non-null + SaslServer instance is produced, return null. + + Parameters are: + + mechanism A non-null IANA-registered name of a SASL + mechanism (e.g. "GSSAPI", "CRAM-MD5"). + + protocol The non-null string name of the protocol for + which the authentication is being performed, e.g + "pop", "ldap". + + serverName The non-null fully qualified host name of the + server. + + props The possibly null set of properties used to + select the SASL mechanism and to configure the + authentication exchange of the selected + mechanism. For example, if props includes the + Sasl.POLICY_NOPLAINTEXT property with the value + "true", then the selected SASL mechanism must not + be susceptible to simple plain passive attacks. + + In addition to the standard properties defined in + this class, other, possibly mechanism-specific, + properties can be included. + Properties not relevant to the selected mechanism + are ignored. + See section 4.1.7 Standard Properties for a list + of standard properties. + + cbh The possibly null callback handler to be used by + the SASL mechanism to get further information + from the application/library to complete the + authentication. For example, a SASL mechanism + might require the authentication ID and password + from the caller. The authentication ID is + requested with a NameCallback, and the password + with a PasswordCallback. + + +4.1.4 setSaslServerFactory + + public static void + +Expires November 2001 [Page 12 + +JAVA SASL API May, 2001 + + + setSaslServerFactory(SaslServerFactory fac) + + Sets the default SaslServerFactory to use. This method sets fac to + be the default factory. It can only be called with a non-null value + once per VM. If a factory has been set already, this method throws + IllegalStateException. The method throws java.lang.SecurityException + if the caller does not have the necessary permission to set the + factory. + + Parameters are: + + fac The possibly null factory to set. If null, it + doesn't do anything. + + +4.1.5 getSaslClientFactories + + public java.util.Enumeration + getSaslClientFactories(java.util.Hashtable props) + + Gets an enumeration of known factories for producing SaslClient. This + method uses the same sources for locating factories as + createSaslClient(). + + Parameters are: + + props A possibly null set of properties that may + contain policy properties and the property + CLIENT_PKGS ("javax.security.sasl.client.pkgs") + for specifying a list of SaslClientFactory + implementation package names. + + +4.1.6 getSaslServerFactories + + public java.util.Enumeration + getSaslServerFactories(java.util.Hashtable props) + + Gets an enumeration of known factories for producing SaslServer. This + method uses the same sources for locating factories as + createSaslServer(). + + Parameters are: + + props A possibly null set of properties that may + contain policy properties and the property + SERVER_PKGS ("javax.security.sasl.server.pkgs") + for specifying a list of SaslServerFactory + implementation package names. + + + + +Expires November 2001 [Page 13 + +JAVA SASL API May, 2001 + + +4.1.7 Standard Properties + + There are a number of properties that may be specified in a Hashtable + parameter when creating a SASL client or server. The standard + properties and descriptions of their values are as follows (with the + Sasl constant name followed by the literal value in parentheses): + + QOP ("javax.security.sasl.qop") + + A comma-separated, ordered list of quality-of-protection + values that the client or server is willing to support. A + qop value is one of + + "auth" authentication only + + "auth-int" authentication plus integrity protection + + "auth-conf" authentication plus integrity and + confidentiality protection + + + The order of the list specifies the preference order of + the client or server. If this property is absent, the + default qop is "auth". + + STRENGTH ("javax.security.sasl.strength") + + A comma-separated, ordered list of cipher strength values + that the client or server is willing to support. A + strength value is one of + + "low" + + "medium" + + "high" + + The order of the list specifies the preference order of + the client or server. An implementation SHOULD allow + configuration of the meaning of these values. + + An application MAY use the Java Cryptography Extension + (JCE) with JCE-aware mechanisms to control the selection + of cipher suites that match the strength values. + + If this property is absent, the default strength is + "high,medium,low". + + SERVER_AUTH ("javax.security.sasl.server.authentication") + + "true" if server must authenticate to client; default + "false" + +Expires November 2001 [Page 14 + +JAVA SASL API May, 2001 + + + + MAX_BUFFER ("javax.security.sasl.maxbuffer") + + Maximum size of receive buffer in bytes of + SaslClient/SaslServer; the default is defined by the + mechanism. The property value is the string + representation of an integer. + + CLIENT_PKGS ("javax.security.sasl.client.pkgs") + + A |-separated list of package names to use when locating + a SaslClientFactory. Each package MUST contain a class + named ClientFactory that implements the SaslClientFactory + interface. + + SERVER_PKGS ("javax.security.sasl.server.pkgs") + + A |-separated list of package names to use when locating + a SaslServerFactory. Each package MUST contain a class + named ServerFactory that implements the SaslServerFactory + interface. + + RAW_SEND_SIZE ("javax.security.sasl.rawsendsize") + + Maximum size of the raw send buffer in bytes of + SaslClient/SaslServer. The property value is the string + representation of an integer and is negotiated between + the client and server during the authentication exchange. + + The following properties are for defining a security policy for a + server or client. Absence of the property is interpreted as "false". + + POLICY_NOPLAINTEXT ("javax.security.sasl.policy.noplaintext") + + "true" if mechanisms susceptible to simple + plain passive attacks (e.g. "PLAIN") are + not permitted + + "false" if such mechanisms are permitted + + POLICY_NOACTIVE ("javax.security.sasl.policy.noactive") + + "true" if mechanisms susceptible to active + (non-dictionary) attacks are not + permitted + + "false" if such mechanisms are permitted. + + POLICY_NODICTIONARY ("javax.security.sasl.policy.nodictionary") + + "true" if mechanisms susceptible to passive + dictionary attacks are not permitted + + +Expires November 2001 [Page 15 + +JAVA SASL API May, 2001 + + + "false" if such mechanisms are permitted + + POLICY_NOANONYMOUS ("javax.security.sasl.policy.noanonymous") + + "true" if mechanisms that accept anonymous + login are not permitted + + "false" if such mechanisms are permitted + + POLICY_FORWARD_SECRECY ("javax.security.sasl.policy.forward") + + Forward secrecy means that breaking into one session will not + automatically provide information for breaking into future sessions. + + "true" if mechanisms that implement forward + secrecy between sessions are required + + "false" if such mechanisms are not required + + POLICY_PASS_CREDENTIALS ("javax.security.sasl.policy.credentials") + + "true" if mechanisms that pass client + credentials are required + + "false" if such mechanisms are not required + + + +4.2 public interface SaslClient + +An object implementing this interface can negotiate authentication as a +client using one of the IANA-registered mechanisms. + + +4.2.1 evaluateChallenge + + public byte[] + evaluateChallenge(byte[] challenge) + throws SaslException + + If a challenge is received from the server during the authentication + process, this method is called to prepare an appropriate next + response to submit to the server. The response is null if the + challenge accompanied a "SUCCESS" status and the challenge only + contains data for the client to update its state and no response + needs to be sent to the server. The response is a zero-length byte + array if the client is to send a response with no data. A + SaslException is thrown if an error occurred while processing the + challenge or generating a response. + + + Parameters are: + +Expires November 2001 [Page 16 + +JAVA SASL API May, 2001 + + + + challenge The non-null challenge received from the server. + The challenge array may have zero length. + + +4.2.2 hasInitialResponse + + public boolean hasInitialResponse() + + Determines whether this mechanism has an optional initial response. + If true, caller should call evaluateChallenge() with an empty array + to get the initial response. + + +4.2.3 isComplete + + public boolean + isComplete() + + This method may be called at any time to determine if the + authentication process is finished. Typically, the Protocol Driver + will not do this until it has received indication from the server (in + a protocol-specific manner) that the process has completed. + + +4.2.4 unwrap + + public byte[] unwrap(byte[] incoming, int offset, int len ) + throws SaslException + + Unwraps a byte array received from the server to return the + corresponding decoded bytes in a byte array. + + This method can be called only after the authentication process has + completed (i.e., when isComplete() returns true) and only if the + authentication process has negotiated integrity and/or privacy as the + quality of protection; otherwise, a SaslException is thrown. A + SaslException is thrown also if incoming cannot be successfully + unwrapped. + + incoming is the contents of the SASL buffer as defined in [SASL] + without the leading four octet field that represents the length. + offset and len specify the portion of incoming to use. + + Parameters are: + + incoming A non-null byte array containing the encoded + bytes from the server. + + offset The starting position at incoming of the bytes to + use. + + +Expires November 2001 [Page 17 + +JAVA SASL API May, 2001 + + + len The number of bytes from incoming to use. + + + +4.2.5 wrap + + public byte[] wrap(byte[] outgoing, int offset, int len) + throws SaslException + + Wraps a byte array to be sent to the server to return the + corresponding encoded bytes in a byte array. + + This method can be called only after the authentication exchange has + completed (i.e., when isComplete() returns true) and only if the + authentication exchange has negotiated integrity and/or privacy as + the quality of protection; otherwise, a SaslException is thrown. A + SaslException is thrown also if outgoing cannot be successfully + wrapped. + + The result of this method will make up the contents of the SASL + buffer as defined in [SASL] without the leading four octet field that + represents the length. + + offset and len specify the portion of outgoing to use. + + Parameters are: + + outgoing A non-null byte array containing the bytes to + encode. + + offset The starting position at outgoing of the bytes to + use. + + len The number of bytes from outgoing to use. + + +4.2.6 getMechanismName + + public String + getMechanismName() + + Reports the IANA-registered name of the mechanism used by this + client, e.g. "GSSAPI" or "CRAM-MD5". + + + +4.2.7 getNegotiatedProperty + + public String getNegotiatedProperty(String propName) + throws SaslException + + + +Expires November 2001 [Page 18 + +JAVA SASL API May, 2001 + + + Retrieves the negotiated property. This method can be called only + after the authentication exchange has completed (i.e., when + isComplete() returns true); otherwise, a SaslException is thrown. + + For example, this method may be used to obtained the negotiated raw + send buffer size, quality-of-protection, and cipher strength. See + Section 4.1.7 for a list of standard properties. + + This method returns null when the specified property was + not negotiated or is not applicable to this mechanism. + + Parameters: + + propName The non-null property name. + + +4.2.8 dispose + + public abstract void dispose() throws SaslException + + Disposes of any system resources or security-sensitive information + the SaslClient might be using. Invoking this method invalidates the + SaslClient instance. This method is idempotent. + + + +4.3 public interface SaslClientFactory + +An object implementing this interface can provide a SaslClient. The +implementation must be thread-safe and handle multiple simultaneous +requests. It must also have a public constructor that accepts no +argument. + + +4.3.1 createSaslClient + + public SaslClient + createSaslClient(String[] mechanisms, + String authorizationID, + String protocol, + String serverName, + Hashtable props, + javax.security.auth.callback.CallbackHandler cbh) + throws SaslException + + Creates a SaslClient using the parameters supplied. It returns null + if no SaslClient can be created using the parameters supplied. Throws + SaslException if it cannot create a SaslClient because of an error. + + Parameters are: + + + +Expires November 2001 [Page 19 + +JAVA SASL API May, 2001 + + + mechanisms The non-null list of mechanism names to try. Each + is the IANA-registered name of a SASL mechanism + (e.g. "GSSAPI", "CRAM-MD5"). + + authorizationID The possibly null protocol-dependent + identification to be used for authorization. If + null or empty, the server derives an + authorization ID from the client's authentication + credentials. When the SASL authentication + completes successfully, the specified entity is + granted access. + + protocol The non-null string name of the protocol for + which the authentication is being performed, e.g + "pop", "ldap". + + serverName The non-null fully qualified host name of the + server to authenticate to. + + props The possibly null set of properties used to + select the SASL mechanism and to configure the + authentication exchange of the selected + mechanism. See the Sasl class for a list of + standard properties. Other, possibly mechanism- + specific, properties can be included. Properties + not relevant to the selected mechanism are + ignored. + + cbh The possibly null callback handler to be used by + the SASL mechanisms to get further information + from the application/library to complete the + authentication. For example, a SASL mechanism + might require the authentication ID, password and + realm from the caller. The authentication ID is + requested by using a NameCallback. The password + is requested by using a PasswordCallback. The + realm is requested by using a RealmChoiceCallback + if there is a list of realms to choose from, and + by using a RealmCallback if the realm must be + entered. + + +4.3.2 getMechanismNames + + public String[] + getMechanismNames(Hashtable props) + + Returns a non-null array of names of mechanisms supported by this + factory that match the specified mechanism selection policies. + + Parameters are: + + +Expires November 2001 [Page 20 + +JAVA SASL API May, 2001 + + + props The possibly null set of properties used to + specify the security policy of the SASL + mechanisms. For example, if props contains the + Sasl.POLICY_NOPLAINTEXT property with the value + "true", then the factory must not return any SASL + mechanisms that are susceptible to simple plain + passive attacks. See the Sasl class for a + complete list of policy properties. Non-policy + related properties, if present in props, are + ignored. + + + +4.4 public interface SaslServer + +An object implementing this interface can negotiate authentication as a +server using one of the IANA-registered mechanisms. + + +4.4.1 evaluateResponse + + public byte[] + evaluateResponse(byte[] response) + throws SaslException + + If a response is received from the client during the authentication + process, this method is called to prepare an appropriate next + challenge to submit to the client. The challenge is null if the + authentication has succeeded and no more challenge data is to be sent + to the client. It is non-null if the authentication must be continued + by sending a challenge to the client, or if the authentication has + succeeded but challenge data needs to be processed by the client. A + SaslException is thrown if an error occurred while processing the + response or generating a challenge. isComplete() should be called + after each call to evaluateResponse() to determine if any further + response is needed from the client. The Protocol Driver will send an + indication (in a protocol-specific manner) as to whether the + authentication has succeeded, failed, or should be continued, and any + accompanying challenge data. + + Parameters are: + + response Non-null response received from client. + + +4.4.2 isComplete + + public boolean + isComplete() + + This method may be called at any time to determine if the + authentication process is finished. This method is typically called + +Expires November 2001 [Page 21 + +JAVA SASL API May, 2001 + + + after each invocation of evaluateResponse() to determine whether the + authentication has completed successfully or should be continued. + + +4.4.3 unwrap + + public byte[] unwrap(byte[] incoming, int offset, int len) + throws SaslException + + Unwraps a byte array received from the client to return the + corresponding decoded bytes in a byte array. + + This method can be called only after the authentication process has + completed (i.e., when isComplete() returns true) and only if the + authentication process has negotiated integrity and/or privacy as the + quality of protection; otherwise, a SaslException is thrown. A + SaslException is thrown also if incoming cannot be successfully + unwrapped. + + incoming is the contents of the SASL buffer as defined in [SASL] + without the leading four octet field that represents the length. + offset and len specify the portion of incoming to use. + + Parameters are: + + incoming A non-null byte array containing the encoded + bytes from the client. + + offset The starting position at incoming of the bytes to + use. + + len The number of bytes from incoming to use. + + + +4.4.4 wrap + + public byte[] wrap(byte[] outgoing, int offset, int len) + throws SaslException + + Wraps a byte array to be sent to the client to return the + corresponding encoded bytes in a byte array. + + This method can be called only after the authentication exchange has + completed (i.e., when isComplete() returns true) and only if the + authentication exchange has negotiated integrity and/or privacy as + the quality of protection; otherwise, a SaslException is thrown. A + SaslException is thrown also if outgoing cannot be successfully + wrapped. + + + + +Expires November 2001 [Page 22 + +JAVA SASL API May, 2001 + + + The result of this method will make up the contents of the SASL + buffer as defined in [SASL] without the leading four octet field that + represents the length. + + offset and len specify the portion of outgoing to use. + + Parameters are: + + outgoing A non-null byte array containing the bytes to + encode. + + offset The starting position at outgoing of the bytes to + use. + + len The number of bytes from outgoing to use. + + +4.4.5 getMechanismName + + public String + getMechanismName() + + Returns the non-null IANA-registered name of the mechanism used by + this server, e.g. "GSSAPI" or "CRAM-MD5". + + +4.4.6 getAuthorizationID + + public String + getAuthorizationID() throws SaslException + + Reports the authorization ID in effect for the client of this + session. Can only be called if isComplete() returns true; throws + SaslException if called before authentication completes. + + +4.4.7 getNegotiatedProperty + + public String getNegotiatedProperty(String propName) + throws SaslException + + Retrieves the negotiated property. This method can be called only + after the authentication exchange has completed (i.e., when + isComplete() returns true); otherwise, a SaslException is thrown. + + For example, this method may be used to obtained the negotiated raw + send buffer size, quality-of-protection, and cipher strength. See + Section 4.1.7 for a list of standard properties. + + This method returns null when the specified property was + not negotiated or is not applicable to this mechanism. + + +Expires November 2001 [Page 23 + +JAVA SASL API May, 2001 + + + Parameters: + + propName The non-null property name. + + +4.4.8 dispose + + public abstract void dispose() throws SaslException + + Disposes of any system resources or security-sensitive information + the SaslServer might be using. Invoking this method invalidates the + SaslServer instance. This method is idempotent. + + +4.5 public interface SaslServerFactory + +An object implementing this interface can provide a SaslServer. The +implementation must be thread-safe and handle multiple simultaneous +requests. It must also have a public constructor that accepts no +argument. + + +4.5.1 createSaslServer + + public SaslServer + createSaslServer(String mechanism, + String protocol, + String serverName, + Hashtable props, + javax.security.auth.callback.CallbackHandler cbh) + throws SaslException + + Creates a SaslServer using the mechanism supplied. It returns null if + no SaslServer can be created using the parameters supplied. Throws + SaslException if it cannot create a SaslServer because of an error. + + Returns a possibly null SaslServer which supports the specified + mechanism. If null, this factory cannot produce a SaslServer for the + specified mechanism. + + Parameters are: + + mechanism The non-null IANA-registered name of a SASL + mechanism (e.g. "GSSAPI", "CRAM-MD5"). + + protocol The non-null string name of the protocol for + which the authentication is being performed, e.g + "pop", "ldap". + + serverName The non-null fully qualified host name of the + server. + + +Expires November 2001 [Page 24 + +JAVA SASL API May, 2001 + + + props The possibly null set of properties to be used to + select the SASL mechanism and to configure the + authentication exchange of the selected + mechanism. See the Sasl class for a list of + standard properties. Other, possibly mechanism- + specific, properties can be included. Properties + not relevant to the selected mechanism are + ignored. + + cbh The possibly null callback handler to be used + by the SASL mechanisms to get further information + from the application/library to complete the + authentication. For example, a SASL mechanism + might require the authentication ID, password and + realm from the caller. The authentication ID is + requested by using a NameCallback. The password + is requested by using a PasswordCallback. The + realm is requested by using a RealmChoiceCallback + if there is a list of realms to choose from, and + by using a RealmCallback if the realm must be + entered. + + +4.5.2 getMechanismNames + + public String[] + getMechanismNames(Hashtable props) + + Returns a non-null array of names of mechanisms supported by this + factory that match the specified mechanism selection policies. + + Parameters are: + + props The possibly null set of properties used to + specify the security policy of the SASL + mechanisms. For example, if props includes the + Sasl.POLICY_NOPLAINTEXT property with the value + "true", then the factory must not return any SASL + mechanisms that are susceptible to simple plain + passive attacks. See the Sasl class for a + complete list of policy properties. Non-policy + related properties, if present in props, are + ignored. + + +4.6 public class AuthorizeCallback + implements javax.security.auth.callback.Callback + +This callback is used by SaslServer to determine whether one entity +(identified by an authenticated authentication id) can act on behalf of +another entity (identified by an authorization id). + + +Expires November 2001 [Page 25 + +JAVA SASL API May, 2001 + + +4.6.1 Constructors + + public AuthorizeCallback(String authnID, + String authzID) + + Parameters are : + + authnID The authentication id + + authzID The authorization id + + +4.6.2 getAuthenticationID + + public String getAuthenticationID() + + Returns the authentication id to check. + + +4.6.3 getAuthorizationID + + public String getAuthorizationID() + + Returns the authorization id to check. + + +4.6.4 isAuthorized + + public boolean isAuthorized() + + Returns true if authorization is allowed, false otherwise. + + +4.6.5 setAuthorized + + public void setAuthorized(boolean ok) + + Sets whether authorization is allowed or not. + + Parameters are: + + ok true if authorization is to be allowed, false + otherwise + + +4.6.6 getAuthorizedID + + public String getAuthorizedID() + + Returns the id of the authorized user. If null, this means the + authorization failed. + +Expires November 2001 [Page 26 + +JAVA SASL API May, 2001 + + + + +4.6.7 setAuthorizedID + + public void setAuthorizedID(String id) + + Sets the id of the authorized entity. The method is called by the + handler only if the id is different from that returned by + getAuthorizationID(). For example, the id might need to be + canonicalized for the environment in which it will be used. + + Parameters are: + + id The id of the authorized user + + +4.7 public class RealmCallback + extends javax.security.auth.callback.TextInputCallback + + This callback is used by SaslClient and SaslServer to retrieve realm + information. + + +4.7.1 Constructors + + public RealmCallback (String prompt) + + Constructs a RealmCallback with a prompt. + + + public RealmCallback (String prompt, String defaultRealm) + + Constructs a RealmCallback with a prompt and a default realm. + + + IllegalArgumentException is thrown if prompt is null or the empty + string, or if defaultRealm is empty or null. + + + Parameters are : + + prompt The non-null prompt to use to request the realm + information + + defaultRealm The non-null default realm to use + + +4.8 public class RealmChoiceCallback + extends javax.security.auth.callback.ChoiceCallback + + This callback is used by SaslClient and SaslServer to obtain one or + more realms given a list of realm choices. + +Expires November 2001 [Page 27 + +JAVA SASL API May, 2001 + + + + +4.8.1 Constructors + + public RealmChoiceCallback (String prompt, + String[]choices, + int defaultChoice, + boolean multipleSelectionsAllowed) + + Constructs a RealmChoiceCallback with a prompt, a list of choices and + a default choice. + + IllegalArgumentException is thrown if prompt is null or the empty + string, or if defaultRealm is empty or null. + + + Parameters are : + + prompt The non-null prompt to use to request the realm + + choices The non-null list of realms to choose from + + defaultChoice The choice to use as the default choice when the + list of choices is displayed. It is an index into + the choices array. + + multipleSelectionsAllowed Specifies whether or not multiple + selections can be made from the list of choices. + + +4.9 public class SaslException extends IOException + +Exception thrown on errors and failures that occur when using SASL. + + +4.9.1 Constructors + + public SaslException() + + Constructs a new instance of SaslException. The root exception and + the detailed message are null. + + + public SaslException(String message) + + + Constructs a default exception with a detailed message and no root + exception. + + + public SaslException(String message, + Throwable ex) + +Expires November 2001 [Page 28 + +JAVA SASL API May, 2001 + + + + Constructs a new instance of SaslException with a detailed message + and a root exception. For example, a SaslException might result from + a problem with the callback handler, which might throw a + NoSuchCallbackException if it does not support the requested + callback, or throw an IOException if it had problems obtaining data + for the callback. The SaslException's root exception would then be + the exception thrown by the callback handler. + + + Parameters are: + + message Possibly null additional detail about the + exception. + + ex A possibly null root exception that caused this + exception. + + +4.9.2 getCause + + public Throwable + getCause() + + Returns the cause of this exception or null if the cause is + nonexistent or unknown. The cause is the throwable that caused this + exception to be thrown. + + +4.9.3 printStackTrace + + public void + printStackTrace() + + Prints this exception's stack trace to System.err. If this exception + has a root exception, the stack trace of the root exception is also + printed to System.err. + + public void + printStackTrace(PrintStream ps) + + Prints this exception's stack trace to a print stream. If this + exception has a root exception, the stack trace of the root exception + is also printed to the print stream. + + public void + printStackTrace(PrintWriter pw) + + Prints this exception's stack trace to a print writer. If this + exception has a root exception, the stack trace of the root exception + is also printed to the print writer. + + +Expires November 2001 [Page 29 + +JAVA SASL API May, 2001 + + + Parameters are: + + ps The non-null print stream to which to print. + + pw The non-null print writer to which to print. + + +5. Security Considerations + + When SASL authentication is performed over unsecured connections, it + is possible for an active attacker to spoof the server's protocol- + specific indication that authentication is complete. Clients should + protect against this attack by verifying the completion of + authentication with the Mechanism Driver by calling the driver's + isComplete() method. + + Additional security considerations are discussed in [SASL]. + + +6. Copyright + + Copyright (C) The Internet Society (2001). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + + +7. Bibliography + + [JAAS] Java Software, Sun Microsystems, Inc., "Java Authentication + and Authorization Service, "http://java.sun.com/products/jaas", + Jan 2000. + +Expires November 2001 [Page 30 + +JAVA SASL API May, 2001 + + + + [SASL] J. Myers, "Simple Authentication and Security Layer (SASL)", + RFC 2222, October 1997 + + +8. Authors' Addresses + + Rob Weltman + Coscend Corp. + 3290 W. Bayshore Road + Palo Alto, CA 94303 + +1 650 461 1708 + robw@coscend.com + + Rosanna Lee + Sun Microsystems + Mail Stop UCUP02-206 + 901 San Antonio Road + Palo Alto, CA 94303 + USA + Email: rosanna.lee@eng.sun.com + + +9. Acknowledgements + + Rob Earhart, then of Carnegie Mellon University, was a coauthor of an + earlier draft. + + Scott Seligman of Sun Microsystems, Inc. contributed to the + architecture and API proposed in this document. + + Joe Salowey of WRQ, Anthony J. Nadalin of IBM, Bob Naugle of + Bluestone, and Timothy Martin of Carnegie Mellon University + contributed to the contents of this revision of the draft through + participation in the expert group for Java Specification Request 28 - + http://java.sun.com/aboutJava/communityprocess/jsr/jsr_028_sasl.html. + + +10. Changes from draft-weltman-java-sasl-04.txt + + SaslClient, SaslServer + + Added dispose() to allow security-sensitive information to be purged + from Mechanism Drivers deterministically. + + Replaced getInputStream() and getOutputStream() with unwrap() and + wrap(), respectively, to remove dependency on stream-based I/O. + + Replaced getNegotiatedQop() and getNegotiatedStrength() with the more + generic getNegotiatedProperty() to support access to other negotiated + properties. + + AuthorizeCallback + +Expires November 2001 [Page 31 + +JAVA SASL API May, 2001 + + + + Changed getAuthenticationId() to getAuthenticationID(), + getAuthorizationId() to getAuthorizationID(), and getAuthorizedId() + to getAuthorizedID(). This was to conform to the naming convention + used in the rest of the API. + + +11. Changes from draft-weltman-java-sasl-03.txt + + Sasl + + Added getClientFactories() and getServerFactories(). + Updated the list of standard properties. + Added the use of the J2SE version 1.3 service provider guidelines for + locating SaslClientFactory and SaslServerFactory implementations. + + + SaslClient + + Added getNegotiatedQop() and getNegotiatedStrength() + + + SaslClientFactory and SaslServerFactory + + getMechanismNames() takes a properties Hashtable as argument. + + + SaslServer + + Added getNegotiatedQop() and getNegotiatedStrength() + + + AuthorizeCallback + + New class to allow SaslServer to determine if an identity may be + authorized as another identity. + + + RealmCallback and RealmChoiceCallback + + New classes for obtaining realm information. + + + SaslException + + getRootException changed to getCause, in anticipation of a new + standard Java API for nested exceptions. Also, printStackTrace prints + both the current and the nested exception. + + +12. Changes from draft-weltman-java-sasl-02.txt + + SecurityLayer + +Expires November 2001 [Page 32 + +JAVA SASL API May, 2001 + + + + The SecurityLayer interface was removed. + + + SaslClient + + createInitialResponse() was removed. evaluateChallenge() accepts an + empty challenge and can return an initial response. + hasInitialResponse() was added to determine if the mechanism allows + for an initial client response. + + + SaslClient and SaslServer + + getSecurityLayer() was replaced with getInputStream() and + getOutputStream(). + + Package names are |-delimited, not space-delimited, in the pkgs + properties. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Expires November 2001 [Page 33 + +JAVA SASL API May, 2001 + + +13. Appendix A - Sample Java LDAP program using SASL + + /**************************************************************** + It might look like this in LDAP. The Protocol Driver is + implemented as part of the authenticate method of + LDAPConnection. If a security layer is negotiated, the Protocol + Driver creates new input and output streams that use the + SaslClient to encode and decode any subsequent messages. + ****************************************************************/ + + public void authenticate( String dn, + String[] mechs, + Hashtable props, + CallbackHandler cbh ) + throws SaslException { + + // Create SASL client to use for authentication + SaslClient saslClnt = Sasl.createSaslClient( + mechs, dn, "ldap", getHost(), props, cbh); + + if (saslClnt == null) { + throw new SaslException("SASL client not available"); + } + + String mechName = saslClnt.getMechanismName(); + + // Get initial response, if any + byte[] response = (saslClnt.hasInitialResponse() ? + saslClnt.evaluateChallenge(new byte[0]) : + null); + + + // Create a bind request message, including the initial + // response (if any), and send it off + writeRequest( new LDAPSASLBindRequest( dn, mechName, + response ) ); + + // Get the server challenge + LDAPSASLBindResponse msg = + (LDAPSASLBindResponse)readResponse(); + + // Authentication done? + while (!saslClnt.isComplete() && + (msg.getStatus() == LDAP_SASL_BIND_IN_PROGRESS || + msg.getStatus() == LDAP_SUCCESS)) { + + // No, process challenge to get an appropriate next + // response + byte[] challenge = msg.getChallenge(); + response = saslClnt.evaluateChallenge( challenge ); + + // May be a success message with no further response + if ( msg.getStatus() == LDAP_SUCCESS) { + +Expires November 2001 [Page 34 + +JAVA SASL API May, 2001 + + + if ( response != null ) { + // Protocol error; supposed to be done already + throw new SaslException("Protocol error in " + + "SASL session"); + } + break; // done + } + + // Wrap the response in another bind request and send + // it off + writeRequest( new LDAPSASLBindRequest( dn, mechName, + response ) ); + msg = (LDAPSASLBindResponse)readResponse(); + } + + // Make sure authentication REALLY is complete + if ( !saslClnt.isComplete() ) { + // Authentication session hijacked! + throw new SaslException( "SASL session hijacked!" ); + } + + // Check if a security layer was negotiated + String qop = saslClnt.getNegotiatedProperty(Sasl.QOP); + if ( qop != null && (qop.equalsIgnoreCase("auth-int") || + qop.equalsIgnoreCase("auth-conf")) ) { + setInputStream( + new SaslInputStream( saslClnt, + getInputStream() ); + setOutputStream( + new SaslOutputStream( saslClnt, + getOutputStream() ); + } + } + + + + + + + + + + + + + + + + + + + + + +Expires November 2001 [Page 35 + \ No newline at end of file diff --git a/doc/specification/draft-zeilenga-sasl-anon-00.txt b/doc/specification/draft-zeilenga-sasl-anon-00.txt new file mode 100644 index 0000000..6934d0d --- /dev/null +++ b/doc/specification/draft-zeilenga-sasl-anon-00.txt @@ -0,0 +1,395 @@ + + + + + + +INTERNET-DRAFT Editor: Kurt D. Zeilenga +Intended Category: Standards Track OpenLDAP Foundation +Expires in six months 23 June 2002 +Obsoletes: RFC 2245 + + + + Anonymous SASL Mechanism + + + +Status of Memo + + This document is an Internet-Draft and is in full conformance with all + provisions of Section 10 of RFC2026. + + This document is intended to be, after appropriate review and + revision, submitted to the RFC Editor as a Standards Track document. + Distribution of this memo is unlimited. Technical discussion of this + document will take place on the IETF SASL mailing list + . Please send editorial comments directly to the + document editor . + + Internet-Drafts are working documents of the Internet Engineering Task + Force (IETF), its areas, and its working groups. Note that other + groups may also distribute working documents as Internet-Drafts. + Internet-Drafts are draft documents valid for a maximum of six months + and may be updated, replaced, or obsoleted by other documents at any + time. It is inappropriate to use Internet-Drafts as reference + material or to cite them other than as ``work in progress.'' + + The list of current Internet-Drafts can be accessed at + . The list of + Internet-Draft Shadow Directories can be accessed at + . + + Copyright 2002, The Internet Society. All Rights Reserved. + + Please see the Copyright section near the end of this document for + more information. + + +Abstract + + It is common practice on the Internet to permit anonymous access to + various services. Traditionally, this has been done with a plain text + password mechanism using "anonymous" as the user name and optional + trace information, such as an email address, as the password. As + + + +Zeilenga Anonymous SASL Mechanism [Page 1] + +INTERNET-DRAFT draft-zeilenga-sasl-anon-00.txt 23 June 2002 + + + plaintext login commands are not permitted in new IETF protocols, a + new way to provide anonymous login is needed within the context of the + Simple Authentication and Security Layer (SASL) framework. + + +1. Anonymous SASL mechanism + + This document defines an anonymous mechanism for the Simple + Authentication and Security Layer ([SASL]) framework. This document + replaces RFC 2245. Changes since RFC 2245 are detailed in Appendix A. + + The mechanism name associated with anonymous access is "ANONYMOUS". + + The mechanism consists of a single message from the client to the + server. The client sends optional trace information in the form of a + human readable string of UTF-8 [UTF8] encoded characters from the + Universal Character Set ([UCS]) characters. The trace information + should take one of three forms: an Internet email address, an opaque + string which does not contain the '@' (U+0040) character and can be + interpreted by the system administrator of the client's domain, or + nothing. For privacy reasons, an Internet email address should only + be used with permission from the user. + + A server which permits anonymous access will announce support for the + ANONYMOUS mechanism, and allow anyone to log in using that mechanism, + usually with restricted access. + + The formal grammar for the client message using Augmented BNF [ABNF] + follows. + + message = [email / token] + + UTF1 = %x00-3F / %x41-7F ;; less '@' (U+0040) + UTF2 = %xC0-DF 1(UTF0) + UTF3 = %xE0-EF 2(UTF0) + UTF4 = %xF0-F7 3(UTF0) + UTF5 = %xF8-FB 4(UTF0) + UTF6 = %xFC-FD 5(UTF0) + UTF0 = %x80-BF + + TCHAR = UTF1 / UTF2 / UTF3 / UTF3 / UTF4 / UTF5 / UTF6 + ;; any printable UTF-8 encoded UCS character + ;; except '@' (U+0040) + + email = addr-spec + ;; as defined in [IMAIL], except with no free + ;; insertion of linear-white-space, and the + ;; local-part MUST either be entirely enclosed in + + + +Zeilenga Anonymous SASL Mechanism [Page 2] + +INTERNET-DRAFT draft-zeilenga-sasl-anon-00.txt 23 June 2002 + + + ;; quotes or entirely unquoted + + token = 1*255TCHAR + + The following characters are considered non-printable: + - control characters: U+0000..U+001F, U+007F..U+009F; + - replacement character: U+FFFD; and + - special characters and noncharacter: U+FEFF, U+FFFE, U+FFFF. + + +2. Example + + Here is a sample ANONYMOUS login between an IMAP client and server. + In this example, "C:" and "S:" indicate lines sent by the client and + server respectively. If such lines are wrapped without a new "C:" or + "S:" label, then the wrapping is for editorial clarity and is not part + of the command. + + Note that this example uses the IMAP profile [IMAP4] of SASL. The + base64 encoding of challenges and responses, as well as the "+ " + preceding the responses are part of the IMAP4 profile, not part of + SASL itself. Newer profiles of SASL will include the client message + with the AUTHENTICATE command itself so the extra round trip below + (the server response with an empty "+ ") can be eliminated. + + In this example, the user's opaque identification token is "sirhc". + + S: * OK IMAP4 server ready + C: A001 CAPABILITY + S: * CAPABILITY IMAP4 IMAP4rev1 AUTH=CRAM-MD5 AUTH=ANONYMOUS + S: A001 OK done + C: A002 AUTHENTICATE ANONYMOUS + S: + + C: c2lyaGM= + S: A003 OK Welcome, trace information has been logged. + + +3. Security Considerations + + The ANONYMOUS mechanism grants access to information by anyone. For + this reason it should be disabled by default so the administrator can + make an explicit decision to enable it. + + If the anonymous user has any write privileges, a denial of service + attack is possible by filling up all available space. This can be + prevented by disabling all write access by anonymous users. + + If anonymous users have read and write access to the same area, the + + + +Zeilenga Anonymous SASL Mechanism [Page 3] + +INTERNET-DRAFT draft-zeilenga-sasl-anon-00.txt 23 June 2002 + + + server can be used as a communication mechanism to anonymously + exchange information. Servers which accept anonymous submissions + should implement the common "drop box" model which forbids anonymous + read access to the area where anonymous submissions are accepted. + + If the anonymous user can run many expensive operations (e.g., an IMAP + SEARCH BODY command), this could enable a denial of service attack. + Servers are encouraged to limit the number of anonymous users and + reduce their priority or limit their resource usage. + + If there is no idle timeout for the anonymous user and there is a + limit on the number of anonymous users, a denial of service attack is + enabled. Servers should implement an idle timeout for anonymous + users. + + The trace information is not authenticated so it can be falsified. + This can be used as an attempt to get someone else in trouble for + access to questionable information. Administrators trying to trace + abuse need to realize this information may be falsified. + + A client which uses the user's correct email address as trace + information without explicit permission may violate that user's + privacy. Information about who accesses an anonymous archive on a + sensitive subject (e.g., sexual abuse) has strong privacy needs. + Clients should not send the email address without explicit permission + of the user and should offer the option of supplying no trace token -- + thus only exposing the source IP address and time. Anonymous proxy + servers could enhance this privacy, but would have to consider the + resulting potential denial of service attacks. + + Anonymous connections are susceptible to man in the middle attacks + which view or alter the data transferred. Clients and servers are + encouraged to support external integrity and encryption mechanisms. + + Protocols which fail to require an explicit anonymous login are more + susceptible to break-ins given certain common implementation + techniques. Specifically, Unix servers which offer user login may + initially start up as root and switch to the appropriate user id after + an explicit login command. Normally such servers refuse all data + access commands prior to explicit login and may enter a restricted + security environment (e.g., the Unix chroot(2) function) for anonymous + users. If anonymous access is not explicitly requested, the entire + data access machinery is exposed to external security attacks without + the chance for explicit protective measures. Protocols which offer + restricted data access should not allow anonymous data access without + an explicit login step. + + + + + +Zeilenga Anonymous SASL Mechanism [Page 4] + +INTERNET-DRAFT draft-zeilenga-sasl-anon-00.txt 23 June 2002 + + +4. IANA Considerations + + It is requested that the SASL Mechanism registry [IANA-SASL] entry for + the ANONYMOUS mechanism be updated to reflect that this document now + provides its technical specification. + + To: iana@iana.org + Subject: Updated Registration of SASL mechanism ANONYMOUS + + SASL mechanism name: ANONYMOUS + Security considerations: See RFC XXXX. + Published specification (optional, recommended): RFC XXXX + Person & email address to contact for further information: + Kurt Zeilenga + Chris Neuman + Intended usage: COMMON + Author/Change controller: IESG + Note: Updates existing entry for ANONYMOUS + + +5. Acknowledgement + + This document is a revision of RFC 2245 by Chris Newman. + + +6. Normative References + + [ABNF] Crocker, D. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", RFC 2234, November 1997. + + [IMAIL] Crocker, D., "Standard for the Format of Arpa Internet + Text Messages", STD 11, RFC 822, August 1982. + + [SASL] Myers, J., "Simple Authentication and Security Layer + (SASL)", RFC 2222bis (a work in progress). + + [UCS] Universal Multiple-Octet Coded Character Set (UCS) - + Architecture and Basic Multilingual Plane, ISO/IEC 10646-1 + : 1993. + + [UTF-8] Yergeau, F., "UTF-8, a transformation format of ISO + 10646", RFC 2279, January 1998. + + +7. Informative References + + [IMAP4] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, December 1996. + + + +Zeilenga Anonymous SASL Mechanism [Page 5] + +INTERNET-DRAFT draft-zeilenga-sasl-anon-00.txt 23 June 2002 + + + [IANA-SASL] IANA, "SIMPLE AUTHENTICATION AND SECURITY LAYER (SASL) + MECHANISMS", http://www.iana.org/assignments/sasl- + mechanisms. + + +8. Editor's Address + + Kurt Zeilenga + OpenLDAP Foundation + + Email: kurt@OpenLDAP.org + + +Appendix A. Changes since RFC 2245 + + RFC 2245 allows the client to send optional trace information in the + form of a human readable string, but did not define the character + encoding nor character set to be used. This document mandates use of + UTF-8 encoded UCS characters. The grammar was updated to reflect + this. + + Additionally, a number of editorial changes were made. + + +Full Copyright Statement + + Copyright 2002, The Internet Society. All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published and + distributed, in whole or in part, without restriction of any kind, + provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be followed, + or as required to translate it into languages other than English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE AUTHORS, THE INTERNET SOCIETY, AND THE INTERNET + ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE + + + +Zeilenga Anonymous SASL Mechanism [Page 6] + +INTERNET-DRAFT draft-zeilenga-sasl-anon-00.txt 23 June 2002 + + + INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED + WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Zeilenga Anonymous SASL Mechanism [Page 7] + diff --git a/doc/specification/draft-zeilenga-sasl-plain-00.txt b/doc/specification/draft-zeilenga-sasl-plain-00.txt new file mode 100644 index 0000000..e99d247 --- /dev/null +++ b/doc/specification/draft-zeilenga-sasl-plain-00.txt @@ -0,0 +1,339 @@ + + + + + + +INTERNET-DRAFT Editor: Kurt D. Zeilenga +Intended Category: Standards Track OpenLDAP Foundation +Expires in six months 23 June 2002 +Updates: RFC 2595 + + + + Plain SASL Mechanism + + + +Status of Memo + + This document is an Internet-Draft and is in full conformance with all + provisions of Section 10 of RFC2026. + + This document is intended to be, after appropriate review and + revision, submitted to the RFC Editor as a Standards Track document. + Distribution of this memo is unlimited. Technical discussion of this + document will take place on the IETF SASL mailing list + . Please send editorial comments directly to the + document editor . + + Internet-Drafts are working documents of the Internet Engineering Task + Force (IETF), its areas, and its working groups. Note that other + groups may also distribute working documents as Internet-Drafts. + Internet-Drafts are draft documents valid for a maximum of six months + and may be updated, replaced, or obsoleted by other documents at any + time. It is inappropriate to use Internet-Drafts as reference + material or to cite them other than as ``work in progress.'' + + The list of current Internet-Drafts can be accessed at + . The list of + Internet-Draft Shadow Directories can be accessed at + . + + Copyright 2002, The Internet Society. All Rights Reserved. + + Please see the Copyright section near the end of this document for + more information. + + +Abstract + + Clear-text passwords are simple, interoperate with almost all existing + operating system authentication databases, and are useful for a smooth + transition to a more secure password-based authentication mechanism. + The drawback is that they are unacceptable for use over an unencrypted + + + +Zeilenga Plain SASL Mechanism [Page 1] + +INTERNET-DRAFT draft-zeilenga-sasl-plain-00.txt 23 June 2002 + + + network connection. This document defines the the SASL PLAIN + authentication mechanism, intended to be used with confidentiality + protection provided another layer (e.g. TLS). + + +Conventions + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in [KEYWORDS]. + + +1. Background and Intended Usage + + Clear-text passwords are simple, interoperate with almost all existing + operating system authentication databases, and are useful for a smooth + transition to a more secure password-based authentication mechanism. + The drawback is that they are unacceptable for use over an unencrypted + network connection. + + This document defines the "PLAIN" Simple Authentication and Security + Layer ([SASL]) mechanism for use in protocols with no clear-text login + command (e.g., ACAP). + + The PLAIN SASL mechanism MUST NOT be used without adequate security + protection as the mechanism affords no integrity nor confidentiality + protection itself. The PLAIN SASL mechanism MUST NOT be advertised + unless a strong encryption layer (such as provided by [TLS]) is + active. + + This document updates RFC 2595, replacing Section 6. Changes since + RFC 2595 are detailed in Appendix A. + + +2. PLAIN SASL mechanism + + The mechanism consists of a single message from the client to the + server. The client sends the authorization identity (identity to + login as), followed by a NUL character, followed by the authentication + identity (identity whose password will be used), followed by a NUL + character, followed by the clear-text password. The client may leave + the authorization identity empty if wishes the server to derive the + authorization identity from the provided the authentication identity. + + The authorization identity, authentication identity, password, and the + NUL character SHALL be transferred as [UTF-8] encoded string of + printable [Unicode] characters in Unicode Normalisation Form KC + [NFKC]. + + + +Zeilenga Plain SASL Mechanism [Page 2] + +INTERNET-DRAFT draft-zeilenga-sasl-plain-00.txt 23 June 2002 + + + The following characters are considered non-printable: + - control characters: U+0000..U+001F, U+007F..U+009F; + - replacement character: U+FFFD; and + - special characters and noncharacter: U+FEFF, U+FFFE, U+FFFF. + + The server will verify the authentication identity and password with + the system authentication database and verify that the authentication + credentials permit the client to login as the authorization identity. + If both steps succeed, the user is logged in. + + The server MAY also use the password to initialize any new + authentication database, such as one suitable for [CRAM-MD5] or + [DIGEST-MD5]. + + message = [authorize-id] NUL authenticate-id NUL password + authenticate-id = 1*UTF8-SAFE ; MUST accept up to 255 octets + authorize-id = 1*UTF8-SAFE ; MUST accept up to 255 octets + password = 1*UTF8-SAFE ; MUST accept up to 255 octets + NUL = %x00 + UTF8-SAFE = %x01-09 / %x0B-0C / %x0E-7F / UTF8-2 / + UTF8-3 / UTF8-4 / UTF8-5 / UTF8-6 + UTF8-1 = %x80-BF + UTF8-2 = %xC0-DF UTF8-1 + UTF8-3 = %xE0-EF 2UTF8-1 + UTF8-4 = %xF0-F7 3UTF8-1 + UTF8-5 = %xF8-FB 4UTF8-1 + UTF8-6 = %xFC-FD 5UTF8-1 + + +4. Example + + Here is an example of how this might be used to initialize a CRAM-MD5 + authentication database for ACAP: + + S: * ACAP (SASL "CRAM-MD5") (STARTTLS) + C: a001 AUTHENTICATE "CRAM-MD5" + S: + "<1896.697170952@postoffice.reston.mci.net>" + C: "tim b913a602c7eda7a495b4e6e7334d3890" + S: a001 NO (TRANSITION-NEEDED) + "Please change your password, or use TLS to login" + C: a002 STARTTLS + S: a002 OK "Begin TLS negotiation now" + + S: * ACAP (SASL "CRAM-MD5" "PLAIN" "EXTERNAL") + C: a003 AUTHENTICATE "PLAIN" {21+} + C: timtanstaaftanstaaf + S: a003 OK CRAM-MD5 password initialized + + + + +Zeilenga Plain SASL Mechanism [Page 3] + +INTERNET-DRAFT draft-zeilenga-sasl-plain-00.txt 23 June 2002 + + + Note: In this example, represents a single NUL (U+0000) octet. + + +5. Security Considerations + + The PLAIN mechanism relies on the TLS encryption layer for security. + When used without TLS, it is vulnerable to a common network + eavesdropping attack. Therefore PLAIN MUST NOT be advertised or used + unless a suitable TLS encryption layer is active or backwards + compatibility dictates otherwise. + + When the PLAIN mechanism is used, the server gains the ability to + impersonate the user to all services with the same password regardless + of any encryption provided by TLS or other network privacy mechanisms. + While many other authentication mechanisms have similar weaknesses, + stronger SASL mechanisms such as the Kerberos-based GSSAPI mechanism + address this issue. Clients are encouraged to have an operational + mode where all mechanisms which are likely to reveal the user's + password to the server are disabled. + + Clients are encouraged to have an operational mode where all + mechanisms which are likely to reveal the user's password to the + server are disabled. It is RECOMMENDED that this mode be the default. + + The security considerations for SASL apply to the PLAIN mechanism. + + +6. IANA Considerations + + It is requested that the SASL Mechanism registry [IANA-SASL] entry for + the PLAIN mechanism be updated to reflect that this document now + provides its technical specification. + + To: iana@iana.org + Subject: Updated Registration of SASL mechanism PLAIN + + SASL mechanism name: PLAIN + Security considerations: See RFC XXXX. + Published specification (optional, recommended): RFC XXXX + Person & email address to contact for further information: + Kurt Zeilenga + Chris Neuman + Intended usage: COMMON + Author/Change controller: IESG + Note: Updates existing entry for PLAIN + + +7. Acknowledgement + + + +Zeilenga Plain SASL Mechanism [Page 4] + +INTERNET-DRAFT draft-zeilenga-sasl-plain-00.txt 23 June 2002 + + + This document is a revision of RFC 2595 by Chris Newman. + + +8. Normative References + + [ABNF] Crocker, D. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", RFC 2234, November 1997. + + [KEYWORDS] S. Bradner, "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14 (also RFC 2119), March 1997. + + [NFKC] Davis, M., M. Durst, "Unicode Standard Annex #15: Unicode + Normalisation Forms", An integral part of The Unicode + Standard, Version 3.2.0 + (http://www.unicode.org/reports/tr15/tr15-22.html). + + [SASL] Myers, J., "Simple Authentication and Security Layer + (SASL)", RFC 2222bis (a work in progress). + + [TLS] T. Dierks, C. Allen, "The TLS Protocol Version 1.0", RFC + 2246, January 1999. + + [UNICODE] The Unicode Consortium, "The Unicode Standard, Version + 3.2.0", defined by: The Unicode Standard, Version 3.0 + (Reading, MA, Addison-Wesley, 2000. ISBN 0-201-61633-5), + as amended by the Unicode Standard Annex #28: Unicode 3.2 + (http://www.unicode.org/reports/tr28/tr28-3.html). + + [UTF-8] Yergeau, F., "UTF-8, a transformation format of ISO + 10646", RFC 2279, January 1998. + + +9. Informative References + + [IANA-SASL] IANA, "SIMPLE AUTHENTICATION AND SECURITY LAYER (SASL) + MECHANISMS", http://www.iana.org/assignments/sasl- + mechanisms. + + [DIGEST-MD5] P. Leach, C. Newman, "Using Digest Authentication as a + SASL Mechanism", RFC 2831, May 2000. + + [CRAM-MD5] J. Klensin, R. Catoe, and P. Krumviede, "IMAP/POP + AUTHorize Extension for Simple Challenge/Response", RFC + 2195, September 1997. + + +10. Editor's Address + + + + +Zeilenga Plain SASL Mechanism [Page 5] + +INTERNET-DRAFT draft-zeilenga-sasl-plain-00.txt 23 June 2002 + + + Kurt Zeilenga + OpenLDAP Foundation + + Email: kurt@OpenLDAP.org + + +Appendix A. Changes since RFC 2595 + + Coming in next revision... + + + +Full Copyright Statement + + Copyright 2002, The Internet Society. All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published and + distributed, in whole or in part, without restriction of any kind, + provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be followed, + or as required to translate it into languages other than English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE AUTHORS, THE INTERNET SOCIETY, AND THE INTERNET + ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE + INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED + WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + + + + + + + + + + + + + +Zeilenga Plain SASL Mechanism [Page 6] + diff --git a/doc/specification/md5.txt b/doc/specification/md5.txt new file mode 100644 index 0000000..f0d8e49 --- /dev/null +++ b/doc/specification/md5.txt @@ -0,0 +1,78 @@ + MD5 Based Authentication + Mark Crispin + 1 November 1999 + + + The IMAP toolkit makes available two MD5 based authentication +mechanisms, CRAM-MD5 and APOP. CRAM-MD5 is described in RFC 2195, and +is a SASL (RFC 2222) authentication mechanism. APOP is described in +RFC 1939, the standard document for the POP3 protocol. + + These mechanisms use the same general idea. The server issues a +challenge; the client responds with an MD5 checksum of the challenge +plus the password; the server in compares the client's response with +its own calculated value of the checksum. If the client's response +matches the server's calulated value, the client is authenticated. + + Unlike plaintext passwords, this form of authentication is +believed to be secure against the session being monitored; "sniffing" +the session will not disclose the password nor will it provide usable +information to authenticate in another session without knowing the +password. + + The key disadvantage with this form of authentication is that the +server must know a plaintext form of the password. In traditional +UNIX authentication, the server only knows an encrypted form of the +password. Consequently, the authentication database for this form of +authentication must be kept strictly confidential; a bad guy who +acquires access to this database can access any account in the +database. + + CRAM-MD5 client support is implemented unconditionally; any +client application built with the IMAP toolkit will use CRAM-MD5 with +any server which advertises CRAM-MD5 SASL support. + + CRAM-MD5 and APOP server support is implemented if, and only if, +the CRAM-MD5 authentication database exists. By default, the CRAM-MD5 +authentication database is in a UNIX file called + /etc/cram-md5.pwd +It is recommended that this file be protected 0400. + + NOTE: FAILURE TO PROTECT THIS FILE AGAINST UNAUTHORIZED + ACCESS WILL COMPROMSE CRAM-MD5 AND APOP AUTHENTICATION + FOR ALL USERS LISTED IN THIS DATABASE. + + If the CRAM-MD5 authentication database exists, then plaintext +password authentication (e.g. the LOGIN command) will also use the +CRAM-MD5 passwords instead of UNIX passwords. Alternatively, it is +possible to build the IMAP toolkit so that plaintext password +authentication is disabled entirely, by using PASSWDTYPE=nul, e.g. + make aix PASSWDTYPE=nul + + + The CRAM-MD5 authentication database file consists of a series of +text lines, consisting of a UNIX user name, a single tab, and the +password. A line starting with a "#" character is ignored, as are any +lines which are not in valid format. For example: + +------------------------------Sample------------------------------ +# CRAM-MD5 authentication database +# Entries are in form +# Lines starting with "#" are comments + +bill hubba-hubba +hillary nysenator +monica beret +tripp wired +kenstarr inquisitor +reno waco +jessie thebody +billgates ruleworld +------------------------------Sample------------------------------ + + Every entry in the CRAM-MD5 authentication database must have a +corresponding entry in the /etc/passwd file. It is STRONGLY +RECOMMENDED that the CRAM-MD5 password NOT be the same as the +/etc/passwd password. It is permitted for the /etc/passwd password to +be disabled; /etc/passwd is just used to get the UID, GID, and home +directory information. diff --git a/doc/specification/rfc1321.txt b/doc/specification/rfc1321.txt new file mode 100644 index 0000000..68af27d --- /dev/null +++ b/doc/specification/rfc1321.txt @@ -0,0 +1,1179 @@ + + + + + + +Network Working Group R. Rivest +Request for Comments: 1321 MIT Laboratory for Computer Science + and RSA Data Security, Inc. + April 1992 + + + The MD5 Message-Digest Algorithm + +Status of this Memo + + This memo provides information for the Internet community. It does + not specify an Internet standard. Distribution of this memo is + unlimited. + +Acknowlegements + + We would like to thank Don Coppersmith, Burt Kaliski, Ralph Merkle, + David Chaum, and Noam Nisan for numerous helpful comments and + suggestions. + +Table of Contents + + 1. Executive Summary 1 + 2. Terminology and Notation 2 + 3. MD5 Algorithm Description 3 + 4. Summary 6 + 5. Differences Between MD4 and MD5 6 + References 7 + APPENDIX A - Reference Implementation 7 + Security Considerations 21 + Author's Address 21 + +1. Executive Summary + + This document describes the MD5 message-digest algorithm. The + algorithm takes as input a message of arbitrary length and produces + as output a 128-bit "fingerprint" or "message digest" of the input. + It is conjectured that it is computationally infeasible to produce + two messages having the same message digest, or to produce any + message having a given prespecified target message digest. The MD5 + algorithm is intended for digital signature applications, where a + large file must be "compressed" in a secure manner before being + encrypted with a private (secret) key under a public-key cryptosystem + such as RSA. + + + + + + + +Rivest [Page 1] + +RFC 1321 MD5 Message-Digest Algorithm April 1992 + + + The MD5 algorithm is designed to be quite fast on 32-bit machines. In + addition, the MD5 algorithm does not require any large substitution + tables; the algorithm can be coded quite compactly. + + The MD5 algorithm is an extension of the MD4 message-digest algorithm + 1,2]. MD5 is slightly slower than MD4, but is more "conservative" in + design. MD5 was designed because it was felt that MD4 was perhaps + being adopted for use more quickly than justified by the existing + critical review; because MD4 was designed to be exceptionally fast, + it is "at the edge" in terms of risking successful cryptanalytic + attack. MD5 backs off a bit, giving up a little in speed for a much + greater likelihood of ultimate security. It incorporates some + suggestions made by various reviewers, and contains additional + optimizations. The MD5 algorithm is being placed in the public domain + for review and possible adoption as a standard. + + For OSI-based applications, MD5's object identifier is + + md5 OBJECT IDENTIFIER ::= + iso(1) member-body(2) US(840) rsadsi(113549) digestAlgorithm(2) 5} + + In the X.509 type AlgorithmIdentifier [3], the parameters for MD5 + should have type NULL. + +2. Terminology and Notation + + In this document a "word" is a 32-bit quantity and a "byte" is an + eight-bit quantity. A sequence of bits can be interpreted in a + natural manner as a sequence of bytes, where each consecutive group + of eight bits is interpreted as a byte with the high-order (most + significant) bit of each byte listed first. Similarly, a sequence of + bytes can be interpreted as a sequence of 32-bit words, where each + consecutive group of four bytes is interpreted as a word with the + low-order (least significant) byte given first. + + Let x_i denote "x sub i". If the subscript is an expression, we + surround it in braces, as in x_{i+1}. Similarly, we use ^ for + superscripts (exponentiation), so that x^i denotes x to the i-th + power. + + Let the symbol "+" denote addition of words (i.e., modulo-2^32 + addition). Let X <<< s denote the 32-bit value obtained by circularly + shifting (rotating) X left by s bit positions. Let not(X) denote the + bit-wise complement of X, and let X v Y denote the bit-wise OR of X + and Y. Let X xor Y denote the bit-wise XOR of X and Y, and let XY + denote the bit-wise AND of X and Y. + + + + + +Rivest [Page 2] + +RFC 1321 MD5 Message-Digest Algorithm April 1992 + + +3. MD5 Algorithm Description + + We begin by supposing that we have a b-bit message as input, and that + we wish to find its message digest. Here b is an arbitrary + nonnegative integer; b may be zero, it need not be a multiple of + eight, and it may be arbitrarily large. We imagine the bits of the + message written down as follows: + + m_0 m_1 ... m_{b-1} + + The following five steps are performed to compute the message digest + of the message. + +3.1 Step 1. Append Padding Bits + + The message is "padded" (extended) so that its length (in bits) is + congruent to 448, modulo 512. That is, the message is extended so + that it is just 64 bits shy of being a multiple of 512 bits long. + Padding is always performed, even if the length of the message is + already congruent to 448, modulo 512. + + Padding is performed as follows: a single "1" bit is appended to the + message, and then "0" bits are appended so that the length in bits of + the padded message becomes congruent to 448, modulo 512. In all, at + least one bit and at most 512 bits are appended. + +3.2 Step 2. Append Length + + A 64-bit representation of b (the length of the message before the + padding bits were added) is appended to the result of the previous + step. In the unlikely event that b is greater than 2^64, then only + the low-order 64 bits of b are used. (These bits are appended as two + 32-bit words and appended low-order word first in accordance with the + previous conventions.) + + At this point the resulting message (after padding with bits and with + b) has a length that is an exact multiple of 512 bits. Equivalently, + this message has a length that is an exact multiple of 16 (32-bit) + words. Let M[0 ... N-1] denote the words of the resulting message, + where N is a multiple of 16. + +3.3 Step 3. Initialize MD Buffer + + A four-word buffer (A,B,C,D) is used to compute the message digest. + Here each of A, B, C, D is a 32-bit register. These registers are + initialized to the following values in hexadecimal, low-order bytes + first): + + + + +Rivest [Page 3] + +RFC 1321 MD5 Message-Digest Algorithm April 1992 + + + word A: 01 23 45 67 + word B: 89 ab cd ef + word C: fe dc ba 98 + word D: 76 54 32 10 + +3.4 Step 4. Process Message in 16-Word Blocks + + We first define four auxiliary functions that each take as input + three 32-bit words and produce as output one 32-bit word. + + F(X,Y,Z) = XY v not(X) Z + G(X,Y,Z) = XZ v Y not(Z) + H(X,Y,Z) = X xor Y xor Z + I(X,Y,Z) = Y xor (X v not(Z)) + + In each bit position F acts as a conditional: if X then Y else Z. + The function F could have been defined using + instead of v since XY + and not(X)Z will never have 1's in the same bit position.) It is + interesting to note that if the bits of X, Y, and Z are independent + and unbiased, the each bit of F(X,Y,Z) will be independent and + unbiased. + + The functions G, H, and I are similar to the function F, in that they + act in "bitwise parallel" to produce their output from the bits of X, + Y, and Z, in such a manner that if the corresponding bits of X, Y, + and Z are independent and unbiased, then each bit of G(X,Y,Z), + H(X,Y,Z), and I(X,Y,Z) will be independent and unbiased. Note that + the function H is the bit-wise "xor" or "parity" function of its + inputs. + + This step uses a 64-element table T[1 ... 64] constructed from the + sine function. Let T[i] denote the i-th element of the table, which + is equal to the integer part of 4294967296 times abs(sin(i)), where i + is in radians. The elements of the table are given in the appendix. + + Do the following: + + /* Process each 16-word block. */ + For i = 0 to N/16-1 do + + /* Copy block i into X. */ + For j = 0 to 15 do + Set X[j] to M[i*16+j]. + end /* of loop on j */ + + /* Save A as AA, B as BB, C as CC, and D as DD. */ + AA = A + BB = B + + + +Rivest [Page 4] + +RFC 1321 MD5 Message-Digest Algorithm April 1992 + + + CC = C + DD = D + + /* Round 1. */ + /* Let [abcd k s i] denote the operation + a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ + /* Do the following 16 operations. */ + [ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4] + [ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8] + [ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12] + [ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16] + + /* Round 2. */ + /* Let [abcd k s i] denote the operation + a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ + /* Do the following 16 operations. */ + [ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20] + [ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24] + [ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28] + [ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32] + + /* Round 3. */ + /* Let [abcd k s t] denote the operation + a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ + /* Do the following 16 operations. */ + [ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36] + [ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40] + [ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44] + [ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48] + + /* Round 4. */ + /* Let [abcd k s t] denote the operation + a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ + /* Do the following 16 operations. */ + [ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52] + [ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56] + [ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60] + [ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64] + + /* Then perform the following additions. (That is increment each + of the four registers by the value it had before this block + was started.) */ + A = A + AA + B = B + BB + C = C + CC + D = D + DD + + end /* of loop on i */ + + + +Rivest [Page 5] + +RFC 1321 MD5 Message-Digest Algorithm April 1992 + + +3.5 Step 5. Output + + The message digest produced as output is A, B, C, D. That is, we + begin with the low-order byte of A, and end with the high-order byte + of D. + + This completes the description of MD5. A reference implementation in + C is given in the appendix. + +4. Summary + + The MD5 message-digest algorithm is simple to implement, and provides + a "fingerprint" or message digest of a message of arbitrary length. + It is conjectured that the difficulty of coming up with two messages + having the same message digest is on the order of 2^64 operations, + and that the difficulty of coming up with any message having a given + message digest is on the order of 2^128 operations. The MD5 algorithm + has been carefully scrutinized for weaknesses. It is, however, a + relatively new algorithm and further security analysis is of course + justified, as is the case with any new proposal of this sort. + +5. Differences Between MD4 and MD5 + + The following are the differences between MD4 and MD5: + + 1. A fourth round has been added. + + 2. Each step now has a unique additive constant. + + 3. The function g in round 2 was changed from (XY v XZ v YZ) to + (XZ v Y not(Z)) to make g less symmetric. + + 4. Each step now adds in the result of the previous step. This + promotes a faster "avalanche effect". + + 5. The order in which input words are accessed in rounds 2 and + 3 is changed, to make these patterns less like each other. + + 6. The shift amounts in each round have been approximately + optimized, to yield a faster "avalanche effect." The shifts in + different rounds are distinct. + + + + + + + + + + +Rivest [Page 6] + +RFC 1321 MD5 Message-Digest Algorithm April 1992 + + +References + + [1] Rivest, R., "The MD4 Message Digest Algorithm", RFC 1320, MIT and + RSA Data Security, Inc., April 1992. + + [2] Rivest, R., "The MD4 message digest algorithm", in A.J. Menezes + and S.A. Vanstone, editors, Advances in Cryptology - CRYPTO '90 + Proceedings, pages 303-311, Springer-Verlag, 1991. + + [3] CCITT Recommendation X.509 (1988), "The Directory - + Authentication Framework." + +APPENDIX A - Reference Implementation + + This appendix contains the following files taken from RSAREF: A + Cryptographic Toolkit for Privacy-Enhanced Mail: + + global.h -- global header file + + md5.h -- header file for MD5 + + md5c.c -- source code for MD5 + + For more information on RSAREF, send email to . + + The appendix also includes the following file: + + mddriver.c -- test driver for MD2, MD4 and MD5 + + The driver compiles for MD5 by default but can compile for MD2 or MD4 + if the symbol MD is defined on the C compiler command line as 2 or 4. + + The implementation is portable and should work on many different + plaforms. However, it is not difficult to optimize the implementation + on particular platforms, an exercise left to the reader. For example, + on "little-endian" platforms where the lowest-addressed byte in a 32- + bit word is the least significant and there are no alignment + restrictions, the call to Decode in MD5Transform can be replaced with + a typecast. + +A.1 global.h + +/* GLOBAL.H - RSAREF types and constants + */ + +/* PROTOTYPES should be set to one if and only if the compiler supports + function argument prototyping. +The following makes PROTOTYPES default to 0 if it has not already + + + +Rivest [Page 7] + +RFC 1321 MD5 Message-Digest Algorithm April 1992 + + + been defined with C compiler flags. + */ +#ifndef PROTOTYPES +#define PROTOTYPES 0 +#endif + +/* POINTER defines a generic pointer type */ +typedef unsigned char *POINTER; + +/* UINT2 defines a two byte word */ +typedef unsigned short int UINT2; + +/* UINT4 defines a four byte word */ +typedef unsigned long int UINT4; + +/* PROTO_LIST is defined depending on how PROTOTYPES is defined above. +If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it + returns an empty list. + */ +#if PROTOTYPES +#define PROTO_LIST(list) list +#else +#define PROTO_LIST(list) () +#endif + +A.2 md5.h + +/* MD5.H - header file for MD5C.C + */ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +rights reserved. + +License to copy and use this software is granted provided that it +is identified as the "RSA Data Security, Inc. MD5 Message-Digest +Algorithm" in all material mentioning or referencing this software +or this function. + +License is also granted to make and use derivative works provided +that such works are identified as "derived from the RSA Data +Security, Inc. MD5 Message-Digest Algorithm" in all material +mentioning or referencing the derived work. + +RSA Data Security, Inc. makes no representations concerning either +the merchantability of this software or the suitability of this +software for any particular purpose. It is provided "as is" +without express or implied warranty of any kind. + + + + +Rivest [Page 8] + +RFC 1321 MD5 Message-Digest Algorithm April 1992 + + +These notices must be retained in any copies of any part of this +documentation and/or software. + */ + +/* MD5 context. */ +typedef struct { + UINT4 state[4]; /* state (ABCD) */ + UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */ + unsigned char buffer[64]; /* input buffer */ +} MD5_CTX; + +void MD5Init PROTO_LIST ((MD5_CTX *)); +void MD5Update PROTO_LIST + ((MD5_CTX *, unsigned char *, unsigned int)); +void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *)); + +A.3 md5c.c + +/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm + */ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +rights reserved. + +License to copy and use this software is granted provided that it +is identified as the "RSA Data Security, Inc. MD5 Message-Digest +Algorithm" in all material mentioning or referencing this software +or this function. + +License is also granted to make and use derivative works provided +that such works are identified as "derived from the RSA Data +Security, Inc. MD5 Message-Digest Algorithm" in all material +mentioning or referencing the derived work. + +RSA Data Security, Inc. makes no representations concerning either +the merchantability of this software or the suitability of this +software for any particular purpose. It is provided "as is" +without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this +documentation and/or software. + */ + +#include "global.h" +#include "md5.h" + +/* Constants for MD5Transform routine. + */ + + + +Rivest [Page 9] + +RFC 1321 MD5 Message-Digest Algorithm April 1992 + + +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + +static void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64])); +static void Encode PROTO_LIST + ((unsigned char *, UINT4 *, unsigned int)); +static void Decode PROTO_LIST + ((UINT4 *, unsigned char *, unsigned int)); +static void MD5_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int)); +static void MD5_memset PROTO_LIST ((POINTER, int, unsigned int)); + +static unsigned char PADDING[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* F, G, H and I are basic MD5 functions. + */ +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define I(x, y, z) ((y) ^ ((x) | (~z))) + +/* ROTATE_LEFT rotates x left n bits. + */ +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) + +/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. +Rotation is separate from addition to prevent recomputation. + */ +#define FF(a, b, c, d, x, s, ac) { \ + (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + + + +Rivest [Page 10] + +RFC 1321 MD5 Message-Digest Algorithm April 1992 + + + (a) += (b); \ + } +#define GG(a, b, c, d, x, s, ac) { \ + (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define HH(a, b, c, d, x, s, ac) { \ + (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define II(a, b, c, d, x, s, ac) { \ + (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } + +/* MD5 initialization. Begins an MD5 operation, writing a new context. + */ +void MD5Init (context) +MD5_CTX *context; /* context */ +{ + context->count[0] = context->count[1] = 0; + /* Load magic initialization constants. +*/ + context->state[0] = 0x67452301; + context->state[1] = 0xefcdab89; + context->state[2] = 0x98badcfe; + context->state[3] = 0x10325476; +} + +/* MD5 block update operation. Continues an MD5 message-digest + operation, processing another message block, and updating the + context. + */ +void MD5Update (context, input, inputLen) +MD5_CTX *context; /* context */ +unsigned char *input; /* input block */ +unsigned int inputLen; /* length of input block */ +{ + unsigned int i, index, partLen; + + /* Compute number of bytes mod 64 */ + index = (unsigned int)((context->count[0] >> 3) & 0x3F); + + /* Update number of bits */ + if ((context->count[0] += ((UINT4)inputLen << 3)) + + + +Rivest [Page 11] + +RFC 1321 MD5 Message-Digest Algorithm April 1992 + + + < ((UINT4)inputLen << 3)) + context->count[1]++; + context->count[1] += ((UINT4)inputLen >> 29); + + partLen = 64 - index; + + /* Transform as many times as possible. +*/ + if (inputLen >= partLen) { + MD5_memcpy + ((POINTER)&context->buffer[index], (POINTER)input, partLen); + MD5Transform (context->state, context->buffer); + + for (i = partLen; i + 63 < inputLen; i += 64) + MD5Transform (context->state, &input[i]); + + index = 0; + } + else + i = 0; + + /* Buffer remaining input */ + MD5_memcpy + ((POINTER)&context->buffer[index], (POINTER)&input[i], + inputLen-i); +} + +/* MD5 finalization. Ends an MD5 message-digest operation, writing the + the message digest and zeroizing the context. + */ +void MD5Final (digest, context) +unsigned char digest[16]; /* message digest */ +MD5_CTX *context; /* context */ +{ + unsigned char bits[8]; + unsigned int index, padLen; + + /* Save number of bits */ + Encode (bits, context->count, 8); + + /* Pad out to 56 mod 64. +*/ + index = (unsigned int)((context->count[0] >> 3) & 0x3f); + padLen = (index < 56) ? (56 - index) : (120 - index); + MD5Update (context, PADDING, padLen); + + /* Append length (before padding) */ + MD5Update (context, bits, 8); + + + +Rivest [Page 12] + +RFC 1321 MD5 Message-Digest Algorithm April 1992 + + + /* Store state in digest */ + Encode (digest, context->state, 16); + + /* Zeroize sensitive information. +*/ + MD5_memset ((POINTER)context, 0, sizeof (*context)); +} + +/* MD5 basic transformation. Transforms state based on block. + */ +static void MD5Transform (state, block) +UINT4 state[4]; +unsigned char block[64]; +{ + UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; + + Decode (x, block, 64); + + /* Round 1 */ + FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ + FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ + FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ + FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ + FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ + FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ + FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ + FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ + FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ + FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ + FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + + /* Round 2 */ + GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ + GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ + GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ + GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ + GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ + GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ + GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ + GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ + + + +Rivest [Page 13] + +RFC 1321 MD5 Message-Digest Algorithm April 1992 + + + GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ + GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ + GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ + GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + + /* Round 3 */ + HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ + HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ + HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ + HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ + HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ + HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ + HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ + HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ + HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ + HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ + + /* Round 4 */ + II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ + II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ + II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ + II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ + II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ + II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ + II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ + II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ + II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ + II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + + /* Zeroize sensitive information. + + + +Rivest [Page 14] + +RFC 1321 MD5 Message-Digest Algorithm April 1992 + + +*/ + MD5_memset ((POINTER)x, 0, sizeof (x)); +} + +/* Encodes input (UINT4) into output (unsigned char). Assumes len is + a multiple of 4. + */ +static void Encode (output, input, len) +unsigned char *output; +UINT4 *input; +unsigned int len; +{ + unsigned int i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) { + output[j] = (unsigned char)(input[i] & 0xff); + output[j+1] = (unsigned char)((input[i] >> 8) & 0xff); + output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); + output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); + } +} + +/* Decodes input (unsigned char) into output (UINT4). Assumes len is + a multiple of 4. + */ +static void Decode (output, input, len) +UINT4 *output; +unsigned char *input; +unsigned int len; +{ + unsigned int i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) + output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) | + (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24); +} + +/* Note: Replace "for loop" with standard memcpy if possible. + */ + +static void MD5_memcpy (output, input, len) +POINTER output; +POINTER input; +unsigned int len; +{ + unsigned int i; + + for (i = 0; i < len; i++) + + + +Rivest [Page 15] + +RFC 1321 MD5 Message-Digest Algorithm April 1992 + + + output[i] = input[i]; +} + +/* Note: Replace "for loop" with standard memset if possible. + */ +static void MD5_memset (output, value, len) +POINTER output; +int value; +unsigned int len; +{ + unsigned int i; + + for (i = 0; i < len; i++) + ((char *)output)[i] = (char)value; +} + +A.4 mddriver.c + +/* MDDRIVER.C - test driver for MD2, MD4 and MD5 + */ + +/* Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All +rights reserved. + +RSA Data Security, Inc. makes no representations concerning either +the merchantability of this software or the suitability of this +software for any particular purpose. It is provided "as is" +without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this +documentation and/or software. + */ + +/* The following makes MD default to MD5 if it has not already been + defined with C compiler flags. + */ +#ifndef MD +#define MD MD5 +#endif + +#include +#include +#include +#include "global.h" +#if MD == 2 +#include "md2.h" +#endif +#if MD == 4 + + + +Rivest [Page 16] + +RFC 1321 MD5 Message-Digest Algorithm April 1992 + + +#include "md4.h" +#endif +#if MD == 5 +#include "md5.h" +#endif + +/* Length of test block, number of test blocks. + */ +#define TEST_BLOCK_LEN 1000 +#define TEST_BLOCK_COUNT 1000 + +static void MDString PROTO_LIST ((char *)); +static void MDTimeTrial PROTO_LIST ((void)); +static void MDTestSuite PROTO_LIST ((void)); +static void MDFile PROTO_LIST ((char *)); +static void MDFilter PROTO_LIST ((void)); +static void MDPrint PROTO_LIST ((unsigned char [16])); + +#if MD == 2 +#define MD_CTX MD2_CTX +#define MDInit MD2Init +#define MDUpdate MD2Update +#define MDFinal MD2Final +#endif +#if MD == 4 +#define MD_CTX MD4_CTX +#define MDInit MD4Init +#define MDUpdate MD4Update +#define MDFinal MD4Final +#endif +#if MD == 5 +#define MD_CTX MD5_CTX +#define MDInit MD5Init +#define MDUpdate MD5Update +#define MDFinal MD5Final +#endif + +/* Main driver. + +Arguments (may be any combination): + -sstring - digests string + -t - runs time trial + -x - runs test script + filename - digests file + (none) - digests standard input + */ +int main (argc, argv) +int argc; + + + +Rivest [Page 17] + +RFC 1321 MD5 Message-Digest Algorithm April 1992 + + +char *argv[]; +{ + int i; + + if (argc > 1) + for (i = 1; i < argc; i++) + if (argv[i][0] == '-' && argv[i][1] == 's') + MDString (argv[i] + 2); + else if (strcmp (argv[i], "-t") == 0) + MDTimeTrial (); + else if (strcmp (argv[i], "-x") == 0) + MDTestSuite (); + else + MDFile (argv[i]); + else + MDFilter (); + + return (0); +} + +/* Digests a string and prints the result. + */ +static void MDString (string) +char *string; +{ + MD_CTX context; + unsigned char digest[16]; + unsigned int len = strlen (string); + + MDInit (&context); + MDUpdate (&context, string, len); + MDFinal (digest, &context); + + printf ("MD%d (\"%s\") = ", MD, string); + MDPrint (digest); + printf ("\n"); +} + +/* Measures the time to digest TEST_BLOCK_COUNT TEST_BLOCK_LEN-byte + blocks. + */ +static void MDTimeTrial () +{ + MD_CTX context; + time_t endTime, startTime; + unsigned char block[TEST_BLOCK_LEN], digest[16]; + unsigned int i; + + + + +Rivest [Page 18] + +RFC 1321 MD5 Message-Digest Algorithm April 1992 + + + printf + ("MD%d time trial. Digesting %d %d-byte blocks ...", MD, + TEST_BLOCK_LEN, TEST_BLOCK_COUNT); + + /* Initialize block */ + for (i = 0; i < TEST_BLOCK_LEN; i++) + block[i] = (unsigned char)(i & 0xff); + + /* Start timer */ + time (&startTime); + + /* Digest blocks */ + MDInit (&context); + for (i = 0; i < TEST_BLOCK_COUNT; i++) + MDUpdate (&context, block, TEST_BLOCK_LEN); + MDFinal (digest, &context); + + /* Stop timer */ + time (&endTime); + + printf (" done\n"); + printf ("Digest = "); + MDPrint (digest); + printf ("\nTime = %ld seconds\n", (long)(endTime-startTime)); + printf + ("Speed = %ld bytes/second\n", + (long)TEST_BLOCK_LEN * (long)TEST_BLOCK_COUNT/(endTime-startTime)); +} + +/* Digests a reference suite of strings and prints the results. + */ +static void MDTestSuite () +{ + printf ("MD%d test suite:\n", MD); + + MDString (""); + MDString ("a"); + MDString ("abc"); + MDString ("message digest"); + MDString ("abcdefghijklmnopqrstuvwxyz"); + MDString + ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"); + MDString + ("1234567890123456789012345678901234567890\ +1234567890123456789012345678901234567890"); +} + +/* Digests a file and prints the result. + + + +Rivest [Page 19] + +RFC 1321 MD5 Message-Digest Algorithm April 1992 + + + */ +static void MDFile (filename) +char *filename; +{ + FILE *file; + MD_CTX context; + int len; + unsigned char buffer[1024], digest[16]; + + if ((file = fopen (filename, "rb")) == NULL) + printf ("%s can't be opened\n", filename); + + else { + MDInit (&context); + while (len = fread (buffer, 1, 1024, file)) + MDUpdate (&context, buffer, len); + MDFinal (digest, &context); + + fclose (file); + + printf ("MD%d (%s) = ", MD, filename); + MDPrint (digest); + printf ("\n"); + } +} + +/* Digests the standard input and prints the result. + */ +static void MDFilter () +{ + MD_CTX context; + int len; + unsigned char buffer[16], digest[16]; + + MDInit (&context); + while (len = fread (buffer, 1, 16, stdin)) + MDUpdate (&context, buffer, len); + MDFinal (digest, &context); + + MDPrint (digest); + printf ("\n"); +} + +/* Prints a message digest in hexadecimal. + */ +static void MDPrint (digest) +unsigned char digest[16]; +{ + + + +Rivest [Page 20] + +RFC 1321 MD5 Message-Digest Algorithm April 1992 + + + unsigned int i; + + for (i = 0; i < 16; i++) + printf ("%02x", digest[i]); +} + +A.5 Test suite + + The MD5 test suite (driver option "-x") should print the following + results: + +MD5 test suite: +MD5 ("") = d41d8cd98f00b204e9800998ecf8427e +MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661 +MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72 +MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0 +MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b +MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = +d174ab98d277d9f5a5611c2c9f419d9f +MD5 ("123456789012345678901234567890123456789012345678901234567890123456 +78901234567890") = 57edf4a22be3c955ac49da2e2107b67a + +Security Considerations + + The level of security discussed in this memo is considered to be + sufficient for implementing very high security hybrid digital- + signature schemes based on MD5 and a public-key cryptosystem. + +Author's Address + + Ronald L. Rivest + Massachusetts Institute of Technology + Laboratory for Computer Science + NE43-324 + 545 Technology Square + Cambridge, MA 02139-1986 + + Phone: (617) 253-5880 + EMail: rivest@theory.lcs.mit.edu + + + + + + + + + + + + +Rivest [Page 21] + \ No newline at end of file diff --git a/doc/specification/rfc1939.txt b/doc/specification/rfc1939.txt new file mode 100644 index 0000000..b11350e --- /dev/null +++ b/doc/specification/rfc1939.txt @@ -0,0 +1,1291 @@ + + + + + + +Network Working Group J. Myers +Request for Comments: 1939 Carnegie Mellon +STD: 53 M. Rose +Obsoletes: 1725 Dover Beach Consulting, Inc. +Category: Standards Track May 1996 + + + Post Office Protocol - Version 3 + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Table of Contents + + 1. Introduction ................................................ 2 + 2. A Short Digression .......................................... 2 + 3. Basic Operation ............................................. 3 + 4. The AUTHORIZATION State ..................................... 4 + QUIT Command ................................................ 5 + 5. The TRANSACTION State ....................................... 5 + STAT Command ................................................ 6 + LIST Command ................................................ 6 + RETR Command ................................................ 8 + DELE Command ................................................ 8 + NOOP Command ................................................ 9 + RSET Command ................................................ 9 + 6. The UPDATE State ............................................ 10 + QUIT Command ................................................ 10 + 7. Optional POP3 Commands ...................................... 11 + TOP Command ................................................. 11 + UIDL Command ................................................ 12 + USER Command ................................................ 13 + PASS Command ................................................ 14 + APOP Command ................................................ 15 + 8. Scaling and Operational Considerations ...................... 16 + 9. POP3 Command Summary ........................................ 18 + 10. Example POP3 Session ....................................... 19 + 11. Message Format ............................................. 19 + 12. References ................................................. 20 + 13. Security Considerations .................................... 20 + 14. Acknowledgements ........................................... 20 + 15. Authors' Addresses ......................................... 21 + Appendix A. Differences from RFC 1725 .......................... 22 + + + +Myers & Rose Standards Track [Page 1] + +RFC 1939 POP3 May 1996 + + + Appendix B. Command Index ...................................... 23 + +1. Introduction + + On certain types of smaller nodes in the Internet it is often + impractical to maintain a message transport system (MTS). For + example, a workstation may not have sufficient resources (cycles, + disk space) in order to permit a SMTP server [RFC821] and associated + local mail delivery system to be kept resident and continuously + running. Similarly, it may be expensive (or impossible) to keep a + personal computer interconnected to an IP-style network for long + amounts of time (the node is lacking the resource known as + "connectivity"). + + Despite this, it is often very useful to be able to manage mail on + these smaller nodes, and they often support a user agent (UA) to aid + the tasks of mail handling. To solve this problem, a node which can + support an MTS entity offers a maildrop service to these less endowed + nodes. The Post Office Protocol - Version 3 (POP3) is intended to + permit a workstation to dynamically access a maildrop on a server + host in a useful fashion. Usually, this means that the POP3 protocol + is used to allow a workstation to retrieve mail that the server is + holding for it. + + POP3 is not intended to provide extensive manipulation operations of + mail on the server; normally, mail is downloaded and then deleted. A + more advanced (and complex) protocol, IMAP4, is discussed in + [RFC1730]. + + For the remainder of this memo, the term "client host" refers to a + host making use of the POP3 service, while the term "server host" + refers to a host which offers the POP3 service. + +2. A Short Digression + + This memo does not specify how a client host enters mail into the + transport system, although a method consistent with the philosophy of + this memo is presented here: + + When the user agent on a client host wishes to enter a message + into the transport system, it establishes an SMTP connection to + its relay host and sends all mail to it. This relay host could + be, but need not be, the POP3 server host for the client host. Of + course, the relay host must accept mail for delivery to arbitrary + recipient addresses, that functionality is not required of all + SMTP servers. + + + + + +Myers & Rose Standards Track [Page 2] + +RFC 1939 POP3 May 1996 + + +3. Basic Operation + + Initially, the server host starts the POP3 service by listening on + TCP port 110. When a client host wishes to make use of the service, + it establishes a TCP connection with the server host. When the + connection is established, the POP3 server sends a greeting. The + client and POP3 server then exchange commands and responses + (respectively) until the connection is closed or aborted. + + Commands in the POP3 consist of a case-insensitive keyword, possibly + followed by one or more arguments. All commands are terminated by a + CRLF pair. Keywords and arguments consist of printable ASCII + characters. Keywords and arguments are each separated by a single + SPACE character. Keywords are three or four characters long. Each + argument may be up to 40 characters long. + + Responses in the POP3 consist of a status indicator and a keyword + possibly followed by additional information. All responses are + terminated by a CRLF pair. Responses may be up to 512 characters + long, including the terminating CRLF. There are currently two status + indicators: positive ("+OK") and negative ("-ERR"). Servers MUST + send the "+OK" and "-ERR" in upper case. + + Responses to certain commands are multi-line. In these cases, which + are clearly indicated below, after sending the first line of the + response and a CRLF, any additional lines are sent, each terminated + by a CRLF pair. When all lines of the response have been sent, a + final line is sent, consisting of a termination octet (decimal code + 046, ".") and a CRLF pair. If any line of the multi-line response + begins with the termination octet, the line is "byte-stuffed" by + pre-pending the termination octet to that line of the response. + Hence a multi-line response is terminated with the five octets + "CRLF.CRLF". When examining a multi-line response, the client checks + to see if the line begins with the termination octet. If so and if + octets other than CRLF follow, the first octet of the line (the + termination octet) is stripped away. If so and if CRLF immediately + follows the termination character, then the response from the POP + server is ended and the line containing ".CRLF" is not considered + part of the multi-line response. + + A POP3 session progresses through a number of states during its + lifetime. Once the TCP connection has been opened and the POP3 + server has sent the greeting, the session enters the AUTHORIZATION + state. In this state, the client must identify itself to the POP3 + server. Once the client has successfully done this, the server + acquires resources associated with the client's maildrop, and the + session enters the TRANSACTION state. In this state, the client + requests actions on the part of the POP3 server. When the client has + + + +Myers & Rose Standards Track [Page 3] + +RFC 1939 POP3 May 1996 + + + issued the QUIT command, the session enters the UPDATE state. In + this state, the POP3 server releases any resources acquired during + the TRANSACTION state and says goodbye. The TCP connection is then + closed. + + A server MUST respond to an unrecognized, unimplemented, or + syntactically invalid command by responding with a negative status + indicator. A server MUST respond to a command issued when the + session is in an incorrect state by responding with a negative status + indicator. There is no general method for a client to distinguish + between a server which does not implement an optional command and a + server which is unwilling or unable to process the command. + + A POP3 server MAY have an inactivity autologout timer. Such a timer + MUST be of at least 10 minutes' duration. The receipt of any command + from the client during that interval should suffice to reset the + autologout timer. When the timer expires, the session does NOT enter + the UPDATE state--the server should close the TCP connection without + removing any messages or sending any response to the client. + +4. The AUTHORIZATION State + + Once the TCP connection has been opened by a POP3 client, the POP3 + server issues a one line greeting. This can be any positive + response. An example might be: + + S: +OK POP3 server ready + + The POP3 session is now in the AUTHORIZATION state. The client must + now identify and authenticate itself to the POP3 server. Two + possible mechanisms for doing this are described in this document, + the USER and PASS command combination and the APOP command. Both + mechanisms are described later in this document. Additional + authentication mechanisms are described in [RFC1734]. While there is + no single authentication mechanism that is required of all POP3 + servers, a POP3 server must of course support at least one + authentication mechanism. + + Once the POP3 server has determined through the use of any + authentication command that the client should be given access to the + appropriate maildrop, the POP3 server then acquires an exclusive- + access lock on the maildrop, as necessary to prevent messages from + being modified or removed before the session enters the UPDATE state. + If the lock is successfully acquired, the POP3 server responds with a + positive status indicator. The POP3 session now enters the + TRANSACTION state, with no messages marked as deleted. If the + maildrop cannot be opened for some reason (for example, a lock can + not be acquired, the client is denied access to the appropriate + + + +Myers & Rose Standards Track [Page 4] + +RFC 1939 POP3 May 1996 + + + maildrop, or the maildrop cannot be parsed), the POP3 server responds + with a negative status indicator. (If a lock was acquired but the + POP3 server intends to respond with a negative status indicator, the + POP3 server must release the lock prior to rejecting the command.) + After returning a negative status indicator, the server may close the + connection. If the server does not close the connection, the client + may either issue a new authentication command and start again, or the + client may issue the QUIT command. + + After the POP3 server has opened the maildrop, it assigns a message- + number to each message, and notes the size of each message in octets. + The first message in the maildrop is assigned a message-number of + "1", the second is assigned "2", and so on, so that the nth message + in a maildrop is assigned a message-number of "n". In POP3 commands + and responses, all message-numbers and message sizes are expressed in + base-10 (i.e., decimal). + + Here is the summary for the QUIT command when used in the + AUTHORIZATION state: + + QUIT + + Arguments: none + + Restrictions: none + + Possible Responses: + +OK + + Examples: + C: QUIT + S: +OK dewey POP3 server signing off + +5. The TRANSACTION State + + Once the client has successfully identified itself to the POP3 server + and the POP3 server has locked and opened the appropriate maildrop, + the POP3 session is now in the TRANSACTION state. The client may now + issue any of the following POP3 commands repeatedly. After each + command, the POP3 server issues a response. Eventually, the client + issues the QUIT command and the POP3 session enters the UPDATE state. + + + + + + + + + + +Myers & Rose Standards Track [Page 5] + +RFC 1939 POP3 May 1996 + + + Here are the POP3 commands valid in the TRANSACTION state: + + STAT + + Arguments: none + + Restrictions: + may only be given in the TRANSACTION state + + Discussion: + The POP3 server issues a positive response with a line + containing information for the maildrop. This line is + called a "drop listing" for that maildrop. + + In order to simplify parsing, all POP3 servers are + required to use a certain format for drop listings. The + positive response consists of "+OK" followed by a single + space, the number of messages in the maildrop, a single + space, and the size of the maildrop in octets. This memo + makes no requirement on what follows the maildrop size. + Minimal implementations should just end that line of the + response with a CRLF pair. More advanced implementations + may include other information. + + NOTE: This memo STRONGLY discourages implementations + from supplying additional information in the drop + listing. Other, optional, facilities are discussed + later on which permit the client to parse the messages + in the maildrop. + + Note that messages marked as deleted are not counted in + either total. + + Possible Responses: + +OK nn mm + + Examples: + C: STAT + S: +OK 2 320 + + + LIST [msg] + + Arguments: + a message-number (optional), which, if present, may NOT + refer to a message marked as deleted + + + + + +Myers & Rose Standards Track [Page 6] + +RFC 1939 POP3 May 1996 + + + Restrictions: + may only be given in the TRANSACTION state + + Discussion: + If an argument was given and the POP3 server issues a + positive response with a line containing information for + that message. This line is called a "scan listing" for + that message. + + If no argument was given and the POP3 server issues a + positive response, then the response given is multi-line. + After the initial +OK, for each message in the maildrop, + the POP3 server responds with a line containing + information for that message. This line is also called a + "scan listing" for that message. If there are no + messages in the maildrop, then the POP3 server responds + with no scan listings--it issues a positive response + followed by a line containing a termination octet and a + CRLF pair. + + In order to simplify parsing, all POP3 servers are + required to use a certain format for scan listings. A + scan listing consists of the message-number of the + message, followed by a single space and the exact size of + the message in octets. Methods for calculating the exact + size of the message are described in the "Message Format" + section below. This memo makes no requirement on what + follows the message size in the scan listing. Minimal + implementations should just end that line of the response + with a CRLF pair. More advanced implementations may + include other information, as parsed from the message. + + NOTE: This memo STRONGLY discourages implementations + from supplying additional information in the scan + listing. Other, optional, facilities are discussed + later on which permit the client to parse the messages + in the maildrop. + + Note that messages marked as deleted are not listed. + + Possible Responses: + +OK scan listing follows + -ERR no such message + + Examples: + C: LIST + S: +OK 2 messages (320 octets) + S: 1 120 + + + +Myers & Rose Standards Track [Page 7] + +RFC 1939 POP3 May 1996 + + + S: 2 200 + S: . + ... + C: LIST 2 + S: +OK 2 200 + ... + C: LIST 3 + S: -ERR no such message, only 2 messages in maildrop + + + RETR msg + + Arguments: + a message-number (required) which may NOT refer to a + message marked as deleted + + Restrictions: + may only be given in the TRANSACTION state + + Discussion: + If the POP3 server issues a positive response, then the + response given is multi-line. After the initial +OK, the + POP3 server sends the message corresponding to the given + message-number, being careful to byte-stuff the termination + character (as with all multi-line responses). + + Possible Responses: + +OK message follows + -ERR no such message + + Examples: + C: RETR 1 + S: +OK 120 octets + S: + S: . + + + DELE msg + + Arguments: + a message-number (required) which may NOT refer to a + message marked as deleted + + Restrictions: + may only be given in the TRANSACTION state + + + + + + +Myers & Rose Standards Track [Page 8] + +RFC 1939 POP3 May 1996 + + + Discussion: + The POP3 server marks the message as deleted. Any future + reference to the message-number associated with the message + in a POP3 command generates an error. The POP3 server does + not actually delete the message until the POP3 session + enters the UPDATE state. + + Possible Responses: + +OK message deleted + -ERR no such message + + Examples: + C: DELE 1 + S: +OK message 1 deleted + ... + C: DELE 2 + S: -ERR message 2 already deleted + + + NOOP + + Arguments: none + + Restrictions: + may only be given in the TRANSACTION state + + Discussion: + The POP3 server does nothing, it merely replies with a + positive response. + + Possible Responses: + +OK + + Examples: + C: NOOP + S: +OK + + + RSET + + Arguments: none + + Restrictions: + may only be given in the TRANSACTION state + + Discussion: + If any messages have been marked as deleted by the POP3 + server, they are unmarked. The POP3 server then replies + + + +Myers & Rose Standards Track [Page 9] + +RFC 1939 POP3 May 1996 + + + with a positive response. + + Possible Responses: + +OK + + Examples: + C: RSET + S: +OK maildrop has 2 messages (320 octets) + +6. The UPDATE State + + When the client issues the QUIT command from the TRANSACTION state, + the POP3 session enters the UPDATE state. (Note that if the client + issues the QUIT command from the AUTHORIZATION state, the POP3 + session terminates but does NOT enter the UPDATE state.) + + If a session terminates for some reason other than a client-issued + QUIT command, the POP3 session does NOT enter the UPDATE state and + MUST not remove any messages from the maildrop. + + QUIT + + Arguments: none + + Restrictions: none + + Discussion: + The POP3 server removes all messages marked as deleted + from the maildrop and replies as to the status of this + operation. If there is an error, such as a resource + shortage, encountered while removing messages, the + maildrop may result in having some or none of the messages + marked as deleted be removed. In no case may the server + remove any messages not marked as deleted. + + Whether the removal was successful or not, the server + then releases any exclusive-access lock on the maildrop + and closes the TCP connection. + + Possible Responses: + +OK + -ERR some deleted messages not removed + + Examples: + C: QUIT + S: +OK dewey POP3 server signing off (maildrop empty) + ... + C: QUIT + + + +Myers & Rose Standards Track [Page 10] + +RFC 1939 POP3 May 1996 + + + S: +OK dewey POP3 server signing off (2 messages left) + ... + +7. Optional POP3 Commands + + The POP3 commands discussed above must be supported by all minimal + implementations of POP3 servers. + + The optional POP3 commands described below permit a POP3 client + greater freedom in message handling, while preserving a simple POP3 + server implementation. + + NOTE: This memo STRONGLY encourages implementations to support + these commands in lieu of developing augmented drop and scan + listings. In short, the philosophy of this memo is to put + intelligence in the part of the POP3 client and not the POP3 + server. + + TOP msg n + + Arguments: + a message-number (required) which may NOT refer to to a + message marked as deleted, and a non-negative number + of lines (required) + + Restrictions: + may only be given in the TRANSACTION state + + Discussion: + If the POP3 server issues a positive response, then the + response given is multi-line. After the initial +OK, the + POP3 server sends the headers of the message, the blank + line separating the headers from the body, and then the + number of lines of the indicated message's body, being + careful to byte-stuff the termination character (as with + all multi-line responses). + + Note that if the number of lines requested by the POP3 + client is greater than than the number of lines in the + body, then the POP3 server sends the entire message. + + Possible Responses: + +OK top of message follows + -ERR no such message + + Examples: + C: TOP 1 10 + S: +OK + + + +Myers & Rose Standards Track [Page 11] + +RFC 1939 POP3 May 1996 + + + S: + S: . + ... + C: TOP 100 3 + S: -ERR no such message + + + UIDL [msg] + + Arguments: + a message-number (optional), which, if present, may NOT + refer to a message marked as deleted + + Restrictions: + may only be given in the TRANSACTION state. + + Discussion: + If an argument was given and the POP3 server issues a positive + response with a line containing information for that message. + This line is called a "unique-id listing" for that message. + + If no argument was given and the POP3 server issues a positive + response, then the response given is multi-line. After the + initial +OK, for each message in the maildrop, the POP3 server + responds with a line containing information for that message. + This line is called a "unique-id listing" for that message. + + In order to simplify parsing, all POP3 servers are required to + use a certain format for unique-id listings. A unique-id + listing consists of the message-number of the message, + followed by a single space and the unique-id of the message. + No information follows the unique-id in the unique-id listing. + + The unique-id of a message is an arbitrary server-determined + string, consisting of one to 70 characters in the range 0x21 + to 0x7E, which uniquely identifies a message within a + maildrop and which persists across sessions. This + persistence is required even if a session ends without + entering the UPDATE state. The server should never reuse an + unique-id in a given maildrop, for as long as the entity + using the unique-id exists. + + Note that messages marked as deleted are not listed. + + While it is generally preferable for server implementations + to store arbitrarily assigned unique-ids in the maildrop, + + + +Myers & Rose Standards Track [Page 12] + +RFC 1939 POP3 May 1996 + + + this specification is intended to permit unique-ids to be + calculated as a hash of the message. Clients should be able + to handle a situation where two identical copies of a + message in a maildrop have the same unique-id. + + Possible Responses: + +OK unique-id listing follows + -ERR no such message + + Examples: + C: UIDL + S: +OK + S: 1 whqtswO00WBw418f9t5JxYwZ + S: 2 QhdPYR:00WBw1Ph7x7 + S: . + ... + C: UIDL 2 + S: +OK 2 QhdPYR:00WBw1Ph7x7 + ... + C: UIDL 3 + S: -ERR no such message, only 2 messages in maildrop + + + USER name + + Arguments: + a string identifying a mailbox (required), which is of + significance ONLY to the server + + Restrictions: + may only be given in the AUTHORIZATION state after the POP3 + greeting or after an unsuccessful USER or PASS command + + Discussion: + To authenticate using the USER and PASS command + combination, the client must first issue the USER + command. If the POP3 server responds with a positive + status indicator ("+OK"), then the client may issue + either the PASS command to complete the authentication, + or the QUIT command to terminate the POP3 session. If + the POP3 server responds with a negative status indicator + ("-ERR") to the USER command, then the client may either + issue a new authentication command or may issue the QUIT + command. + + The server may return a positive response even though no + such mailbox exists. The server may return a negative + response if mailbox exists, but does not permit plaintext + + + +Myers & Rose Standards Track [Page 13] + +RFC 1939 POP3 May 1996 + + + password authentication. + + Possible Responses: + +OK name is a valid mailbox + -ERR never heard of mailbox name + + Examples: + C: USER frated + S: -ERR sorry, no mailbox for frated here + ... + C: USER mrose + S: +OK mrose is a real hoopy frood + + + PASS string + + Arguments: + a server/mailbox-specific password (required) + + Restrictions: + may only be given in the AUTHORIZATION state immediately + after a successful USER command + + Discussion: + When the client issues the PASS command, the POP3 server + uses the argument pair from the USER and PASS commands to + determine if the client should be given access to the + appropriate maildrop. + + Since the PASS command has exactly one argument, a POP3 + server may treat spaces in the argument as part of the + password, instead of as argument separators. + + Possible Responses: + +OK maildrop locked and ready + -ERR invalid password + -ERR unable to lock maildrop + + Examples: + C: USER mrose + S: +OK mrose is a real hoopy frood + C: PASS secret + S: -ERR maildrop already locked + ... + C: USER mrose + S: +OK mrose is a real hoopy frood + C: PASS secret + S: +OK mrose's maildrop has 2 messages (320 octets) + + + +Myers & Rose Standards Track [Page 14] + +RFC 1939 POP3 May 1996 + + + APOP name digest + + Arguments: + a string identifying a mailbox and a MD5 digest string + (both required) + + Restrictions: + may only be given in the AUTHORIZATION state after the POP3 + greeting or after an unsuccessful USER or PASS command + + Discussion: + Normally, each POP3 session starts with a USER/PASS + exchange. This results in a server/user-id specific + password being sent in the clear on the network. For + intermittent use of POP3, this may not introduce a sizable + risk. However, many POP3 client implementations connect to + the POP3 server on a regular basis -- to check for new + mail. Further the interval of session initiation may be on + the order of five minutes. Hence, the risk of password + capture is greatly enhanced. + + An alternate method of authentication is required which + provides for both origin authentication and replay + protection, but which does not involve sending a password + in the clear over the network. The APOP command provides + this functionality. + + A POP3 server which implements the APOP command will + include a timestamp in its banner greeting. The syntax of + the timestamp corresponds to the `msg-id' in [RFC822], and + MUST be different each time the POP3 server issues a banner + greeting. For example, on a UNIX implementation in which a + separate UNIX process is used for each instance of a POP3 + server, the syntax of the timestamp might be: + + + + where `process-ID' is the decimal value of the process's + PID, clock is the decimal value of the system clock, and + hostname is the fully-qualified domain-name corresponding + to the host where the POP3 server is running. + + The POP3 client makes note of this timestamp, and then + issues the APOP command. The `name' parameter has + identical semantics to the `name' parameter of the USER + command. The `digest' parameter is calculated by applying + the MD5 algorithm [RFC1321] to a string consisting of the + timestamp (including angle-brackets) followed by a shared + + + +Myers & Rose Standards Track [Page 15] + +RFC 1939 POP3 May 1996 + + + secret. This shared secret is a string known only to the + POP3 client and server. Great care should be taken to + prevent unauthorized disclosure of the secret, as knowledge + of the secret will allow any entity to successfully + masquerade as the named user. The `digest' parameter + itself is a 16-octet value which is sent in hexadecimal + format, using lower-case ASCII characters. + + When the POP3 server receives the APOP command, it verifies + the digest provided. If the digest is correct, the POP3 + server issues a positive response, and the POP3 session + enters the TRANSACTION state. Otherwise, a negative + response is issued and the POP3 session remains in the + AUTHORIZATION state. + + Note that as the length of the shared secret increases, so + does the difficulty of deriving it. As such, shared + secrets should be long strings (considerably longer than + the 8-character example shown below). + + Possible Responses: + +OK maildrop locked and ready + -ERR permission denied + + Examples: + S: +OK POP3 server ready <1896.697170952@dbc.mtview.ca.us> + C: APOP mrose c4c9334bac560ecc979e58001b3e22fb + S: +OK maildrop has 1 message (369 octets) + + In this example, the shared secret is the string `tan- + staaf'. Hence, the MD5 algorithm is applied to the string + + <1896.697170952@dbc.mtview.ca.us>tanstaaf + + which produces a digest value of + + c4c9334bac560ecc979e58001b3e22fb + +8. Scaling and Operational Considerations + + Since some of the optional features described above were added to the + POP3 protocol, experience has accumulated in using them in large- + scale commercial post office operations where most of the users are + unrelated to each other. In these situations and others, users and + vendors of POP3 clients have discovered that the combination of using + the UIDL command and not issuing the DELE command can provide a weak + version of the "maildrop as semi-permanent repository" functionality + normally associated with IMAP. Of course the other capabilities of + + + +Myers & Rose Standards Track [Page 16] + +RFC 1939 POP3 May 1996 + + + IMAP, such as polling an existing connection for newly arrived + messages and supporting multiple folders on the server, are not + present in POP3. + + When these facilities are used in this way by casual users, there has + been a tendency for already-read messages to accumulate on the server + without bound. This is clearly an undesirable behavior pattern from + the standpoint of the server operator. This situation is aggravated + by the fact that the limited capabilities of the POP3 do not permit + efficient handling of maildrops which have hundreds or thousands of + messages. + + Consequently, it is recommended that operators of large-scale multi- + user servers, especially ones in which the user's only access to the + maildrop is via POP3, consider such options as: + + * Imposing a per-user maildrop storage quota or the like. + + A disadvantage to this option is that accumulation of messages may + result in the user's inability to receive new ones into the + maildrop. Sites which choose this option should be sure to inform + users of impending or current exhaustion of quota, perhaps by + inserting an appropriate message into the user's maildrop. + + * Enforce a site policy regarding mail retention on the server. + + Sites are free to establish local policy regarding the storage and + retention of messages on the server, both read and unread. For + example, a site might delete unread messages from the server after + 60 days and delete read messages after 7 days. Such message + deletions are outside the scope of the POP3 protocol and are not + considered a protocol violation. + + Server operators enforcing message deletion policies should take + care to make all users aware of the policies in force. + + Clients must not assume that a site policy will automate message + deletions, and should continue to explicitly delete messages using + the DELE command when appropriate. + + It should be noted that enforcing site message deletion policies + may be confusing to the user community, since their POP3 client + may contain configuration options to leave mail on the server + which will not in fact be supported by the server. + + One special case of a site policy is that messages may only be + downloaded once from the server, and are deleted after this has + been accomplished. This could be implemented in POP3 server + + + +Myers & Rose Standards Track [Page 17] + +RFC 1939 POP3 May 1996 + + + software by the following mechanism: "following a POP3 login by a + client which was ended by a QUIT, delete all messages downloaded + during the session with the RETR command". It is important not to + delete messages in the event of abnormal connection termination + (ie, if no QUIT was received from the client) because the client + may not have successfully received or stored the messages. + Servers implementing a download-and-delete policy may also wish to + disable or limit the optional TOP command, since it could be used + as an alternate mechanism to download entire messages. + +9. POP3 Command Summary + + Minimal POP3 Commands: + + USER name valid in the AUTHORIZATION state + PASS string + QUIT + + STAT valid in the TRANSACTION state + LIST [msg] + RETR msg + DELE msg + NOOP + RSET + QUIT + + Optional POP3 Commands: + + APOP name digest valid in the AUTHORIZATION state + + TOP msg n valid in the TRANSACTION state + UIDL [msg] + + POP3 Replies: + + +OK + -ERR + + Note that with the exception of the STAT, LIST, and UIDL commands, + the reply given by the POP3 server to any command is significant + only to "+OK" and "-ERR". Any text occurring after this reply + may be ignored by the client. + + + + + + + + + +Myers & Rose Standards Track [Page 18] + +RFC 1939 POP3 May 1996 + + +10. Example POP3 Session + + S: + C: + S: +OK POP3 server ready <1896.697170952@dbc.mtview.ca.us> + C: APOP mrose c4c9334bac560ecc979e58001b3e22fb + S: +OK mrose's maildrop has 2 messages (320 octets) + C: STAT + S: +OK 2 320 + C: LIST + S: +OK 2 messages (320 octets) + S: 1 120 + S: 2 200 + S: . + C: RETR 1 + S: +OK 120 octets + S: + S: . + C: DELE 1 + S: +OK message 1 deleted + C: RETR 2 + S: +OK 200 octets + S: + S: . + C: DELE 2 + S: +OK message 2 deleted + C: QUIT + S: +OK dewey POP3 server signing off (maildrop empty) + C: + S: + +11. Message Format + + All messages transmitted during a POP3 session are assumed to conform + to the standard for the format of Internet text messages [RFC822]. + + It is important to note that the octet count for a message on the + server host may differ from the octet count assigned to that message + due to local conventions for designating end-of-line. Usually, + during the AUTHORIZATION state of the POP3 session, the POP3 server + can calculate the size of each message in octets when it opens the + maildrop. For example, if the POP3 server host internally represents + end-of-line as a single character, then the POP3 server simply counts + each occurrence of this character in a message as two octets. Note + that lines in the message which start with the termination octet need + not (and must not) be counted twice, since the POP3 client will + remove all byte-stuffed termination characters when it receives a + multi-line response. + + + +Myers & Rose Standards Track [Page 19] + +RFC 1939 POP3 May 1996 + + +12. References + + [RFC821] Postel, J., "Simple Mail Transfer Protocol", STD 10, RFC + 821, USC/Information Sciences Institute, August 1982. + + [RFC822] Crocker, D., "Standard for the Format of ARPA-Internet Text + Messages", STD 11, RFC 822, University of Delaware, August 1982. + + [RFC1321] Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321, + MIT Laboratory for Computer Science, April 1992. + + [RFC1730] Crispin, M., "Internet Message Access Protocol - Version + 4", RFC 1730, University of Washington, December 1994. + + [RFC1734] Myers, J., "POP3 AUTHentication command", RFC 1734, + Carnegie Mellon, December 1994. + +13. Security Considerations + + It is conjectured that use of the APOP command provides origin + identification and replay protection for a POP3 session. + Accordingly, a POP3 server which implements both the PASS and APOP + commands should not allow both methods of access for a given user; + that is, for a given mailbox name, either the USER/PASS command + sequence or the APOP command is allowed, but not both. + + Further, note that as the length of the shared secret increases, so + does the difficulty of deriving it. + + Servers that answer -ERR to the USER command are giving potential + attackers clues about which names are valid. + + Use of the PASS command sends passwords in the clear over the + network. + + Use of the RETR and TOP commands sends mail in the clear over the + network. + + Otherwise, security issues are not discussed in this memo. + +14. Acknowledgements + + The POP family has a long and checkered history. Although primarily + a minor revision to RFC 1460, POP3 is based on the ideas presented in + RFCs 918, 937, and 1081. + + In addition, Alfred Grimstad, Keith McCloghrie, and Neil Ostroff + provided significant comments on the APOP command. + + + +Myers & Rose Standards Track [Page 20] + +RFC 1939 POP3 May 1996 + + +15. Authors' Addresses + + John G. Myers + Carnegie-Mellon University + 5000 Forbes Ave + Pittsburgh, PA 15213 + + EMail: jgm+@cmu.edu + + + Marshall T. Rose + Dover Beach Consulting, Inc. + 420 Whisman Court + Mountain View, CA 94043-2186 + + EMail: mrose@dbc.mtview.ca.us + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Myers & Rose Standards Track [Page 21] + +RFC 1939 POP3 May 1996 + + +Appendix A. Differences from RFC 1725 + + This memo is a revision to RFC 1725, a Draft Standard. It makes the + following changes from that document: + + - clarifies that command keywords are case insensitive. + + - specifies that servers must send "+OK" and "-ERR" in + upper case. + + - specifies that the initial greeting is a positive response, + instead of any string which should be a positive response. + + - clarifies behavior for unimplemented commands. + + - makes the USER and PASS commands optional. + + - clarified the set of possible responses to the USER command. + + - reverses the order of the examples in the USER and PASS + commands, to reduce confusion. + + - clarifies that the PASS command may only be given immediately + after a successful USER command. + + - clarified the persistence requirements of UIDs and added some + implementation notes. + + - specifies a UID length limitation of one to 70 octets. + + - specifies a status indicator length limitation + of 512 octets, including the CRLF. + + - clarifies that LIST with no arguments on an empty mailbox + returns success. + + - adds a reference from the LIST command to the Message Format + section + + - clarifies the behavior of QUIT upon failure + + - clarifies the security section to not imply the use of the + USER command with the APOP command. + + - adds references to RFCs 1730 and 1734 + + - clarifies the method by which a UA may enter mail into the + transport system. + + + +Myers & Rose Standards Track [Page 22] + +RFC 1939 POP3 May 1996 + + + - clarifies that the second argument to the TOP command is a + number of lines. + + - changes the suggestion in the Security Considerations section + for a server to not accept both PASS and APOP for a given user + from a "must" to a "should". + + - adds a section on scaling and operational considerations + +Appendix B. Command Index + + APOP ....................................................... 15 + DELE ....................................................... 8 + LIST ....................................................... 6 + NOOP ....................................................... 9 + PASS ....................................................... 14 + QUIT ....................................................... 5 + QUIT ....................................................... 10 + RETR ....................................................... 8 + RSET ....................................................... 9 + STAT ....................................................... 6 + TOP ........................................................ 11 + UIDL ....................................................... 12 + USER ....................................................... 13 + + + + + + + + + + + + + + + + + + + + + + + + + + + +Myers & Rose Standards Track [Page 23] + diff --git a/doc/specification/rfc2104.txt b/doc/specification/rfc2104.txt new file mode 100644 index 0000000..1fb8fe1 --- /dev/null +++ b/doc/specification/rfc2104.txt @@ -0,0 +1,619 @@ + + + + + + +Network Working Group H. Krawczyk +Request for Comments: 2104 IBM +Category: Informational M. Bellare + UCSD + R. Canetti + IBM + February 1997 + + + HMAC: Keyed-Hashing for Message Authentication + +Status of This Memo + + This memo provides information for the Internet community. This memo + does not specify an Internet standard of any kind. Distribution of + this memo is unlimited. + +Abstract + + This document describes HMAC, a mechanism for message authentication + using cryptographic hash functions. HMAC can be used with any + iterative cryptographic hash function, e.g., MD5, SHA-1, in + combination with a secret shared key. The cryptographic strength of + HMAC depends on the properties of the underlying hash function. + +1. Introduction + + Providing a way to check the integrity of information transmitted + over or stored in an unreliable medium is a prime necessity in the + world of open computing and communications. Mechanisms that provide + such integrity check based on a secret key are usually called + "message authentication codes" (MAC). Typically, message + authentication codes are used between two parties that share a secret + key in order to validate information transmitted between these + parties. In this document we present such a MAC mechanism based on + cryptographic hash functions. This mechanism, called HMAC, is based + on work by the authors [BCK1] where the construction is presented and + cryptographically analyzed. We refer to that work for the details on + the rationale and security analysis of HMAC, and its comparison to + other keyed-hash methods. + + + + + + + + + + + +Krawczyk, et. al. Informational [Page 1] + +RFC 2104 HMAC February 1997 + + + HMAC can be used in combination with any iterated cryptographic hash + function. MD5 and SHA-1 are examples of such hash functions. HMAC + also uses a secret key for calculation and verification of the + message authentication values. The main goals behind this + construction are + + * To use, without modifications, available hash functions. + In particular, hash functions that perform well in software, + and for which code is freely and widely available. + + * To preserve the original performance of the hash function without + incurring a significant degradation. + + * To use and handle keys in a simple way. + + * To have a well understood cryptographic analysis of the strength of + the authentication mechanism based on reasonable assumptions on the + underlying hash function. + + * To allow for easy replaceability of the underlying hash function in + case that faster or more secure hash functions are found or + required. + + This document specifies HMAC using a generic cryptographic hash + function (denoted by H). Specific instantiations of HMAC need to + define a particular hash function. Current candidates for such hash + functions include SHA-1 [SHA], MD5 [MD5], RIPEMD-128/160 [RIPEMD]. + These different realizations of HMAC will be denoted by HMAC-SHA1, + HMAC-MD5, HMAC-RIPEMD, etc. + + Note: To the date of writing of this document MD5 and SHA-1 are the + most widely used cryptographic hash functions. MD5 has been recently + shown to be vulnerable to collision search attacks [Dobb]. This + attack and other currently known weaknesses of MD5 do not compromise + the use of MD5 within HMAC as specified in this document (see + [Dobb]); however, SHA-1 appears to be a cryptographically stronger + function. To this date, MD5 can be considered for use in HMAC for + applications where the superior performance of MD5 is critical. In + any case, implementers and users need to be aware of possible + cryptanalytic developments regarding any of these cryptographic hash + functions, and the eventual need to replace the underlying hash + function. (See section 6 for more information on the security of + HMAC.) + + + + + + + + +Krawczyk, et. al. Informational [Page 2] + +RFC 2104 HMAC February 1997 + + +2. Definition of HMAC + + The definition of HMAC requires a cryptographic hash function, which + we denote by H, and a secret key K. We assume H to be a cryptographic + hash function where data is hashed by iterating a basic compression + function on blocks of data. We denote by B the byte-length of such + blocks (B=64 for all the above mentioned examples of hash functions), + and by L the byte-length of hash outputs (L=16 for MD5, L=20 for + SHA-1). The authentication key K can be of any length up to B, the + block length of the hash function. Applications that use keys longer + than B bytes will first hash the key using H and then use the + resultant L byte string as the actual key to HMAC. In any case the + minimal recommended length for K is L bytes (as the hash output + length). See section 3 for more information on keys. + + We define two fixed and different strings ipad and opad as follows + (the 'i' and 'o' are mnemonics for inner and outer): + + ipad = the byte 0x36 repeated B times + opad = the byte 0x5C repeated B times. + + To compute HMAC over the data `text' we perform + + H(K XOR opad, H(K XOR ipad, text)) + + Namely, + + (1) append zeros to the end of K to create a B byte string + (e.g., if K is of length 20 bytes and B=64, then K will be + appended with 44 zero bytes 0x00) + (2) XOR (bitwise exclusive-OR) the B byte string computed in step + (1) with ipad + (3) append the stream of data 'text' to the B byte string resulting + from step (2) + (4) apply H to the stream generated in step (3) + (5) XOR (bitwise exclusive-OR) the B byte string computed in + step (1) with opad + (6) append the H result from step (4) to the B byte string + resulting from step (5) + (7) apply H to the stream generated in step (6) and output + the result + + For illustration purposes, sample code based on MD5 is provided as an + appendix. + + + + + + + +Krawczyk, et. al. Informational [Page 3] + +RFC 2104 HMAC February 1997 + + +3. Keys + + The key for HMAC can be of any length (keys longer than B bytes are + first hashed using H). However, less than L bytes is strongly + discouraged as it would decrease the security strength of the + function. Keys longer than L bytes are acceptable but the extra + length would not significantly increase the function strength. (A + longer key may be advisable if the randomness of the key is + considered weak.) + + Keys need to be chosen at random (or using a cryptographically strong + pseudo-random generator seeded with a random seed), and periodically + refreshed. (Current attacks do not indicate a specific recommended + frequency for key changes as these attacks are practically + infeasible. However, periodic key refreshment is a fundamental + security practice that helps against potential weaknesses of the + function and keys, and limits the damage of an exposed key.) + +4. Implementation Note + + HMAC is defined in such a way that the underlying hash function H can + be used with no modification to its code. In particular, it uses the + function H with the pre-defined initial value IV (a fixed value + specified by each iterative hash function to initialize its + compression function). However, if desired, a performance + improvement can be achieved at the cost of (possibly) modifying the + code of H to support variable IVs. + + The idea is that the intermediate results of the compression function + on the B-byte blocks (K XOR ipad) and (K XOR opad) can be precomputed + only once at the time of generation of the key K, or before its first + use. These intermediate results are stored and then used to + initialize the IV of H each time that a message needs to be + authenticated. This method saves, for each authenticated message, + the application of the compression function of H on two B-byte blocks + (i.e., on (K XOR ipad) and (K XOR opad)). Such a savings may be + significant when authenticating short streams of data. We stress + that the stored intermediate values need to be treated and protected + the same as secret keys. + + Choosing to implement HMAC in the above way is a decision of the + local implementation and has no effect on inter-operability. + + + + + + + + + +Krawczyk, et. al. Informational [Page 4] + +RFC 2104 HMAC February 1997 + + +5. Truncated output + + A well-known practice with message authentication codes is to + truncate the output of the MAC and output only part of the bits + (e.g., [MM, ANSI]). Preneel and van Oorschot [PV] show some + analytical advantages of truncating the output of hash-based MAC + functions. The results in this area are not absolute as for the + overall security advantages of truncation. It has advantages (less + information on the hash result available to an attacker) and + disadvantages (less bits to predict for the attacker). Applications + of HMAC can choose to truncate the output of HMAC by outputting the t + leftmost bits of the HMAC computation for some parameter t (namely, + the computation is carried in the normal way as defined in section 2 + above but the end result is truncated to t bits). We recommend that + the output length t be not less than half the length of the hash + output (to match the birthday attack bound) and not less than 80 bits + (a suitable lower bound on the number of bits that need to be + predicted by an attacker). We propose denoting a realization of HMAC + that uses a hash function H with t bits of output as HMAC-H-t. For + example, HMAC-SHA1-80 denotes HMAC computed using the SHA-1 function + and with the output truncated to 80 bits. (If the parameter t is not + specified, e.g. HMAC-MD5, then it is assumed that all the bits of the + hash are output.) + +6. Security + + The security of the message authentication mechanism presented here + depends on cryptographic properties of the hash function H: the + resistance to collision finding (limited to the case where the + initial value is secret and random, and where the output of the + function is not explicitly available to the attacker), and the + message authentication property of the compression function of H when + applied to single blocks (in HMAC these blocks are partially unknown + to an attacker as they contain the result of the inner H computation + and, in particular, cannot be fully chosen by the attacker). + + These properties, and actually stronger ones, are commonly assumed + for hash functions of the kind used with HMAC. In particular, a hash + function for which the above properties do not hold would become + unsuitable for most (probably, all) cryptographic applications, + including alternative message authentication schemes based on such + functions. (For a complete analysis and rationale of the HMAC + function the reader is referred to [BCK1].) + + + + + + + + +Krawczyk, et. al. Informational [Page 5] + +RFC 2104 HMAC February 1997 + + + Given the limited confidence gained so far as for the cryptographic + strength of candidate hash functions, it is important to observe the + following two properties of the HMAC construction and its secure use + for message authentication: + + 1. The construction is independent of the details of the particular + hash function H in use and then the latter can be replaced by any + other secure (iterative) cryptographic hash function. + + 2. Message authentication, as opposed to encryption, has a + "transient" effect. A published breaking of a message authentication + scheme would lead to the replacement of that scheme, but would have + no adversarial effect on information authenticated in the past. This + is in sharp contrast with encryption, where information encrypted + today may suffer from exposure in the future if, and when, the + encryption algorithm is broken. + + The strongest attack known against HMAC is based on the frequency of + collisions for the hash function H ("birthday attack") [PV,BCK2], and + is totally impractical for minimally reasonable hash functions. + + As an example, if we consider a hash function like MD5 where the + output length equals L=16 bytes (128 bits) the attacker needs to + acquire the correct message authentication tags computed (with the + _same_ secret key K!) on about 2**64 known plaintexts. This would + require the processing of at least 2**64 blocks under H, an + impossible task in any realistic scenario (for a block length of 64 + bytes this would take 250,000 years in a continuous 1Gbps link, and + without changing the secret key K during all this time). This attack + could become realistic only if serious flaws in the collision + behavior of the function H are discovered (e.g. collisions found + after 2**30 messages). Such a discovery would determine the immediate + replacement of the function H (the effects of such failure would be + far more severe for the traditional uses of H in the context of + digital signatures, public key certificates, etc.). + + Note: this attack needs to be strongly contrasted with regular + collision attacks on cryptographic hash functions where no secret key + is involved and where 2**64 off-line parallelizable (!) operations + suffice to find collisions. The latter attack is approaching + feasibility [VW] while the birthday attack on HMAC is totally + impractical. (In the above examples, if one uses a hash function + with, say, 160 bit of output then 2**64 should be replaced by 2**80.) + + + + + + + + +Krawczyk, et. al. Informational [Page 6] + +RFC 2104 HMAC February 1997 + + + A correct implementation of the above construction, the choice of + random (or cryptographically pseudorandom) keys, a secure key + exchange mechanism, frequent key refreshments, and good secrecy + protection of keys are all essential ingredients for the security of + the integrity verification mechanism provided by HMAC. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Krawczyk, et. al. Informational [Page 7] + +RFC 2104 HMAC February 1997 + + +Appendix -- Sample Code + + For the sake of illustration we provide the following sample code for + the implementation of HMAC-MD5 as well as some corresponding test + vectors (the code is based on MD5 code as described in [MD5]). + +/* +** Function: hmac_md5 +*/ + +void +hmac_md5(text, text_len, key, key_len, digest) +unsigned char* text; /* pointer to data stream */ +int text_len; /* length of data stream */ +unsigned char* key; /* pointer to authentication key */ +int key_len; /* length of authentication key */ +caddr_t digest; /* caller digest to be filled in */ + +{ + MD5_CTX context; + unsigned char k_ipad[65]; /* inner padding - + * key XORd with ipad + */ + unsigned char k_opad[65]; /* outer padding - + * key XORd with opad + */ + unsigned char tk[16]; + int i; + /* if key is longer than 64 bytes reset it to key=MD5(key) */ + if (key_len > 64) { + + MD5_CTX tctx; + + MD5Init(&tctx); + MD5Update(&tctx, key, key_len); + MD5Final(tk, &tctx); + + key = tk; + key_len = 16; + } + + /* + * the HMAC_MD5 transform looks like: + * + * MD5(K XOR opad, MD5(K XOR ipad, text)) + * + * where K is an n byte key + * ipad is the byte 0x36 repeated 64 times + + + +Krawczyk, et. al. Informational [Page 8] + +RFC 2104 HMAC February 1997 + + + * opad is the byte 0x5c repeated 64 times + * and text is the data being protected + */ + + /* start out by storing key in pads */ + bzero( k_ipad, sizeof k_ipad); + bzero( k_opad, sizeof k_opad); + bcopy( key, k_ipad, key_len); + bcopy( key, k_opad, key_len); + + /* XOR key with ipad and opad values */ + for (i=0; i<64; i++) { + k_ipad[i] ^= 0x36; + k_opad[i] ^= 0x5c; + } + /* + * perform inner MD5 + */ + MD5Init(&context); /* init context for 1st + * pass */ + MD5Update(&context, k_ipad, 64) /* start with inner pad */ + MD5Update(&context, text, text_len); /* then text of datagram */ + MD5Final(digest, &context); /* finish up 1st pass */ + /* + * perform outer MD5 + */ + MD5Init(&context); /* init context for 2nd + * pass */ + MD5Update(&context, k_opad, 64); /* start with outer pad */ + MD5Update(&context, digest, 16); /* then results of 1st + * hash */ + MD5Final(digest, &context); /* finish up 2nd pass */ +} + +Test Vectors (Trailing '\0' of a character string not included in test): + + key = 0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b + key_len = 16 bytes + data = "Hi There" + data_len = 8 bytes + digest = 0x9294727a3638bb1c13f48ef8158bfc9d + + key = "Jefe" + data = "what do ya want for nothing?" + data_len = 28 bytes + digest = 0x750c783e6ab0b503eaa86e310a5db738 + + key = 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + + +Krawczyk, et. al. Informational [Page 9] + +RFC 2104 HMAC February 1997 + + + key_len 16 bytes + data = 0xDDDDDDDDDDDDDDDDDDDD... + ..DDDDDDDDDDDDDDDDDDDD... + ..DDDDDDDDDDDDDDDDDDDD... + ..DDDDDDDDDDDDDDDDDDDD... + ..DDDDDDDDDDDDDDDDDDDD + data_len = 50 bytes + digest = 0x56be34521d144c88dbb8c733f0e8b3f6 + +Acknowledgments + + Pau-Chen Cheng, Jeff Kraemer, and Michael Oehler, have provided + useful comments on early drafts, and ran the first interoperability + tests of this specification. Jeff and Pau-Chen kindly provided the + sample code and test vectors that appear in the appendix. Burt + Kaliski, Bart Preneel, Matt Robshaw, Adi Shamir, and Paul van + Oorschot have provided useful comments and suggestions during the + investigation of the HMAC construction. + +References + + [ANSI] ANSI X9.9, "American National Standard for Financial + Institution Message Authentication (Wholesale)," American + Bankers Association, 1981. Revised 1986. + + [Atk] Atkinson, R., "IP Authentication Header", RFC 1826, August + 1995. + + [BCK1] M. Bellare, R. Canetti, and H. Krawczyk, + "Keyed Hash Functions and Message Authentication", + Proceedings of Crypto'96, LNCS 1109, pp. 1-15. + (http://www.research.ibm.com/security/keyed-md5.html) + + [BCK2] M. Bellare, R. Canetti, and H. Krawczyk, + "Pseudorandom Functions Revisited: The Cascade Construction", + Proceedings of FOCS'96. + + [Dobb] H. Dobbertin, "The Status of MD5 After a Recent Attack", + RSA Labs' CryptoBytes, Vol. 2 No. 2, Summer 1996. + http://www.rsa.com/rsalabs/pubs/cryptobytes.html + + [PV] B. Preneel and P. van Oorschot, "Building fast MACs from hash + functions", Advances in Cryptology -- CRYPTO'95 Proceedings, + Lecture Notes in Computer Science, Springer-Verlag Vol.963, + 1995, pp. 1-14. + + [MD5] Rivest, R., "The MD5 Message-Digest Algorithm", + RFC 1321, April 1992. + + + +Krawczyk, et. al. Informational [Page 10] + +RFC 2104 HMAC February 1997 + + + [MM] Meyer, S. and Matyas, S.M., Cryptography, New York Wiley, + 1982. + + [RIPEMD] H. Dobbertin, A. Bosselaers, and B. Preneel, "RIPEMD-160: A + strengthened version of RIPEMD", Fast Software Encryption, + LNCS Vol 1039, pp. 71-82. + ftp://ftp.esat.kuleuven.ac.be/pub/COSIC/bosselae/ripemd/. + + [SHA] NIST, FIPS PUB 180-1: Secure Hash Standard, April 1995. + + [Tsu] G. Tsudik, "Message authentication with one-way hash + functions", In Proceedings of Infocom'92, May 1992. + (Also in "Access Control and Policy Enforcement in + Internetworks", Ph.D. Dissertation, Computer Science + Department, University of Southern California, April 1991.) + + [VW] P. van Oorschot and M. Wiener, "Parallel Collision + Search with Applications to Hash Functions and Discrete + Logarithms", Proceedings of the 2nd ACM Conf. Computer and + Communications Security, Fairfax, VA, November 1994. + +Authors' Addresses + + Hugo Krawczyk + IBM T.J. Watson Research Center + P.O.Box 704 + Yorktown Heights, NY 10598 + + EMail: hugo@watson.ibm.com + + Mihir Bellare + Dept of Computer Science and Engineering + Mail Code 0114 + University of California at San Diego + 9500 Gilman Drive + La Jolla, CA 92093 + + EMail: mihir@cs.ucsd.edu + + Ran Canetti + IBM T.J. Watson Research Center + P.O.Box 704 + Yorktown Heights, NY 10598 + + EMail: canetti@watson.ibm.com + + + + + + +Krawczyk, et. al. Informational [Page 11] + diff --git a/doc/specification/rfc2195.txt b/doc/specification/rfc2195.txt new file mode 100644 index 0000000..4a2725b --- /dev/null +++ b/doc/specification/rfc2195.txt @@ -0,0 +1,283 @@ + + + + + + +Network Working Group J. Klensin +Request for Comments: 2195 R. Catoe +Category: Standards Track P. Krumviede +Obsoletes: 2095 MCI + September 1997 + + + IMAP/POP AUTHorize Extension for Simple Challenge/Response + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Abstract + + While IMAP4 supports a number of strong authentication mechanisms as + described in RFC 1731, it lacks any mechanism that neither passes + cleartext, reusable passwords across the network nor requires either + a significant security infrastructure or that the mail server update + a mail-system-wide user authentication file on each mail access. + This specification provides a simple challenge-response + authentication protocol that is suitable for use with IMAP4. Since + it utilizes Keyed-MD5 digests and does not require that the secret be + stored in the clear on the server, it may also constitute an + improvement on APOP for POP3 use as specified in RFC 1734. + +1. Introduction + + Existing Proposed Standards specify an AUTHENTICATE mechanism for the + IMAP4 protocol [IMAP, IMAP-AUTH] and a parallel AUTH mechanism for + the POP3 protocol [POP3-AUTH]. The AUTHENTICATE mechanism is + intended to be extensible; the four methods specified in [IMAP-AUTH] + are all fairly powerful and require some security infrastructure to + support. The base POP3 specification [POP3] also contains a + lightweight challenge-response mechanism called APOP. APOP is + associated with most of the risks associated with such protocols: in + particular, it requires that both the client and server machines have + access to the shared secret in cleartext form. CRAM offers a method + for avoiding such cleartext storage while retaining the algorithmic + simplicity of APOP in using only MD5, though in a "keyed" method. + + + + + + + +Klensin, Catoe & Krumviede Standards Track [Page 1] + +RFC 2195 IMAP/POP AUTHorize Extension September 1997 + + + At present, IMAP [IMAP] lacks any facility corresponding to APOP. + The only alternative to the strong mechanisms identified in [IMAP- + AUTH] is a presumably cleartext username and password, supported + through the LOGIN command in [IMAP]. This document describes a + simple challenge-response mechanism, similar to APOP and PPP CHAP + [PPP], that can be used with IMAP (and, in principle, with POP3). + + This mechanism also has the advantage over some possible alternatives + of not requiring that the server maintain information about email + "logins" on a per-login basis. While mechanisms that do require such + per-login history records may offer enhanced security, protocols such + as IMAP, which may have several connections between a given client + and server open more or less simultaneous, may make their + implementation particularly challenging. + +2. Challenge-Response Authentication Mechanism (CRAM) + + The authentication type associated with CRAM is "CRAM-MD5". + + The data encoded in the first ready response contains an + presumptively arbitrary string of random digits, a timestamp, and the + fully-qualified primary host name of the server. The syntax of the + unencoded form must correspond to that of an RFC 822 'msg-id' + [RFC822] as described in [POP3]. + + The client makes note of the data and then responds with a string + consisting of the user name, a space, and a 'digest'. The latter is + computed by applying the keyed MD5 algorithm from [KEYED-MD5] where + the key is a shared secret and the digested text is the timestamp + (including angle-brackets). + + This shared secret is a string known only to the client and server. + The `digest' parameter itself is a 16-octet value which is sent in + hexadecimal format, using lower-case ASCII characters. + + When the server receives this client response, it verifies the digest + provided. If the digest is correct, the server should consider the + client authenticated and respond appropriately. + + Keyed MD5 is chosen for this application because of the greater + security imparted to authentication of short messages. In addition, + the use of the techniques described in [KEYED-MD5] for precomputation + of intermediate results make it possible to avoid explicit cleartext + storage of the shared secret on the server system by instead storing + the intermediate results which are known as "contexts". + + + + + + +Klensin, Catoe & Krumviede Standards Track [Page 2] + +RFC 2195 IMAP/POP AUTHorize Extension September 1997 + + + CRAM does not support a protection mechanism. + + Example: + + The examples in this document show the use of the CRAM mechanism with + the IMAP4 AUTHENTICATE command [IMAP-AUTH]. The base64 encoding of + the challenges and responses is part of the IMAP4 AUTHENTICATE + command, not part of the CRAM specification itself. + + S: * OK IMAP4 Server + C: A0001 AUTHENTICATE CRAM-MD5 + S: + PDE4OTYuNjk3MTcwOTUyQHBvc3RvZmZpY2UucmVzdG9uLm1jaS5uZXQ+ + C: dGltIGI5MTNhNjAyYzdlZGE3YTQ5NWI0ZTZlNzMzNGQzODkw + S: A0001 OK CRAM authentication successful + + In this example, the shared secret is the string + 'tanstaaftanstaaf'. Hence, the Keyed MD5 digest is produced by + calculating + + MD5((tanstaaftanstaaf XOR opad), + MD5((tanstaaftanstaaf XOR ipad), + <1896.697170952@postoffice.reston.mci.net>)) + + where ipad and opad are as defined in the keyed-MD5 Work in + Progress [KEYED-MD5] and the string shown in the challenge is the + base64 encoding of <1896.697170952@postoffice.reston.mci.net>. The + shared secret is null-padded to a length of 64 bytes. If the + shared secret is longer than 64 bytes, the MD5 digest of the + shared secret is used as a 16 byte input to the keyed MD5 + calculation. + + This produces a digest value (in hexadecimal) of + + b913a602c7eda7a495b4e6e7334d3890 + + The user name is then prepended to it, forming + + tim b913a602c7eda7a495b4e6e7334d3890 + + Which is then base64 encoded to meet the requirements of the IMAP4 + AUTHENTICATE command (or the similar POP3 AUTH command), yielding + + dGltIGI5MTNhNjAyYzdlZGE3YTQ5NWI0ZTZlNzMzNGQzODkw + + + + + + + + +Klensin, Catoe & Krumviede Standards Track [Page 3] + +RFC 2195 IMAP/POP AUTHorize Extension September 1997 + + +3. References + + [CHAP] Lloyd, B., and W. Simpson, "PPP Authentication Protocols", + RFC 1334, October 1992. + + [IMAP] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, University of Washington, December 1996. + + [IMAP-AUTH] Myers, J., "IMAP4 Authentication Mechanisms", + RFC 1731, Carnegie Mellon, December 1994. + + [KEYED-MD5] Krawczyk, Bellare, Canetti, "HMAC: Keyed-Hashing for + Message Authentication", RFC 2104, February 1997. + + [MD5] Rivest, R., "The MD5 Message Digest Algorithm", + RFC 1321, MIT Laboratory for Computer Science, April 1992. + + [POP3] Myers, J., and M. Rose, "Post Office Protocol - Version 3", + STD 53, RFC 1939, Carnegie Mellon, May 1996. + + [POP3-AUTH] Myers, J., "POP3 AUTHentication command", RFC 1734, + Carnegie Mellon, December, 1994. + +4. Security Considerations + + It is conjectured that use of the CRAM authentication mechanism + provides origin identification and replay protection for a session. + Accordingly, a server that implements both a cleartext password + command and this authentication type should not allow both methods of + access for a given user. + + While the saving, on the server, of "contexts" (see section 2) is + marginally better than saving the shared secrets in cleartext as is + required by CHAP [CHAP] and APOP [POP3], it is not sufficient to + protect the secrets if the server itself is compromised. + Consequently, servers that store the secrets or contexts must both be + protected to a level appropriate to the potential information value + in user mailboxes and identities. + + As the length of the shared secret increases, so does the difficulty + of deriving it. + + While there are now suggestions in the literature that the use of MD5 + and keyed MD5 in authentication procedures probably has a limited + effective lifetime, the technique is now widely deployed and widely + understood. It is believed that this general understanding may + assist with the rapid replacement, by CRAM-MD5, of the current uses + of permanent cleartext passwords in IMAP. This document has been + + + +Klensin, Catoe & Krumviede Standards Track [Page 4] + +RFC 2195 IMAP/POP AUTHorize Extension September 1997 + + + deliberately written to permit easy upgrading to use SHA (or whatever + alternatives emerge) when they are considered to be widely available + and adequately safe. + + Even with the use of CRAM, users are still vulnerable to active + attacks. An example of an increasingly common active attack is 'TCP + Session Hijacking' as described in CERT Advisory CA-95:01 [CERT95]. + + See section 1 above for additional discussion. + +5. Acknowledgements + + This memo borrows ideas and some text liberally from [POP3] and + [RFC-1731] and thanks are due the authors of those documents. Ran + Atkinson made a number of valuable technical and editorial + contributions to the document. + +6. Authors' Addresses + + John C. Klensin + MCI Telecommunications + 800 Boylston St, 7th floor + Boston, MA 02199 + USA + + EMail: klensin@mci.net + Phone: +1 617 960 1011 + + Randy Catoe + MCI Telecommunications + 2100 Reston Parkway + Reston, VA 22091 + USA + + EMail: randy@mci.net + Phone: +1 703 715 7366 + + Paul Krumviede + MCI Telecommunications + 2100 Reston Parkway + Reston, VA 22091 + USA + + EMail: paul@mci.net + Phone: +1 703 715 7251 + + + + + + +Klensin, Catoe & Krumviede Standards Track [Page 5] + diff --git a/doc/specification/rfc2222.txt b/doc/specification/rfc2222.txt new file mode 100644 index 0000000..2b0a2ab --- /dev/null +++ b/doc/specification/rfc2222.txt @@ -0,0 +1,899 @@ + + + + + + +Network Working Group J. Myers +Request for Comments: 2222 Netscape Communications +Category: Standards Track October 1997 + + + Simple Authentication and Security Layer (SASL) + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (1997). All Rights Reserved. + +Table of Contents + + 1. Abstract .............................................. 2 + 2. Organization of this Document ......................... 2 + 2.1. How to Read This Document ............................. 2 + 2.2. Conventions Used in this Document ..................... 2 + 2.3. Examples .............................................. 3 + 3. Introduction and Overview ............................. 3 + 4. Profiling requirements ................................ 4 + 5. Specific issues ....................................... 5 + 5.1. Client sends data first ............................... 5 + 5.2. Server returns success with additional data ........... 5 + 5.3. Multiple authentications .............................. 5 + 6. Registration procedures ............................... 6 + 6.1. Comments on SASL mechanism registrations .............. 6 + 6.2. Location of Registered SASL Mechanism List ............ 6 + 6.3. Change Control ........................................ 7 + 6.4. Registration Template ................................. 7 + 7. Mechanism definitions ................................. 8 + 7.1. Kerberos version 4 mechanism .......................... 8 + 7.2. GSSAPI mechanism ...................................... 9 + 7.2.1 Client side of authentication protocol exchange ....... 9 + 7.2.2 Server side of authentication protocol exchange ....... 10 + 7.2.3 Security layer ........................................ 11 + 7.3. S/Key mechanism ....................................... 11 + 7.4. External mechanism .................................... 12 + 8. References ............................................ 13 + 9. Security Considerations ............................... 13 + 10. Author's Address ...................................... 14 + + + +Myers Standards Track [Page 1] + +RFC 2222 SASL October 1997 + + + Appendix A. Relation of SASL to Transport Security .......... 15 + Full Copyright Statement .................................... 16 + +1. Abstract + + This document describes a method for adding authentication support to + connection-based protocols. To use this specification, a protocol + includes a command for identifying and authenticating a user to a + server and for optionally negotiating protection of subsequent + protocol interactions. If its use is negotiated, a security layer is + inserted between the protocol and the connection. This document + describes how a protocol specifies such a command, defines several + mechanisms for use by the command, and defines the protocol used for + carrying a negotiated security layer over the connection. + +2. Organization of this Document + +2.1. How to Read This Document + + This document is written to serve two different audiences, protocol + designers using this specification to support authentication in their + protocol, and implementors of clients or servers for those protocols + using this specification. + + The sections "Introduction and Overview", "Profiling requirements", + and "Security Considerations" cover issues that protocol designers + need to understand and address in profiling this specification for + use in a specific protocol. + + Implementors of a protocol using this specification need the + protocol-specific profiling information in addition to the + information in this document. + +2.2. Conventions Used in this Document + + In examples, "C:" and "S:" indicate lines sent by the client and + server respectively. + + The key words "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", and "MAY" + in this document are to be interpreted as defined in "Key words for + use in RFCs to Indicate Requirement Levels" [RFC 2119]. + + + + + + + + + + +Myers Standards Track [Page 2] + +RFC 2222 SASL October 1997 + + +2.3. Examples + + Examples in this document are for the IMAP profile [RFC 2060] of this + specification. The base64 encoding of challenges and responses, as + well as the "+ " preceding the responses are part of the IMAP4 + profile, not part of the SASL specification itself. + +3. Introduction and Overview + + The Simple Authentication and Security Layer (SASL) is a method for + adding authentication support to connection-based protocols. To use + this specification, a protocol includes a command for identifying and + authenticating a user to a server and for optionally negotiating a + security layer for subsequent protocol interactions. + + The command has a required argument identifying a SASL mechanism. + SASL mechanisms are named by strings, from 1 to 20 characters in + length, consisting of upper-case letters, digits, hyphens, and/or + underscores. SASL mechanism names must be registered with the IANA. + Procedures for registering new SASL mechanisms are given in the + section "Registration procedures" + + If a server supports the requested mechanism, it initiates an + authentication protocol exchange. This consists of a series of + server challenges and client responses that are specific to the + requested mechanism. The challenges and responses are defined by the + mechanisms as binary tokens of arbitrary length. The protocol's + profile then specifies how these binary tokens are then encoded for + transfer over the connection. + + After receiving the authentication command or any client response, a + server may issue a challenge, indicate failure, or indicate + completion. The protocol's profile specifies how the server + indicates which of the above it is doing. + + After receiving a challenge, a client may issue a response or abort + the exchange. The protocol's profile specifies how the client + indicates which of the above it is doing. + + During the authentication protocol exchange, the mechanism performs + authentication, transmits an authorization identity (frequently known + as a userid) from the client to server, and negotiates the use of a + mechanism-specific security layer. If the use of a security layer is + agreed upon, then the mechanism must also define or negotiate the + maximum cipher-text buffer size that each side is able to receive. + + + + + + +Myers Standards Track [Page 3] + +RFC 2222 SASL October 1997 + + + The transmitted authorization identity may be different than the + identity in the client's authentication credentials. This permits + agents such as proxy servers to authenticate using their own + credentials, yet request the access privileges of the identity for + which they are proxying. With any mechanism, transmitting an + authorization identity of the empty string directs the server to + derive an authorization identity from the client's authentication + credentials. + + If use of a security layer is negotiated, it is applied to all + subsequent data sent over the connection. The security layer takes + effect immediately following the last response of the authentication + exchange for data sent by the client and the completion indication + for data sent by the server. Once the security layer is in effect, + the protocol stream is processed by the security layer into buffers + of cipher-text. Each buffer is transferred over the connection as a + stream of octets prepended with a four octet field in network byte + order that represents the length of the following buffer. The length + of the cipher-text buffer must be no larger than the maximum size + that was defined or negotiated by the other side. + +4. Profiling requirements + + In order to use this specification, a protocol definition must supply + the following information: + + 1. A service name, to be selected from the IANA registry of "service" + elements for the GSSAPI host-based service name form [RFC 2078]. + + 2. A definition of the command to initiate the authentication + protocol exchange. This command must have as a parameter the + mechanism name being selected by the client. + + The command SHOULD have an optional parameter giving an initial + response. This optional parameter allows the client to avoid a + round trip when using a mechanism which is defined to have the + client send data first. When this initial response is sent by the + client and the selected mechanism is defined to have the server + start with an initial challenge, the command fails. See section + 5.1 of this document for further information. + + 3. A definition of the method by which the authentication protocol + exchange is carried out, including how the challenges and + responses are encoded, how the server indicates completion or + failure of the exchange, how the client aborts an exchange, and + how the exchange method interacts with any line length limits in + the protocol. + + + + +Myers Standards Track [Page 4] + +RFC 2222 SASL October 1997 + + + 4. Identification of the octet where any negotiated security layer + starts to take effect, in both directions. + + 5. A specification of how the authorization identity passed from the + client to the server is to be interpreted. + +5. Specific issues + +5.1. Client sends data first + + Some mechanisms specify that the first data sent in the + authentication protocol exchange is from the client to the server. + + If a protocol's profile permits the command which initiates an + authentication protocol exchange to contain an initial client + response, this parameter SHOULD be used with such mechanisms. + + If the initial client response parameter is not given, or if a + protocol's profile does not permit the command which initiates an + authentication protocol exchange to contain an initial client + response, then the server issues a challenge with no data. The + client's response to this challenge is then used as the initial + client response. (The server then proceeds to send the next + challenge, indicates completion, or indicates failure.) + +5.2. Server returns success with additional data + + Some mechanisms may specify that server challenge data be sent to the + client along with an indication of successful completion of the + exchange. This data would, for example, authenticate the server to + the client. + + If a protocol's profile does not permit this server challenge to be + returned with a success indication, then the server issues the server + challenge without an indication of successful completion. The client + then responds with no data. After receiving this empty response, the + server then indicates successful completion. + +5.3. Multiple authentications + + Unless otherwise stated by the protocol's profile, only one + successful SASL negotiation may occur in a protocol session. In this + case, once an authentication protocol exchange has successfully + completed, further attempts to initiate an authentication protocol + exchange fail. + + + + + + +Myers Standards Track [Page 5] + +RFC 2222 SASL October 1997 + + + In the case that a profile explicitly permits multiple successful + SASL negotiations to occur, then in no case may multiple security + layers be simultaneously in effect. If a security layer is in effect + and a subsequent SASL negotiation selects no security layer, the + original security layer remains in effect. If a security layer is in + effect and a subsequent SASL negotiation selects a second security + layer, then the second security layer replaces the first. + +6. Registration procedures + + Registration of a SASL mechanism is done by filling in the template + in section 6.4 and sending it in to iana@isi.edu. IANA has the right + to reject obviously bogus registrations, but will perform no review + of clams made in the registration form. + + There is no naming convention for SASL mechanisms; any name that + conforms to the syntax of a SASL mechanism name can be registered. + + While the registration procedures do not require it, authors of SASL + mechanisms are encouraged to seek community review and comment + whenever that is feasible. Authors may seek community review by + posting a specification of their proposed mechanism as an internet- + draft. SASL mechanisms intended for widespread use should be + standardized through the normal IETF process, when appropriate. + +6.1. Comments on SASL mechanism registrations + + Comments on registered SASL mechanisms should first be sent to the + "owner" of the mechanism. Submitters of comments may, after a + reasonable attempt to contact the owner, request IANA to attach their + comment to the SASL mechanism registration itself. If IANA approves + of this the comment will be made accessible in conjunction with the + SASL mechanism registration itself. + +6.2. Location of Registered SASL Mechanism List + + SASL mechanism registrations will be posted in the anonymous FTP + directory "ftp://ftp.isi.edu/in-notes/iana/assignments/sasl- + mechanisms/" and all registered SASL mechanisms will be listed in the + periodically issued "Assigned Numbers" RFC [currently STD 2, RFC + 1700]. The SASL mechanism description and other supporting material + may also be published as an Informational RFC by sending it to "rfc- + editor@isi.edu" (please follow the instructions to RFC authors [RFC + 2223]). + + + + + + + +Myers Standards Track [Page 6] + +RFC 2222 SASL October 1997 + + +6.3. Change Control + + Once a SASL mechanism registration has been published by IANA, the + author may request a change to its definition. The change request + follows the same procedure as the registration request. + + The owner of a SASL mechanism may pass responsibility for the SASL + mechanism to another person or agency by informing IANA; this can be + done without discussion or review. + + The IESG may reassign responsibility for a SASL mechanism. The most + common case of this will be to enable changes to be made to + mechanisms where the author of the registration has died, moved out + of contact or is otherwise unable to make changes that are important + to the community. + + SASL mechanism registrations may not be deleted; mechanisms which are + no longer believed appropriate for use can be declared OBSOLETE by a + change to their "intended use" field; such SASL mechanisms will be + clearly marked in the lists published by IANA. + + The IESG is considered to be the owner of all SASL mechanisms which + are on the IETF standards track. + +6.4. Registration Template + + To: iana@iana.org + Subject: Registration of SASL mechanism X + + SASL mechanism name: + + Security considerations: + + Published specification (optional, recommended): + + Person & email address to contact for further information: + + Intended usage: + + (One of COMMON, LIMITED USE or OBSOLETE) + + Author/Change controller: + + (Any other information that the author deems interesting may be + added below this line.) + + + + + + +Myers Standards Track [Page 7] + +RFC 2222 SASL October 1997 + + +7. Mechanism definitions + + The following mechanisms are hereby defined. + +7.1. Kerberos version 4 mechanism + + The mechanism name associated with Kerberos version 4 is + "KERBEROS_V4". + + The first challenge consists of a random 32-bit number in network + byte order. The client responds with a Kerberos ticket and an + authenticator for the principal "service.hostname@realm", where + "service" is the service name specified in the protocol's profile, + "hostname" is the first component of the host name of the server with + all letters in lower case, and where "realm" is the Kerberos realm of + the server. The encrypted checksum field included within the + Kerberos authenticator contains the server provided challenge in + network byte order. + + Upon decrypting and verifying the ticket and authenticator, the + server verifies that the contained checksum field equals the original + server provided random 32-bit number. Should the verification be + successful, the server must add one to the checksum and construct 8 + octets of data, with the first four octets containing the incremented + checksum in network byte order, the fifth octet containing a bit-mask + specifying the security layers supported by the server, and the sixth + through eighth octets containing, in network byte order, the maximum + cipher-text buffer size the server is able to receive. The server + must encrypt using DES ECB mode the 8 octets of data in the session + key and issue that encrypted data in a second challenge. The client + considers the server authenticated if the first four octets of the + un-encrypted data is equal to one plus the checksum it previously + sent. + + The client must construct data with the first four octets containing + the original server-issued checksum in network byte order, the fifth + octet containing the bit-mask specifying the selected security layer, + the sixth through eighth octets containing in network byte order the + maximum cipher-text buffer size the client is able to receive, and + the following octets containing the authorization identity. The + client must then append from one to eight zero-valued octets so that + the length of the data is a multiple of eight octets. The client must + then encrypt using DES PCBC mode the data with the session key and + respond with the encrypted data. The server decrypts the data and + verifies the contained checksum. The server must verify that the + principal identified in the Kerberos ticket is authorized to connect + as that authorization identity. After this verification, the + authentication process is complete. + + + +Myers Standards Track [Page 8] + +RFC 2222 SASL October 1997 + + + The security layers and their corresponding bit-masks are as follows: + + 1 No security layer + 2 Integrity (krb_mk_safe) protection + 4 Privacy (krb_mk_priv) protection + + Other bit-masks may be defined in the future; bits which are not + understood must be negotiated off. + + EXAMPLE: The following are two Kerberos version 4 login scenarios to + the IMAP4 protocol (note that the line breaks in the sample + authenticators are for editorial clarity and are not in real + authenticators) + + S: * OK IMAP4 Server + C: A001 AUTHENTICATE KERBEROS_V4 + S: + AmFYig== + C: BAcAQU5EUkVXLkNNVS5FRFUAOCAsho84kLN3/IJmrMG+25a4DT + +nZImJjnTNHJUtxAA+o0KPKfHEcAFs9a3CL5Oebe/ydHJUwYFd + WwuQ1MWiy6IesKvjL5rL9WjXUb9MwT9bpObYLGOKi1Qh + S: + or//EoAADZI= + C: DiAF5A4gA+oOIALuBkAAmw== + S: A001 OK Kerberos V4 authentication successful + + + S: * OK IMAP4 Server + C: A001 AUTHENTICATE KERBEROS_V4 + S: + gcfgCA== + C: BAcAQU5EUkVXLkNNVS5FRFUAOCAsho84kLN3/IJmrMG+25a4DT + +nZImJjnTNHJUtxAA+o0KPKfHEcAFs9a3CL5Oebe/ydHJUwYFd + WwuQ1MWiy6IesKvjL5rL9WjXUb9MwT9bpObYLGOKi1Qh + S: A001 NO Kerberos V4 authentication failed + +7.2. GSSAPI mechanism + + The mechanism name associated with all mechanisms employing the + GSSAPI [RFC 2078] is "GSSAPI". + +7.2.1 Client side of authentication protocol exchange + + The client calls GSS_Init_sec_context, passing in 0 for + input_context_handle (initially) and a targ_name equal to output_name + from GSS_Import_Name called with input_name_type of + GSS_C_NT_HOSTBASED_SERVICE and input_name_string of + "service@hostname" where "service" is the service name specified in + the protocol's profile, and "hostname" is the fully qualified host + name of the server. The client then responds with the resulting + output_token. If GSS_Init_sec_context returns GSS_S_CONTINUE_NEEDED, + + + +Myers Standards Track [Page 9] + +RFC 2222 SASL October 1997 + + + then the client should expect the server to issue a token in a + subsequent challenge. The client must pass the token to another call + to GSS_Init_sec_context, repeating the actions in this paragraph. + + When GSS_Init_sec_context returns GSS_S_COMPLETE, the client takes + the following actions: If the last call to GSS_Init_sec_context + returned an output_token, then the client responds with the + output_token, otherwise the client responds with no data. The client + should then expect the server to issue a token in a subsequent + challenge. The client passes this token to GSS_Unwrap and interprets + the first octet of resulting cleartext as a bit-mask specifying the + security layers supported by the server and the second through fourth + octets as the maximum size output_message to send to the server. The + client then constructs data, with the first octet containing the + bit-mask specifying the selected security layer, the second through + fourth octets containing in network byte order the maximum size + output_message the client is able to receive, and the remaining + octets containing the authorization identity. The client passes the + data to GSS_Wrap with conf_flag set to FALSE, and responds with the + generated output_message. The client can then consider the server + authenticated. + +7.2.2 Server side of authentication protocol exchange + + The server passes the initial client response to + GSS_Accept_sec_context as input_token, setting input_context_handle + to 0 (initially). If GSS_Accept_sec_context returns + GSS_S_CONTINUE_NEEDED, the server returns the generated output_token + to the client in challenge and passes the resulting response to + another call to GSS_Accept_sec_context, repeating the actions in this + paragraph. + + When GSS_Accept_sec_context returns GSS_S_COMPLETE, the client takes + the following actions: If the last call to GSS_Accept_sec_context + returned an output_token, the server returns it to the client in a + challenge and expects a reply from the client with no data. Whether + or not an output_token was returned (and after receipt of any + response from the client to such an output_token), the server then + constructs 4 octets of data, with the first octet containing a bit- + mask specifying the security layers supported by the server and the + second through fourth octets containing in network byte order the + maximum size output_token the server is able to receive. The server + must then pass the plaintext to GSS_Wrap with conf_flag set to FALSE + and issue the generated output_message to the client in a challenge. + The server must then pass the resulting response to GSS_Unwrap and + interpret the first octet of resulting cleartext as the bit-mask for + the selected security layer, the second through fourth octets as the + maximum size output_message to send to the client, and the remaining + + + +Myers Standards Track [Page 10] + +RFC 2222 SASL October 1997 + + + octets as the authorization identity. The server must verify that + the src_name is authorized to authenticate as the authorization + identity. After these verifications, the authentication process is + complete. + +7.2.3 Security layer + + The security layers and their corresponding bit-masks are as follows: + + 1 No security layer + 2 Integrity protection. + Sender calls GSS_Wrap with conf_flag set to FALSE + 4 Privacy protection. + Sender calls GSS_Wrap with conf_flag set to TRUE + + Other bit-masks may be defined in the future; bits which are not + understood must be negotiated off. + +7.3. S/Key mechanism + + The mechanism name associated with S/Key [RFC 1760] using the MD4 + digest algorithm is "SKEY". + + The client sends an initial response with the authorization identity. + + The server then issues a challenge which contains the decimal + sequence number followed by a single space and the seed string for + the indicated authorization identity. The client responds with the + one-time-password, as either a 64-bit value in network byte order or + encoded in the "six English words" format. + + The server must verify the one-time-password. After this + verification, the authentication process is complete. + + S/Key authentication does not provide for any security layers. + + EXAMPLE: The following are two S/Key login scenarios in the IMAP4 + protocol. + + S: * OK IMAP4 Server + C: A001 AUTHENTICATE SKEY + S: + + C: bW9yZ2Fu + S: + OTUgUWE1ODMwOA== + C: Rk9VUiBNQU5OIFNPT04gRklSIFZBUlkgTUFTSA== + S: A001 OK S/Key authentication successful + + + + + +Myers Standards Track [Page 11] + +RFC 2222 SASL October 1997 + + + S: * OK IMAP4 Server + C: A001 AUTHENTICATE SKEY + S: + + C: c21pdGg= + S: + OTUgUWE1ODMwOA== + C: BsAY3g4gBNo= + S: A001 NO S/Key authentication failed + + The following is an S/Key login scenario in an IMAP4-like protocol + which has an optional "initial response" argument to the AUTHENTICATE + command. + + S: * OK IMAP4-Like Server + C: A001 AUTHENTICATE SKEY bW9yZ2Fu + S: + OTUgUWE1ODMwOA== + C: Rk9VUiBNQU5OIFNPT04gRklSIFZBUlkgTUFTSA== + S: A001 OK S/Key authentication successful + +7.4. External mechanism + + The mechanism name associated with external authentication is + "EXTERNAL". + + The client sends an initial response with the authorization identity. + + The server uses information, external to SASL, to determine whether + the client is authorized to authenticate as the authorization + identity. If the client is so authorized, the server indicates + successful completion of the authentication exchange; otherwise the + server indicates failure. + + The system providing this external information may be, for example, + IPsec or TLS. + + If the client sends the empty string as the authorization identity + (thus requesting the authorization identity be derived from the + client's authentication credentials), the authorization identity is + to be derived from authentication credentials which exist in the + system which is providing the external authentication. + + + + + + + + + + + + +Myers Standards Track [Page 12] + +RFC 2222 SASL October 1997 + + +8. References + + [RFC 2060] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, December 1996. + + [RFC 2078] Linn, J., "Generic Security Service Application Program + Interface, Version 2", RFC 2078, January 1997. + + [RFC 2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", RFC 2119, March 1997. + + [RFC 2223] Postel, J., and J. Reynolds, "Instructions to RFC + Authors", RFC 2223, October 1997. + + [RFC 1760] Haller, N., "The S/Key One-Time Password System", RFC + 1760, February 1995. + + [RFC 1700] Reynolds, J., and J. Postel, "Assigned Numbers", STD 2, + RFC 1700, October 1994. + +9. Security Considerations + + Security issues are discussed throughout this memo. + + The mechanisms that support integrity protection are designed such + that the negotiation of the security layer and authorization identity + is integrity protected. When the client selects a security layer + with at least integrity protection, this protects against an active + attacker hijacking the connection and modifying the authentication + exchange to negotiate a plaintext connection. + + When a server or client supports multiple authentication mechanisms, + each of which has a different security strength, it is possible for + an active attacker to cause a party to use the least secure mechanism + supported. To protect against this sort of attack, a client or + server which supports mechanisms of different strengths should have a + configurable minimum strength that it will use. It is not sufficient + for this minimum strength check to only be on the server, since an + active attacker can change which mechanisms the client sees as being + supported, causing the client to send authentication credentials for + its weakest supported mechanism. + + + + + + + + + + +Myers Standards Track [Page 13] + +RFC 2222 SASL October 1997 + + + The client's selection of a SASL mechanism is done in the clear and + may be modified by an active attacker. It is important for any new + SASL mechanisms to be designed such that an active attacker cannot + obtain an authentication with weaker security properties by modifying + the SASL mechanism name and/or the challenges and responses. + + Any protocol interactions prior to authentication are performed in + the clear and may be modified by an active attacker. In the case + where a client selects integrity protection, it is important that any + security-sensitive protocol negotiations be performed after + authentication is complete. Protocols should be designed such that + negotiations performed prior to authentication should be either + ignored or revalidated once authentication is complete. + +10. Author's Address + + John G. Myers + Netscape Communications + 501 E. Middlefield Road + Mail Stop MV-029 + Mountain View, CA 94043-4042 + + EMail: jgmyers@netscape.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Myers Standards Track [Page 14] + +RFC 2222 SASL October 1997 + + +Appendix A. Relation of SASL to Transport Security + + Questions have been raised about the relationship between SASL and + various services (such as IPsec and TLS) which provide a secured + connection. + + Two of the key features of SASL are: + + 1. The separation of the authorization identity from the identity in + the client's credentials. This permits agents such as proxy + servers to authenticate using their own credentials, yet request + the access privileges of the identity for which they are proxying. + + 2. Upon successful completion of an authentication exchange, the + server knows the authorization identity the client wishes to use. + This allows servers to move to a "user is authenticated" state in + the protocol. + + These features are extremely important to some application protocols, + yet Transport Security services do not always provide them. To + define SASL mechanisms based on these services would be a very messy + task, as the framing of these services would be redundant with the + framing of SASL and some method of providing these important SASL + features would have to be devised. + + Sometimes it is desired to enable within an existing connection the + use of a security service which does not fit the SASL model. (TLS is + an example of such a service.) This can be done by adding a command, + for example "STARTTLS", to the protocol. Such a command is outside + the scope of SASL, and should be different from the command which + starts a SASL authentication protocol exchange. + + In certain situations, it is reasonable to use SASL underneath one of + these Transport Security services. The transport service would + secure the connection, either service would authenticate the client, + and SASL would negotiate the authorization identity. The SASL + negotiation would be what moves the protocol from "unauthenticated" + to "authenticated" state. The "EXTERNAL" SASL mechanism is + explicitly intended to handle the case where the transport service + secures the connection and authenticates the client and SASL + negotiates the authorization identity. + + When using SASL underneath a sufficiently strong Transport Security + service, a SASL security layer would most likely be redundant. The + client and server would thus probably want to negotiate off the use + of a SASL security layer. + + + + + +Myers Standards Track [Page 15] + +RFC 2222 SASL October 1997 + + +Full Copyright Statement + + Copyright (C) The Internet Society (1997). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implmentation may be prepared, copied, published + andand distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + + + + + + + + + + + + + + + + + + + + + + + + +Myers Standards Track [Page 16] + diff --git a/doc/specification/rfc2243.txt b/doc/specification/rfc2243.txt new file mode 100644 index 0000000..0ad5a63 --- /dev/null +++ b/doc/specification/rfc2243.txt @@ -0,0 +1,563 @@ + + + + + + +Network Working Group C. Metz +Request for Comments: 2243 The Inner Net +Category: Standards Track November 1997 + + + + + OTP Extended Responses + + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (1997). All Rights Reserved. + +Abstract + + This document provides a specification for a type of response to an + OTP [RFC 1938] challenge that carries explicit indication of the + response's encoding. Codings for the two mandatory OTP data formats + using this new type of response are presented. + + This document also provides a specification for a response that + allows an OTP generator to request that a server re-initialize a + sequence and change parameters such as the secret pass phrase. + +1. Conventions, Terms, and Notation + + This document specifies the data formats and software behaviors + needed to use OTP extended responses. The data formats are described + three ways: using an ad-hoc UNIX manual page style syntax, using + augmented BNF described in sections two and three of RFC 822, and by + examples. Should there be any conflict between these descriptions, + the augmented BNF takes precedence. The software behaviors are + described in words, and specific behavior compliance requirements are + itemized using the requirements terminology (specifically, the words + MUST, SHOULD, and MAY) defined in RFC 2119. + + + + + + + +Metz Standards Track [Page 1] + +RFC 2243 OTP Extended Responses November 1997 + + +2. Extended Challenges and Extended Responses + + This document builds on the protocol and terminology specified in RFC + 1938 and assumes that you have already read this document and + understand its contents. + + An extended challenge is a single line of printable text terminated + by either a new line sequence appropriate for the context of its use + (e.g., ASCII CR followed by ASCII LF) or a whitespace character. It + contains a standard OTP challenge, a whitespace character, and a list + that generators use to determine which extended responses are + supported by a server. + + An extended response is a single line of printable text terminated by + a new line sequence appropriate for the context of its use. It + contains two or more tokens that are separated with a single colon + (':') character. The first token contains a type specifier that + indicates the format of the rest of the response. The tokens that + follow are argument data for the OTP extended response. At least one + token of data MUST be present. + +2.1. Syntax + + In UNIX manual page like syntax, the general form of an extended + challenge could be described as: + + ext[,[, ...]] + + And the general form of an extended response could be described as: + + :[:[:...]] + + In augmented BNF syntax, the syntax of the general form of an + extended challenge and an extended response is: + + extended-challenge = otp-challenge 1*LWSP-char capability-list + (NL / *LWSP-char) + otp-challenge = + capability-list = "ext" *("," extension-set-id) + extension-set-id = * + extended-response = type 1*(":" argument) NL + type = token + argument = token + token = 1* + NL = + + + + + +Metz Standards Track [Page 2] + +RFC 2243 OTP Extended Responses November 1997 + + + An example of an extended challenge indicating support for OTP + extended responses and for a mythical response set "foo" is: + + otp-md5 123 mi1234 ext,foo + + An example of an extended response using a mythical type named "foo" + is: + + foo:some data:some more data:12345 + +2.2. Requirements + + A server compliant with this specification: + + 1. MUST be able to receive and parse the general form of an + extended response + 2. MUST be able to receive, parse, and correctly process all + extended responses specified in this document + 3. MUST process the type field in a case-insensitive manner + 4. MUST reject any authentication attempt using an extended + response if it does not support that type of response + 5. SHOULD provide an appropriate indication to the generator + if the response was rejected because of (4) + 6. MUST limit the length of the input reasonably + 7. MUST accept otherwise arbitrary amounts of whitespace + wherever a response allows it + 8. MUST be able to receive and correctly process standard OTP + responses + + A generator compliant with this specification: + + 1. MUST be able to generate standard OTP responses + 2. MUST use standard responses unless an extended challenge + has been received for the particular server AND seed + 3. MUST generate the type field in lower case + 4. MUST NOT send a response type for which the server has not + indicated support through an extended challenge + + Extension set identifiers and extension type identifiers named with + the prefix "x-" are reserved for private use among mutually + consenting implementations. Implementations that do not recognise a + particular "x-" extension MUST ignore that extension. This means that + all "x-" extensions are likely to be non-interoperable with other + extensions. Careful consideration should be given to the possibility + of a server interacting with with a generator implementation which, + although it recognizes a given "x-" extension, uses it for a + different purpose. All of the remaining extension namespace is + reserved to IANA, which will only officially assign the extension + + + +Metz Standards Track [Page 3] + +RFC 2243 OTP Extended Responses November 1997 + + + into this namespace after the IESG approves of such an assignment. + During the lifetime of the OTP WG, it is recommended that the IESG + consult with the OTP WG prior to approving such an assignment. + +3. The "hex" and "word" Responses + + There exists a very rare case in which a standard OTP response could + be a valid coding in both the hexadecimal and six-word formats. An + example of this is the response "ABE ACE ADA ADD BAD A." The + solution to this problem mandated by the OTP specification is that + compliant servers MUST attempt to parse and verify a standard + response in both hexadecimal and six-word formats and must consider + the authentication successful if either succeeds. + + This problem can be solved easily using extended responses. The "hex" + response and the "word" response are two response types that encode + an OTP in an extended response that explicitly describes the + encoding. These responses start with a type label of "hex" for a + hexadecimal OTP and "word" for a six-word coded OTP. These responses + contain one argument field that contains a standard OTP response + coded in the indicated format. + +3.1. Syntax + + In UNIX manual page like syntax, the format of these responses could + be described as: + + hex: + word: + + In augmented BNF syntax and with the definitions already provided, + the syntax of these responses is: + + hex-response = "hex:" hex-64bit NL + hex-64bit = 16(hex-char *LWSP-char) + hex-char = ("A" / "B" / "C" / "D" / "E" / "F" / + "a" / "b" / "c" / "d" / "e" / "f" / + "0" / "1" / "2" / "3" / "4" / "5" / + "6" / "7" / "8" / "9") + + word-response = "word:" word-64bit NL + word-64bit = 6(otp-word 1*LWSP-char) + otp-word = + + + + + + + +Metz Standards Track [Page 4] + +RFC 2243 OTP Extended Responses November 1997 + + + Examples of these responses are: + + hex:8720 33d4 6202 9172 + word:VAST SAUL TAKE SODA SUCH BOLT + +3.2. Requirements + + A server compliant with this specification: + + 1. MUST process all arguments in a case-insensitive manner + + A generator compliant with this specification: + + 1. SHOULD generate otp-word tokens in upper case with single + spaces separating them + 2. SHOULD generate hexadecimal numbers using only lower case + for letters + +4. The "init-hex" and "init-word" Responses + + The OTP specification requires that implementations provide a means + for a client to re-initialize or change its OTP information with a + server but does not require any specific protocol for doing it. + Implementations that support the OTP extended responses described in + this document MUST support the response with the "init-hex" and + "init-word" type specifiers, which provide a standard way for a + client to re-initialize its OTP information with a server. This + response is intended to be used only by automated clients. Because of + this, the recommended form of this response uses the hexadecimal + encoding for binary data. It is possible for a user to type an "init- + hex" or "init-word" response. + +4.1. Syntax + + In UNIX manual page like syntax, the format of these responses could + be described as: + + init-hex::: + init-word::: + + In augmented BNF syntax and with the definitions already provided, + the syntax of the "init-hex" response is: + + init-hex-response = "init-hex:" current-OTP ":" new-params ":" + new-OTP NL + + current-OTP = hex-64bit + new-OTP = hex-64bit + + + +Metz Standards Track [Page 5] + +RFC 2243 OTP Extended Responses November 1997 + + + new-params = algorithm SPACE sequence-number SPACE seed + algorithm = "md4" / "md5" / "sha1" + sequence-number = 4*3DIGIT + seed = 16*1(ALPHA / DIGIT) + + In augmented BNF syntax and with the definitions already provided, + the syntax of the "init-word" response is: + + init-word-response = "init-word:" current-OTP ":" new-params ":" + new-OTP NL + + current-OTP = word-64bit + new-OTP = word-64bit + + new-params = algorithm SPACE sequence-number SPACE seed + algorithm = "md4" / "md5" / "sha1" + sequence-number = 4*3DIGIT + seed = 16*1(ALPHA / DIGIT) + + Note that all appropriate fields for the "init-hex" response MUST be + hexadecimally coded and that all appropriate fields for the "init- + word" response MUST be six-word coded. + + Examples of these responses are: + + init-hex:f6bd 6b33 89b8 7203:md5 499 ke6118:23d1 b253 5ae0 2b7e + init-hex:c9b2 12bb 6425 5a0f:md5 499 ke0986:fd17 cef1 b4df 093e + + init-word:MOOD SOFT POP COMB BOLO LIFE:md5 499 ke1235: + ARTY WEAR TAD RUG HALO GIVE + init-word:END KERN BALM NICK EROS WAVY:md5 499 ke1235: + BABY FAIN OILY NIL TIDY DADE + + (Note that all of these responses are one line. Due to their length, + they had to be split into multiple lines in order to be included + here. These responses MUST NOT span more than one line in actual use) + +4.2. Description of Fields + + The current-OTP field contains the (RFC 1938) response to the OTP + challenge. The new-params field contains the parameters for the + client's new requested challenge and the new-OTP field contains a + response to that challenge. If the re-initialization is successful, a + server MUST store the new OTP in its database as the last successful + OTP received and the sequence number in the next challenge presented + by the server MUST be one less than the sequence number specified in + the new-params field. + + + + +Metz Standards Track [Page 6] + +RFC 2243 OTP Extended Responses November 1997 + + + The new-params field is hashed as a string the same way that a seed + or secret pass phrase would be. All other field values are hashed in + their uncoded binary forms, in network byte order and without any + padding. + +4.3. Requirements + + A server compliant with this specification: + + 1. SHOULD NOT allow a user to use the same value for their + seed and secret pass phrase. + 2. MUST disable all OTP access to any principal whose + sequence number would be less than one + 3. MUST decrement the sequence number if a reinitialization + response includes a valid current-OTP, but the server is + unable to successfully process the new-params or new-OTP for + any reason. + + A generator compliant with this specification: + + 1. SHOULD NOT allow a user to use the same value for their + seed and secret pass phrase + 2. MUST take specific steps to prevent infinite loops of + re-initialization attempts in case of failure + 3. SHOULD provide the user with some indication that the + re-initialization is taking place + 4. SHOULD NOT do a re-initialization without the user's + permission, either for that specific instance or as a + configuration option + 5. SHOULD NOT retry a failed re-initialization without a user's + permission + 6. SHOULD warn the user if the sequence number falls below ten + 7. MUST refuse to generate OTPs with a sequence number below one + +5. Security Considerations + + All of the security considerations for the OTP system also apply to + the OTP system with extended responses. + + These extended responses, like OTP itself, do not protect the user + against active attacks. The IPsec Authentication Header (RFC-1826) + (or another technique with at least as much strength as IPsec AH) + SHOULD be used to protect against such attacks. + + The consequences of a successful active attack on the re- + initialization response may be more severe than simply hijacking a + single session. An attacker could substitute his own response for + + + + +Metz Standards Track [Page 7] + +RFC 2243 OTP Extended Responses November 1997 + + + that of a legitimate user. The attacker may then be able to use the + OTP system to authenticate himself as the user at will (at least + until detected). + + Failure to implement server requirement 3 in section 4.3 opens an + implementation to an attack based on replay of the current-OTP part + of the response. + +6. Acknowledgments + + Like RFC 1938, the protocol described in this document was created by + contributors in the IETF OTP working group. Specific contributions + were made by Neil Haller, who provided input on the overall design + requirements of a re-initialization protocol, Denis Pinkas, who + suggested several modifications to the originally proposed re- + initialization protocol, and Phil Servita, who opened the debate with + the first real protocol proposal and provided lots of specific input + on the design of this and earlier protocols. The extensions to the + OTP challenge were suggested by Chris Newman and John Valdes. + + Randall Atkinson and Ted T'so also contributed their views to + discussions about details of the protocol extensions in this + document. + +References + + [RFC 822] Crocker, D., "Standard for the Format of ARPA Internet + Text Messages," RFC 822, August 1982. + + [RFC 1825] Atkinson, R., "Security Architecture for the Internet + Protocol," RFC 1825, August 1995. + + [RFC 1938] Haller, N. and C. Metz, "A One-Time Password System," + RFC 1938, May 1996. + + [RFC 2119] Bradner, S., "Key words for use in RFCs to + Indicate Requirement Level," RFC 2119, + March 1997. + +Author's Address + + Craig Metz + The Inner Net + Box 10314-1936 + Blacksburg, VA 24062-0314 + (DSN) 354-8590 + cmetz@inner.net + + + + +Metz Standards Track [Page 8] + +RFC 2243 OTP Extended Responses November 1997 + + +Appendix: Reference Responses + + The following responses were generated by a development version of + the One-Time Passwords in Everything (OPIE) implementation of this + specification. + + All of these are responses to the challenge: + + otp-md5 499 ke1234 ext + + Note that the re-initialization responses use the same secret pass + phrase for new and current and a new seed of "ke1235". Also, these + responses have been split for formatting purposes into multiple + lines; they MUST NOT be multiple lines in actual use. + + The secret pass phrase for these responses is: + + This is a test. + + The OTP standard hexadecimal response is: + + 5bf0 75d9 959d 036f + + The OTP standard six-word response is: + + BOND FOGY DRAB NE RISE MART + + The OTP extended "hex" response is: + + hex:5Bf0 75d9 959d 036f + + The OTP extended "word" response is: + + word:BOND FOGY DRAB NE RISE MART + + The OTP extended "init-hex" response is: + + init-hex:5bf0 75d9 959d 036f:md5 499 ke1235:3712 dcb4 aa53 16c1 + + The OTP extended "init-word" response is: + + init-word:BOND FOGY DRAB NE RISE MART:md5 499 ke1235: RED HERD + NOW BEAN PA BURG + + + + + + + + +Metz Standards Track [Page 9] + +RFC 2243 OTP Extended Responses November 1997 + + +Full Copyright Statement + + Copyright (C) The Internet Society (1997). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + + + + + + + + + + + + + + + + + + + + + + + + +Metz Standards Track [Page 10] + diff --git a/doc/specification/rfc2245.txt b/doc/specification/rfc2245.txt new file mode 100644 index 0000000..1025a90 --- /dev/null +++ b/doc/specification/rfc2245.txt @@ -0,0 +1,283 @@ + + + + + + +Network Working Group C. Newman +Request for Comments: 2245 Innosoft +Category: Standards Track November 1997 + + + Anonymous SASL Mechanism + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (1997). All Rights Reserved. + +Abstract + + It is common practice on the Internet to permit anonymous access to + various services. Traditionally, this has been done with a plain + text password mechanism using "anonymous" as the user name and + optional trace information, such as an email address, as the + password. As plaintext login commands are not permitted in new IETF + protocols, a new way to provide anonymous login is needed within the + context of the SASL [SASL] framework. + +1. Conventions Used in this Document + + The key words "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", and "MAY" + in this document are to be interpreted as defined in "Key words for + use in RFCs to Indicate Requirement Levels" [KEYWORDS]. + +2. Anonymous SASL mechanism + + The mechanism name associated with anonymous access is "ANONYMOUS". + The mechanism consists of a single message from the client to the + server. The client sends optional trace information in the form of a + human readable string. The trace information should take one of + three forms: an Internet email address, an opaque string which does + not contain the '@' character and can be interpreted by the system + administrator of the client's domain, or nothing. For privacy + reasons, an Internet email address should only be used with + permission from the user. + + + + + +Newman Standards Track [Page 1] + +RFC 2245 Anonymous SASL Mechanism November 1997 + + + A server which permits anonymous access will announce support for the + ANONYMOUS mechanism, and allow anyone to log in using that mechanism, + usually with restricted access. + + The formal grammar for the client message using Augmented BNF [ABNF] + follows. + + message = [email / token] + + TCHAR = %x20-3F / %x41-7E + ;; any printable US-ASCII character except '@' + + email = addr-spec + ;; as defined in [IMAIL], except with no free + ;; insertion of linear-white-space, and the + ;; local-part MUST either be entirely enclosed in + ;; quotes or entirely unquoted + + token = 1*255TCHAR + +3. Example + + + Here is a sample anonymous login between an IMAP client and server. + In this example, "C:" and "S:" indicate lines sent by the client and + server respectively. If such lines are wrapped without a new "C:" or + "S:" label, then the wrapping is for editorial clarity and is not + part of the command. + + Note that this example uses the IMAP profile [IMAP4] of SASL. The + base64 encoding of challenges and responses, as well as the "+ " + preceding the responses are part of the IMAP4 profile, not part of + SASL itself. Newer profiles of SASL will include the client message + with the AUTHENTICATE command itself so the extra round trip below + (the server response with an empty "+ ") can be eliminated. + + In this example, the user's opaque identification token is "sirhc". + + S: * OK IMAP4 server ready + C: A001 CAPABILITY + S: * CAPABILITY IMAP4 IMAP4rev1 AUTH=CRAM-MD5 AUTH=ANONYMOUS + S: A001 OK done + C: A002 AUTHENTICATE ANONYMOUS + S: + + C: c2lyaGM= + S: A003 OK Welcome, trace information has been logged. + + + + + +Newman Standards Track [Page 2] + +RFC 2245 Anonymous SASL Mechanism November 1997 + + +4. Security Considerations + + The anonymous mechanism grants access to information by anyone. For + this reason it should be disabled by default so the administrator can + make an explicit decision to enable it. + + If the anonymous user has any write privileges, a denial of service + attack is possible by filling up all available space. This can be + prevented by disabling all write access by anonymous users. + + If anonymous users have read and write access to the same area, the + server can be used as a communication mechanism to anonymously + exchange information. Servers which accept anonymous submissions + should implement the common "drop box" model which forbids anonymous + read access to the area where anonymous submissions are accepted. + + If the anonymous user can run many expensive operations (e.g., an + IMAP SEARCH BODY command), this could enable a denial of service + attack. Servers are encouraged to limit the number of anonymous + users and reduce their priority or limit their resource usage. + + If there is no idle timeout for the anonymous user and there is a + limit on the number of anonymous users, a denial of service attack is + enabled. Servers should implement an idle timeout for anonymous + users. + + The trace information is not authenticated so it can be falsified. + This can be used as an attempt to get someone else in trouble for + access to questionable information. Administrators trying to trace + abuse need to realize this information may be falsified. + + A client which uses the user's correct email address as trace + information without explicit permission may violate that user's + privacy. Information about who accesses an anonymous archive on a + sensitive subject (e.g., sexual abuse) has strong privacy needs. + Clients should not send the email address without explicit permission + of the user and should offer the option of supplying no trace token + -- thus only exposing the source IP address and time. Anonymous + proxy servers could enhance this privacy, but would have to consider + the resulting potential denial of service attacks. + + Anonymous connections are susceptible to man in the middle attacks + which view or alter the data transferred. Clients and servers are + encouraged to support external integrity and encryption mechanisms. + + Protocols which fail to require an explicit anonymous login are more + susceptible to break-ins given certain common implementation + techniques. Specifically, Unix servers which offer user login may + + + +Newman Standards Track [Page 3] + +RFC 2245 Anonymous SASL Mechanism November 1997 + + + initially start up as root and switch to the appropriate user id + after an explicit login command. Normally such servers refuse all + data access commands prior to explicit login and may enter a + restricted security environment (e.g., the Unix chroot function) for + anonymous users. If anonymous access is not explicitly requested, + the entire data access machinery is exposed to external security + attacks without the chance for explicit protective measures. + Protocols which offer restricted data access should not allow + anonymous data access without an explicit login step. + +5. References + + [ABNF] Crocker, D. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", RFC 2234, November 1997. + + [IMAIL] Crocker, D., "Standard for the Format of Arpa Internet Text + Messages", STD 11, RFC 822, August 1982. + + [IMAP4] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, December 1996. + + [KEYWORDS] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", RFC 2119, March 1997. + + [SASL] Myers, J., "Simple Authentication and Security Layer (SASL)", + RFC 2222, October 1997. + +6. Author's Address + + Chris Newman + Innosoft International, Inc. + 1050 Lakes Drive + West Covina, CA 91790 USA + + Email: chris.newman@innosoft.com + + + + + + + + + + + + + + + + +Newman Standards Track [Page 4] + +RFC 2245 Anonymous SASL Mechanism November 1997 + + +7. Full Copyright Statement + + Copyright (C) The Internet Society (1997). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + + + + + + + + + + + + + + + + + + + + + + + + +Newman Standards Track [Page 5] + diff --git a/doc/specification/rfc2289.txt b/doc/specification/rfc2289.txt new file mode 100644 index 0000000..8d1d722 --- /dev/null +++ b/doc/specification/rfc2289.txt @@ -0,0 +1,1403 @@ + + + + + + +Network Working Group N. Haller +Request for Comments: 2289 Bellcore +Obsoletes: 1938 C. Metz +Category: Standards Track Kaman Sciences Corporation + P. Nesser + Nesser & Nesser Consulting + M. Straw + Bellcore + February 1998 + + + A One-Time Password System + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (1998). All Rights Reserved. + +1.0 ABSTRACT + + This document describes a one-time password authentication system + (OTP). The system provides authentication for system access (login) + and other applications requiring authentication that is secure + against passive attacks based on replaying captured reusable + passwords. OTP evolved from the S/KEY (S/KEY is a trademark of + Bellcore) One-Time Password System that was released by Bellcore and + is described in references [3] and [5]. + +2.0 OVERVIEW + + One form of attack on networked computing systems is eavesdropping on + network connections to obtain authentication information such as the + login IDs and passwords of legitimate users. Once this information is + captured, it can be used at a later time to gain access to the + system. One-time password systems are designed to counter this type + of attack, called a "replay attack" [4]. + + The authentication system described in this document uses a secret + pass-phrase to generate a sequence of one-time (single use) + passwords. With this system, the user's secret pass-phrase never + needs to cross the network at any time such as during authentication + + + +Haller Standards Track [Page 1] + +RFC 2289 A One-Time Password System February 1998 + + + or during pass-phrase changes. Thus, it is not vulnerable to replay + attacks. Added security is provided by the property that no secret + information need be stored on any system, including the server being + protected. + + The OTP system protects against external passive attacks against the + authentication subsystem. It does not prevent a network eavesdropper + from gaining access to private information and does not provide + protection against either "social engineering" or active attacks [9]. + +3.0 INTRODUCTION + + There are two entities in the operation of the OTP one-time password + system. The generator must produce the appropriate one-time password + from the user's secret pass-phrase and from information provided in + the challenge from the server. The server must send a challenge that + includes the appropriate generation parameters to the generator, must + verify the one-time password received, must store the last valid + one-time password it received, and must store the corresponding one- + time password sequence number. The server must also facilitate the + changing of the user's secret pass-phrase in a secure manner. + + The OTP system generator passes the user's secret pass-phrase, along + with a seed received from the server as part of the challenge, + through multiple iterations of a secure hash function to produce a + one-time password. After each successful authentication, the number + of secure hash function iterations is reduced by one. Thus, a unique + sequence of passwords is generated. The server verifies the one-time + password received from the generator by computing the secure hash + function once and comparing the result with the previously accepted + one-time password. This technique was first suggested by Leslie + Lamport [1]. + +4.0 REQUIREMENTS TERMINOLOGY + + In this document, the words that are used to define the significance + of each particular requirement are usually capitalized. These words + are: + + - MUST + + This word or the adjective "REQUIRED" means that the item is an + absolute requirement of the specification. + + + + + + + + +Haller Standards Track [Page 2] + +RFC 2289 A One-Time Password System February 1998 + + + - SHOULD + + This word or the adjective "RECOMMENDED" means that there might + exist valid reasons in particular circumstances to ignore this + item, but the full implications should be understood and the case + carefully weighed before taking a different course. + + - MAY + + This word or the adjective "OPTIONAL" means that this item is + truly optional. One vendor might choose to include the item + because a particular marketplace requires it or because it + enhances the product, for example; another vendor may omit the + same item. + +5.0 SECURE HASH FUNCTION + + The security of the OTP system is based on the non-invertability of a + secure hash function. Such a function must be tractable to compute in + the forward direction, but computationally infeasible to invert. + + The interfaces are currently defined for three such hash algorithms, + MD4 [2] and MD5 [6] by Ronald Rivest, and SHA [7] by NIST. All + conforming implementations of both server and generators MUST support + MD5. They SHOULD support SHA and MAY also support MD4. Clearly, the + generator and server must use the same algorithm in order to + interoperate. Other hash algorithms may be specified for use with + this system by publishing the appropriate interfaces. + + The secure hash algorithms listed above have the property that they + accept an input that is arbitrarily long and produce a fixed size + output. The OTP system folds this output to 64 bits using the + algorithms in the Appendix A. 64 bits is also the length of the one- + time passwords. This is believed to be long enough to be secure and + short enough to be entered manually (see below, Form of Output) when + necessary. + +6.0 GENERATION OF ONE-TIME PASSWORDS + + This section describes the generation of the one-time passwords. + This process consists of an initial step in which all inputs are + combined, a computation step where the secure hash function is + applied a specified number of times, and an output function where the + 64 bit one-time password is converted to a human readable form. + + Appendix C contains examples of the outputs given a collection of + inputs. It provides implementors with a means of verification the + use of these algorithms. + + + +Haller Standards Track [Page 3] + +RFC 2289 A One-Time Password System February 1998 + + + Initial Step + + In principle, the user's secret pass-phrase may be of any length. To + reduce the risk from techniques such as exhaustive search or + dictionary attacks, character string pass-phrases MUST contain at + least 10 characters (see Form of Inputs below). All implementations + MUST support a pass-phrases of at least 63 characters. The secret + pass-phrase is frequently, but is not required to be, textual + information provided by a user. + + In this step, the pass phrase is concatenated with a seed that is + transmitted from the server in clear text. This non-secret seed + allows clients to use the same secret pass-phrase on multiple + machines (using different seeds) and to safely recycle their secret + pass-phrases by changing the seed. + + The result of the concatenation is passed through the secure hash + function and then is reduced to 64 bits using one of the function + dependent algorithms shown in Appendix A. + + Computation Step + + A sequence of one-time passwords is produced by applying the secure + hash function multiple times to the output of the initial step + (called S). That is, the first one-time password to be used is + produced by passing S through the secure hash function a number of + times (N) specified by the user. The next one-time password to be + used is generated by passing S though the secure hash function N-1 + times. An eavesdropper who has monitored the transmission of a one- + time password would not be able to generate the next required + password because doing so would mean inverting the hash function. + + Form of Inputs + + The secret pass-phrase is seen only by the OTP generator. To allow + interchangeability of generators, all generators MUST support a + secret pass-phrase of 10 to 63 characters. Implementations MAY + support a longer pass-phrase, but such implementations risk the loss + of interchangeability with implementations supporting only the + minimum. + + The seed MUST consist of purely alphanumeric characters and MUST be + of one to 16 characters in length. The seed is a string of characters + that MUST not contain any blanks and SHOULD consist of strictly + alphanumeric characters from the ISO-646 Invariant Code Set. The + seed MUST be case insensitive and MUST be internally converted to + lower case before it is processed. + + + + +Haller Standards Track [Page 4] + +RFC 2289 A One-Time Password System February 1998 + + + The sequence number and seed together constitute a larger unit of + data called the challenge. The challenge gives the generator the + parameters it needs to calculate the correct one-time password from + the secret pass-phrase. The challenge MUST be in a standard syntax so + that automated generators can recognize the challenge in context and + extract these parameters. The syntax of the challenge is: + + otp- + + The three tokens MUST be separated by a white space (defined as any + number of spaces and/or tabs) and the entire challenge string MUST be + terminated with either a space or a new line. The string "otp-" MUST + be in lower case. The algorithm identifier is case sensitive (the + existing identifiers are all lower case), and the seed is case + insensitive and converted before use to lower case. If additional + algorithms are defined, appropriate identifiers (short, but not + limited to three or four characters) must be defined. The currently + defined algorithm identifiers are: + + md4 MD4 Message Digest + md5 MD5 Message Digest + sha1 NIST Secure Hash Algorithm Revision 1 + + An example of an OTP challenge is: otp-md5 487 dog2 + + Form of Output + + The one-time password generated by the above procedure is 64 bits in + length. Entering a 64 bit number is a difficult and error prone + process. Some generators insert this password into the input stream + and some others make it available for system "cut and paste." Still + other arrangements require the one-time password to be entered + manually. The OTP system is designed to facilitate this manual entry + without impeding automatic methods. The one-time password therefore + MAY be converted to, and all servers MUST be capable of accepting it + as, a sequence of six short (1 to 4 letter) easily typed words that + only use characters from ISO-646 IVCS. Each word is chosen from a + dictionary of 2048 words; at 11 bits per word, all one-time passwords + may be encoded. + + The two extra bits in this encoding are used to store a checksum. + The 64 bits of key are broken down into pairs of bits, then these + pairs are summed together. The two least significant bits of this sum + are encoded in the last two bits of the six word sequence with the + least significant bit of the sum as the last bit encoded. All OTP + generators MUST calculate this checksum and all OTP servers MUST + verify this checksum explicitly as part of the operation of decoding + this representation of the one-time password. + + + +Haller Standards Track [Page 5] + +RFC 2289 A One-Time Password System February 1998 + + + Generators that produce the six-word format MUST present the words in + upper case with single spaces used as separators. All servers MUST + accept six-word format without regard to case and white space used as + a separator. The two lines below represent the same one-time + password. The first is valid as output from a generator and as input + a server, the second is valid only as human input to a server. + + OUST COAT FOAL MUG BEAK TOTE + oust coat foal mug beak tote + + Interoperability requires that all OTP servers and generators use + the same dictionary. The standard dictionary was originally + specified in the "S/KEY One Time Password System" that is described + in RFC 1760 [5]. This dictionary is included in this document as + Appendix D. + + To facilitate the implementation of smaller generators, hexadecimal + output is an acceptable alternative for the presentation of the + one-time password. All implementations of the server software MUST + accept case-insensitive hexadecimal as well as six-word format. The + hexadecimal digits may be separated by white space so servers are + REQUIRED to ignore all white space. If the representation is + partitioned by white space, leading zeros must be retained. + Examples of hexadecimal format are: + + Representation Value + + 3503785b369cda8b 0x3503785b369cda8b + e5cc a1b8 7c13 096b 0xe5cca1b87c13096b + C7 48 90 F4 27 7B A1 CF 0xc74890f4277ba1cf + 47 9 A68 28 4C 9D 0 1BC 0x479a68284c9d01bc + + In addition to accepting six-word and hexadecimal encodings of the + 64 bit one-time password, servers SHOULD accept the alternate + dictionary encoding described in Appendix B. The six words in this + encoding MUST not overlap the set of words in the standard + dictionary. To avoid ambiguity with the hexadecimal representation, + words in the alternate dictionary MUST not be comprised solely of + the letters A-F. Decoding words thus encoded does not require any + knowledge of the alternative dictionary used so the acceptance of + any alternate dictionary implies the acceptance of all alternate + dictionaries. Words in the alternative dictionaries are case + sensitive. Generators and servers MUST preserve the case in the + processing of these words. + + In summary, all conforming servers MUST accept six-word input that + uses the Standard Dictionary (RFC 1760 and Appendix D), MUST accept + hexadecimal encoding, and SHOULD accept six-word input that uses the + + + +Haller Standards Track [Page 6] + +RFC 2289 A One-Time Password System February 1998 + + + Alternative Dictionary technique (Appendix B). As there is a remote + possibility that a hexadecimal encoding of a one-time password will + look like a valid six-word standard dictionary encoding, all + implementations MUST use the following scheme. If a six-word + encoded one-time password is valid, it is accepted. Otherwise, if + the one-time password can be interpreted as hexadecimal, and with + that decoding it is valid, then it is accepted. + +7.0 VERIFICATION OF ONE-TIME PASSWORDS + + An application on the server system that requires OTP authentication + is expected to issue an OTP challenge as described above. Given the + parameters from this challenge and the secret pass-phrase, the + generator can compute (or lookup) the one-time password that is + passed to the server to be verified. + + The server system has a database containing, for each user, the + one-time password from the last successful authentication or the + first OTP of a newly initialized sequence. To authenticate the user, + the server decodes the one-time password received from the generator + into a 64-bit key and then runs this key through the secure hash + function once. If the result of this operation matches the stored + previous OTP, the authentication is successful and the accepted + one-time password is stored for future use. + +8.0 PASS-PHRASE CHANGES + + Because the number of hash function applications executed by the + generator decreases by one each time, at some point the user must + reinitialize the system or be unable to authenticate. + + Although some installations may not permit users to initialize + remotely, implementations MUST provide a means to do so that does + not reveal the user's secret pass-phrase. One way is to provide a + means to reinitialize the sequence through explicit specification + of the first one-time password. + + When the sequence of one-time passwords is reinitialized, + implementations MUST verify that the seed or the pass-phrase is + changed. Installations SHOULD discourage any operation that sends + the secret pass-phrase over a network in clear-text as such practice + defeats the concept of a one-time password. + + Implementations MAY use the following technique for + [re]initialization: + + + + + + +Haller Standards Track [Page 7] + +RFC 2289 A One-Time Password System February 1998 + + + o The user picks a new seed and hash count (default values may + be offered). The user provides these, along with the + corresponding generated one-time password, to the host system. + + o The user MAY also provide the corresponding generated one + time password for count-1 as an error check. + + o The user SHOULD provide the generated one-time password for + the old seed and old hash count to protect an idle terminal + or workstation (this implies that when the count is 1, the + user can login but cannot then change the seed or count). + + In the future a specific protocol may be defined for + reinitialization that will permit smooth and possibly automated + interoperation of all hosts and generators. + +9.0 PROTECTION AGAINST RACE ATTACK + + All conforming server implementations MUST protect against the race + condition described in this section. A defense against this attack + is outlined; implementations MAY use this approach or MAY select an + alternative defense. + + It is possible for an attacker to listen to most of a one-time + password, guess the remainder, and then race the legitimate user to + complete the authentication. Multiple guesses against the last word + of the six-word format are likely to succeed. + + One possible defense is to prevent a user from starting multiple + simultaneous authentication sessions. This means that once the + legitimate user has initiated authentication, an attacker would be + blocked until the first authentication process has completed. In + this approach, a timeout is necessary to thwart a denial of service + attack. + +10.0 SECURITY CONSIDERATIONS + + This entire document discusses an authentication system that + improves security by limiting the danger of eavesdropping/replay + attacks that have been used against simple password systems [4]. + + The use of the OTP system only provides protections against passive + eavesdropping/replay attacks. It does not provide for the privacy + of transmitted data, and it does not provide protection against + active attacks such as session hijacking that are known to be + present in the current Internet [9]. The use of IP Security + (IPsec), see [10], [11], and [12] is recommended to protect against + TCP session hijacking. + + + +Haller Standards Track [Page 8] + +RFC 2289 A One-Time Password System February 1998 + + + The success of the OTP system to protect host systems is dependent + on the non-invertability of the secure hash functions used. To our + knowledge, none of the hash algorithms have been broken, but it is + generally believed [6] that MD4 is not as strong as MD5. If a + server supports multiple hash algorithms, it is only as secure as + the weakest algorithm. + +11.0 ACKNOWLEDGMENTS + + The idea behind OTP authentication was first proposed by Leslie + Lamport [1]. Bellcore's S/KEY system, from which OTP is derived, was + proposed by Phil Karn, who also wrote most of the Bellcore reference + implementation. + +12.0 REFERENCES + + [1] Leslie Lamport, "Password Authentication with Insecure + Communication", Communications of the ACM 24.11 (November + 1981), 770-772 + + [2] Rivest, R., "The MD4 Message-Digest Algorithm", RFC 1320, + April 1992. + + [3] Neil Haller, "The S/KEY One-Time Password System", Proceedings + of the ISOC Symposium on Network and Distributed System + Security, February 1994, San Diego, CA + + [4] Haller, N., and R. Atkinson, "On Internet Authentication", + RFC 1704, October 1994. + + [5] Haller, N., "The S/KEY One-Time Password System", + RFC 1760, February 1995. + + [6] Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321, + April 1992. + + [7] National Institute of Standards and Technology (NIST), + "Announcing the Secure Hash Standard", FIPS 180-1, U.S. + Department of Commerce, April 1995. + + [8] International Standard - Information Processing -- ISO 7-bit + coded character set for information interchange (Invariant Code + Set), ISO-646, International Standards Organization, Geneva, + Switzerland, 1983 + + + + + + + +Haller Standards Track [Page 9] + +RFC 2289 A One-Time Password System February 1998 + + + [9] Computer Emergency Response Team (CERT), "IP Spoofing and + Hijacked Terminal Connections", CA-95:01, January 1995. + Available via anonymous ftp from info.cert.org in + /pub/cert_advisories. + + [10] Atkinson, R., "Security Architecture for the Internet Protocol", + RFC 1825, August 1995. + + [11] Atkinson, R., "IP Authentication Header", RFC 1826, August + 1995. + + [12] Atkinson, R., "IP Encapsulating Security Payload (ESP)", RFC + 1827, August 1995. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Haller Standards Track [Page 10] + +RFC 2289 A One-Time Password System February 1998 + + +13.0 AUTHORS' ADDRESSES + + Neil Haller + Bellcore + MCC 1C-265B + 445 South Street + Morristown, NJ, 07960-6438, USA + + Phone: +1 201 829-4478 + Fax: +1 201 829-2504 + EMail: nmh@bellcore.com + + + Craig Metz + Kaman Sciences Corporation + For NRL Code 5544 + 4555 Overlook Avenue, S.W. + Washington, DC, 20375-5337, USA + + Phone: +1 202 404-7122 + Fax: +1 202 404-7942 + EMail: cmetz@cs.nrl.navy.mil + + + Philip J. Nesser II + Nesser & Nesser Consulting + 13501 100th Ave NE + Suite 5202 + Kirkland, WA 98034, USA + + Phone: +1 206 481 4303 + EMail: pjnesser@martigny.ai.mit.edu + + + Mike Straw + Bellcore + RRC 1A-225 + 445 Hoes Lane + Piscataway, NJ 08854-4182 + + Phone: +1 908 699-5212 + EMail: mess@bellcore.com + + + + + + + + + +Haller Standards Track [Page 11] + +RFC 2289 A One-Time Password System February 1998 + + +Appendix A - Interfaces to Secure Hash Algorithms + + Original interoperability tests provided valuable insights into the + subtle problems which occur when converting protocol specifications + into running code. In particular, the manipulation of bit ordered + data is dependent on the architecture of the hardware, specifically + the way in which a computer stores multi-byte data. The method is + typically called big or little "endian." A big endian machine stores + data with the most significant byte first, while a little endian + machine stores the least significant byte first. Thus, on a big + endian machine data is stored left to right, while little endian + machines store data right to left. + + For example, the four byte value 0x11AABBCC is stored in a big endian + machine as the following series of four bytes, "0x11", "0xAA", + "0xBB", and "0xCC", while on a little endian machine the value would + be stored as "0xCC", "0xBB", "0xAA", and "0x11". + + For historical reasons, and to promote interoperability with existing + implementations, it was decided that ALL hashes incorporated into the + OTP protocol MUST store the output of their hash function in LITTLE + ENDIAN format BEFORE the bit folding to 64 bits occurs. This is done + in the implementations of MD4 and MD5 (see references [2] and [6]), + while it must be explicitly done for the implementation of SHA1 (see + reference [7]). + + Any future hash functions implemented into the OTP protocol SHOULD + provide a similar reference fragment of code to allow independent + implementations to operate successfully. + + + MD4 Message Digest (see reference [2]) + + MD4_CTX md; + unsigned char result[16]; + + strcpy(buf, seed); /* seed must be in lower case */ + strcat(buf, passwd); + MD4Init(&md); + MD4Update(&md, (unsigned char *)buf, strlen(buf)); + MD4Final(result, &md); + + /* Fold the 128 bit result to 64 bits */ + for (i = 0; i < 8; i++) + result[i] ^= result[i+8]; + + + + + + +Haller Standards Track [Page 12] + +RFC 2289 A One-Time Password System February 1998 + + +MD5 Message Digest (see reference [6]) + + MD5_CTX md; + unsigned char result[16]; + strcpy(buf, seed); /* seed must be in lower case */ + strcat(buf, passwd); + MD5Init(&md); + MD5Update(&md, (unsigned char *)buf, strlen(buf)); + MD5Final(result, &md); + + /* Fold the 128 bit result to 64 bits */ + for (i = 0; i < 8; i++) + result[i] ^= result[i+8]; + + +SHA Secure Hash Algorithm (see reference [7]) + + SHA_INFO sha; + unsigned char result[16]; + strcpy(buf, seed); /* seed must be in lower case */ + strcat(buf, passwd); + sha_init(&sha); + sha_update(&sha, (unsigned char *)buf, strlen(buf)); + sha_final(&sha); /* NOTE: no result buffer */ + + /* Fold the 160 bit result to 64 bits */ + sha.digest[0] ^= sha.digest[2]; + sha.digest[1] ^= sha.digest[3]; + sha.digest[0] ^= sha.digest[4]; + + /* + * copy the resulting 64 bits to the result buffer in little endian + * fashion (analogous to the way MD4Final() and MD5Final() do). + */ + for (i = 0, j = 0; j < 8; i++, j += 4) + { + result[j] = (unsigned char)(sha.digest[i] & 0xff); + result[j+1] = (unsigned char)((sha.digest[i] >> 8) & 0xff); + result[j+2] = (unsigned char)((sha.digest[i] >> 16) & 0xff); + result[j+3] = (unsigned char)((sha.digest[i] >> 24) & 0xff); + } + + + + + + + + + + +Haller Standards Track [Page 13] + +RFC 2289 A One-Time Password System February 1998 + + +Appendix B - Alternative Dictionary Algorithm + + The purpose of alternative dictionary encoding of the OTP one-time + password is to allow the use of language specific or friendly words. + As case translation is not always well defined, the alternative + dictionary encoding is case sensitive. Servers SHOULD accept this + encoding in addition to the standard 6-word and hexadecimal + encodings. + + + GENERATOR ENCODING USING AN ALTERNATE DICTIONARY + + The standard 6-word encoding uses the placement of a word in the + dictionary to represent an 11-bit number. The 64-bit one-time + password can then be represented by six words. + + An alternative dictionary of 2048 words may be created such that + each word W and position of the word in the dictionary N obey the + relationship: + + alg( W ) % 2048 == N + where + alg is the hash algorithm used (e.g. MD4, MD5, SHA1). + + In addition, no words in the standard dictionary may be chosen. + + The generator expands the 64-bit one-time password to 66 bits by + computing parity as with the standard 6-word encoding. The six 11- + bit numbers are then converted to words using the dictionary that + was created such that the above relationship holds. + + SERVER DECODING OF ALTERNATE DICTIONARY ONE-TIME PASSWORDS + + The server accepting alternative dictionary encoding converts each + word to an 11-bit number using the above encoding. These numbers + are then used in the same way as the decoded standard dictionary + words to form the 66-bit one-time password. + + The server does not need to have access to the alternate dictionary + that was used to create the one-time password it is authenticating. + This is because the decoding from word to 11-bit number does not + make any use of the dictionary. As a result of the independence of + the dictionary, a server accepting one alternate dictionary accept + all alternate dictionaries. + + + + + + + +Haller Standards Track [Page 14] + +RFC 2289 A One-Time Password System February 1998 + + +Appendix C - OTP Verification Examples + + This appendix provides a series of inputs and correct outputs for all + three of the defined OTP cryptographic hashes, specifically MD4, MD5, + and SHA1. This document is intended to be used by developers for + interoperability checks when creating generators or servers. Output + is provided in both hexadecimal notation and the six word encoding + documented in Appendix D. + + GENERAL CHECKS + + Note that the output given for these checks is not intended to be + taken literally, but describes the type of action that should be + taken. + + Pass Phrase Length + + Input: + Pass Phrase: Too_short + Seed: iamvalid + Count: 99 + Hash: ANY + Output: + ERROR: Pass Phrase too short + + Input: + Pass Phrase: + 1234567890123456789012345678901234567890123456789012345678901234 + Seed: iamvalid + Count: 99 + Hash: ANY + Output: + WARNING: Pass Phrase longer than the recommended maximum length of +63 + +Seed Values + + Input: + Pass Phrase: A_Valid_Pass_Phrase + Seed: Length_Okay + Count: 99 + Hash: ANY + Output: + ERROR: Seed must be purely alphanumeric + + Input: + Pass Phrase: A_Valid_Pass_Phrase + Seed: LengthOfSeventeen + + + +Haller Standards Track [Page 15] + +RFC 2289 A One-Time Password System February 1998 + + + Count: 99 + Hash: ANY + + Output: + ERROR: Seed must be between 1 and 16 characters in length + + Input: + Pass Phrase: A_Valid_Pass_Phrase + Seed: A Seed + Count: 99 + Hash: ANY + Output: + ERROR: Seed must not contain any spaces + +Parity Calculations + + Input: + Pass Phrase: A_Valid_Pass_Phrase + Seed: AValidSeed + Count: 99 + Hash: MD5 + Output: + Hex: 85c43ee03857765b + Six Word(CORRECT): FOWL KID MASH DEAD DUAL OAF + Six Word(INCORRECT PARITY): FOWL KID MASH DEAD DUAL NUT + Six Word(INCORRECT PARITY): FOWL KID MASH DEAD DUAL O + Six Word(INCORRECT PARITY): FOWL KID MASH DEAD DUAL OAK + + + + + + + + + + + + + + + + + + + + + + + + +Haller Standards Track [Page 16] + +RFC 2289 A One-Time Password System February 1998 + + +MD4 ENCODINGS + +Pass Phrase Seed Cnt Hex Six Word Format +======================================================================== +This is a test. TeSt 0 D185 4218 EBBB 0B51 + ROME MUG FRED SCAN LIVE LACE +This is a test. TeSt 1 6347 3EF0 1CD0 B444 + CARD SAD MINI RYE COL KIN +This is a test. TeSt 99 C5E6 1277 6E6C 237A + NOTE OUT IBIS SINK NAVE MODE +AbCdEfGhIjK alpha1 0 5007 6F47 EB1A DE4E + AWAY SEN ROOK SALT LICE MAP +AbCdEfGhIjK alpha1 1 65D2 0D19 49B5 F7AB + CHEW GRIM WU HANG BUCK SAID +AbCdEfGhIjK alpha1 99 D150 C82C CE6F 62D1 + ROIL FREE COG HUNK WAIT COCA +OTP's are good correct 0 849C 79D4 F6F5 5388 + FOOL STEM DONE TOOL BECK NILE +OTP's are good correct 1 8C09 92FB 2508 47B1 + GIST AMOS MOOT AIDS FOOD SEEM +OTP's are good correct 99 3F3B F4B4 145F D74B + TAG SLOW NOV MIN WOOL KENO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Haller Standards Track [Page 17] + +RFC 2289 A One-Time Password System February 1998 + + +MD5 ENCODINGS + +Pass Phrase Seed Cnt Hex Six Word Format +======================================================================== +This is a test. TeSt 0 9E87 6134 D904 99DD + INCH SEA ANNE LONG AHEM TOUR +This is a test. TeSt 1 7965 E054 36F5 029F + EASE OIL FUM CURE AWRY AVIS +This is a test. TeSt 99 50FE 1962 C496 5880 + BAIL TUFT BITS GANG CHEF THY +AbCdEfGhIjK alpha1 0 8706 6DD9 644B F206 + FULL PEW DOWN ONCE MORT ARC +AbCdEfGhIjK alpha1 1 7CD3 4C10 40AD D14B + FACT HOOF AT FIST SITE KENT +AbCdEfGhIjK alpha1 99 5AA3 7A81 F212 146C + BODE HOP JAKE STOW JUT RAP +OTP's are good correct 0 F205 7539 43DE 4CF9 + ULAN NEW ARMY FUSE SUIT EYED +OTP's are good correct 1 DDCD AC95 6F23 4937 + SKIM CULT LOB SLAM POE HOWL +OTP's are good correct 99 B203 E28F A525 BE47 + LONG IVY JULY AJAR BOND LEE + + +SHA1 ENCODINGS + +Pass Phrase Seed Cnt Hex Six Word Format +======================================================================== +This is a test. TeSt 0 BB9E 6AE1 979D 8FF4 + MILT VARY MAST OK SEES WENT +This is a test. TeSt 1 63D9 3663 9734 385B + CART OTTO HIVE ODE VAT NUT +This is a test. TeSt 99 87FE C776 8B73 CCF9 + GAFF WAIT SKID GIG SKY EYED +AbCdEfGhIjK alpha1 0 AD85 F658 EBE3 83C9 + LEST OR HEEL SCOT ROB SUIT +AbCdEfGhIjK alpha1 1 D07C E229 B5CF 119B + RITE TAKE GELD COST TUNE RECK +AbCdEfGhIjK alpha1 99 27BC 7103 5AAF 3DC6 + MAY STAR TIN LYON VEDA STAN +OTP's are good correct 0 D51F 3E99 BF8E 6F0B + RUST WELT KICK FELL TAIL FRAU +OTP's are good correct 1 82AE B52D 9437 74E4 + FLIT DOSE ALSO MEW DRUM DEFY +OTP's are good correct 99 4F29 6A74 FE15 67EC + AURA ALOE HURL WING BERG WAIT + + + + + +Haller Standards Track [Page 18] + +RFC 2289 A One-Time Password System February 1998 + + +Appendix D - Dictionary for Converting Between 6-Word and Binary Formats + + This dictionary is from the module put.c in the original Bellcore + reference distribution. + +{ "A", "ABE", "ACE", "ACT", "AD", "ADA", "ADD", +"AGO", "AID", "AIM", "AIR", "ALL", "ALP", "AM", "AMY", +"AN", "ANA", "AND", "ANN", "ANT", "ANY", "APE", "APS", +"APT", "ARC", "ARE", "ARK", "ARM", "ART", "AS", "ASH", +"ASK", "AT", "ATE", "AUG", "AUK", "AVE", "AWE", "AWK", +"AWL", "AWN", "AX", "AYE", "BAD", "BAG", "BAH", "BAM", +"BAN", "BAR", "BAT", "BAY", "BE", "BED", "BEE", "BEG", +"BEN", "BET", "BEY", "BIB", "BID", "BIG", "BIN", "BIT", +"BOB", "BOG", "BON", "BOO", "BOP", "BOW", "BOY", "BUB", +"BUD", "BUG", "BUM", "BUN", "BUS", "BUT", "BUY", "BY", +"BYE", "CAB", "CAL", "CAM", "CAN", "CAP", "CAR", "CAT", +"CAW", "COD", "COG", "COL", "CON", "COO", "COP", "COT", +"COW", "COY", "CRY", "CUB", "CUE", "CUP", "CUR", "CUT", +"DAB", "DAD", "DAM", "DAN", "DAR", "DAY", "DEE", "DEL", +"DEN", "DES", "DEW", "DID", "DIE", "DIG", "DIN", "DIP", +"DO", "DOE", "DOG", "DON", "DOT", "DOW", "DRY", "DUB", +"DUD", "DUE", "DUG", "DUN", "EAR", "EAT", "ED", "EEL", +"EGG", "EGO", "ELI", "ELK", "ELM", "ELY", "EM", "END", +"EST", "ETC", "EVA", "EVE", "EWE", "EYE", "FAD", "FAN", +"FAR", "FAT", "FAY", "FED", "FEE", "FEW", "FIB", "FIG", +"FIN", "FIR", "FIT", "FLO", "FLY", "FOE", "FOG", "FOR", +"FRY", "FUM", "FUN", "FUR", "GAB", "GAD", "GAG", "GAL", +"GAM", "GAP", "GAS", "GAY", "GEE", "GEL", "GEM", "GET", +"GIG", "GIL", "GIN", "GO", "GOT", "GUM", "GUN", "GUS", +"GUT", "GUY", "GYM", "GYP", "HA", "HAD", "HAL", "HAM", +"HAN", "HAP", "HAS", "HAT", "HAW", "HAY", "HE", "HEM", +"HEN", "HER", "HEW", "HEY", "HI", "HID", "HIM", "HIP", +"HIS", "HIT", "HO", "HOB", "HOC", "HOE", "HOG", "HOP", +"HOT", "HOW", "HUB", "HUE", "HUG", "HUH", "HUM", "HUT", +"I", "ICY", "IDA", "IF", "IKE", "ILL", "INK", "INN", +"IO", "ION", "IQ", "IRA", "IRE", "IRK", "IS", "IT", +"ITS", "IVY", "JAB", "JAG", "JAM", "JAN", "JAR", "JAW", +"JAY", "JET", "JIG", "JIM", "JO", "JOB", "JOE", "JOG", +"JOT", "JOY", "JUG", "JUT", "KAY", "KEG", "KEN", "KEY", +"KID", "KIM", "KIN", "KIT", "LA", "LAB", "LAC", "LAD", +"LAG", "LAM", "LAP", "LAW", "LAY", "LEA", "LED", "LEE", +"LEG", "LEN", "LEO", "LET", "LEW", "LID", "LIE", "LIN", +"LIP", "LIT", "LO", "LOB", "LOG", "LOP", "LOS", "LOT", +"LOU", "LOW", "LOY", "LUG", "LYE", "MA", "MAC", "MAD", +"MAE", "MAN", "MAO", "MAP", "MAT", "MAW", "MAY", "ME", +"MEG", "MEL", "MEN", "MET", "MEW", "MID", "MIN", "MIT", +"MOB", "MOD", "MOE", "MOO", "MOP", "MOS", "MOT", "MOW", +"MUD", "MUG", "MUM", "MY", "NAB", "NAG", "NAN", "NAP", + + + +Haller Standards Track [Page 19] + +RFC 2289 A One-Time Password System February 1998 + + +"NAT", "NAY", "NE", "NED", "NEE", "NET", "NEW", "NIB", +"NIL", "NIP", "NIT", "NO", "NOB", "NOD", "NON", "NOR", +"NOT", "NOV", "NOW", "NU", "NUN", "NUT", "O", "OAF", +"OAK", "OAR", "OAT", "ODD", "ODE", "OF", "OFF", "OFT", +"OH", "OIL", "OK", "OLD", "ON", "ONE", "OR", "ORB", +"ORE", "ORR", "OS", "OTT", "OUR", "OUT", "OVA", "OW", +"OWE", "OWL", "OWN", "OX", "PA", "PAD", "PAL", "PAM", +"PAN", "PAP", "PAR", "PAT", "PAW", "PAY", "PEA", "PEG", +"PEN", "PEP", "PER", "PET", "PEW", "PHI", "PI", "PIE", +"PIN", "PIT", "PLY", "PO", "POD", "POE", "POP", "POT", +"POW", "PRO", "PRY", "PUB", "PUG", "PUN", "PUP", "PUT", +"QUO", "RAG", "RAM", "RAN", "RAP", "RAT", "RAW", "RAY", +"REB", "RED", "REP", "RET", "RIB", "RID", "RIG", "RIM", +"RIO", "RIP", "ROB", "ROD", "ROE", "RON", "ROT", "ROW", +"ROY", "RUB", "RUE", "RUG", "RUM", "RUN", "RYE", "SAC", +"SAD", "SAG", "SAL", "SAM", "SAN", "SAP", "SAT", "SAW", +"SAY", "SEA", "SEC", "SEE", "SEN", "SET", "SEW", "SHE", +"SHY", "SIN", "SIP", "SIR", "SIS", "SIT", "SKI", "SKY", +"SLY", "SO", "SOB", "SOD", "SON", "SOP", "SOW", "SOY", +"SPA", "SPY", "SUB", "SUD", "SUE", "SUM", "SUN", "SUP", +"TAB", "TAD", "TAG", "TAN", "TAP", "TAR", "TEA", "TED", +"TEE", "TEN", "THE", "THY", "TIC", "TIE", "TIM", "TIN", +"TIP", "TO", "TOE", "TOG", "TOM", "TON", "TOO", "TOP", +"TOW", "TOY", "TRY", "TUB", "TUG", "TUM", "TUN", "TWO", +"UN", "UP", "US", "USE", "VAN", "VAT", "VET", "VIE", +"WAD", "WAG", "WAR", "WAS", "WAY", "WE", "WEB", "WED", +"WEE", "WET", "WHO", "WHY", "WIN", "WIT", "WOK", "WON", +"WOO", "WOW", "WRY", "WU", "YAM", "YAP", "YAW", "YE", +"YEA", "YES", "YET", "YOU", "ABED", "ABEL", "ABET", "ABLE", +"ABUT", "ACHE", "ACID", "ACME", "ACRE", "ACTA", "ACTS", "ADAM", +"ADDS", "ADEN", "AFAR", "AFRO", "AGEE", "AHEM", "AHOY", "AIDA", +"AIDE", "AIDS", "AIRY", "AJAR", "AKIN", "ALAN", "ALEC", "ALGA", +"ALIA", "ALLY", "ALMA", "ALOE", "ALSO", "ALTO", "ALUM", "ALVA", +"AMEN", "AMES", "AMID", "AMMO", "AMOK", "AMOS", "AMRA", "ANDY", +"ANEW", "ANNA", "ANNE", "ANTE", "ANTI", "AQUA", "ARAB", "ARCH", +"AREA", "ARGO", "ARID", "ARMY", "ARTS", "ARTY", "ASIA", "ASKS", +"ATOM", "AUNT", "AURA", "AUTO", "AVER", "AVID", "AVIS", "AVON", +"AVOW", "AWAY", "AWRY", "BABE", "BABY", "BACH", "BACK", "BADE", +"BAIL", "BAIT", "BAKE", "BALD", "BALE", "BALI", "BALK", "BALL", +"BALM", "BAND", "BANE", "BANG", "BANK", "BARB", "BARD", "BARE", +"BARK", "BARN", "BARR", "BASE", "BASH", "BASK", "BASS", "BATE", +"BATH", "BAWD", "BAWL", "BEAD", "BEAK", "BEAM", "BEAN", "BEAR", +"BEAT", "BEAU", "BECK", "BEEF", "BEEN", "BEER", "BEET", "BELA", +"BELL", "BELT", "BEND", "BENT", "BERG", "BERN", "BERT", "BESS", +"BEST", "BETA", "BETH", "BHOY", "BIAS", "BIDE", "BIEN", "BILE", +"BILK", "BILL", "BIND", "BING", "BIRD", "BITE", "BITS", "BLAB", +"BLAT", "BLED", "BLEW", "BLOB", "BLOC", "BLOT", "BLOW", "BLUE", +"BLUM", "BLUR", "BOAR", "BOAT", "BOCA", "BOCK", "BODE", "BODY", + + + +Haller Standards Track [Page 20] + +RFC 2289 A One-Time Password System February 1998 + + +"BOGY", "BOHR", "BOIL", "BOLD", "BOLO", "BOLT", "BOMB", "BONA", +"BOND", "BONE", "BONG", "BONN", "BONY", "BOOK", "BOOM", "BOON", +"BOOT", "BORE", "BORG", "BORN", "BOSE", "BOSS", "BOTH", "BOUT", +"BOWL", "BOYD", "BRAD", "BRAE", "BRAG", "BRAN", "BRAY", "BRED", +"BREW", "BRIG", "BRIM", "BROW", "BUCK", "BUDD", "BUFF", "BULB", +"BULK", "BULL", "BUNK", "BUNT", "BUOY", "BURG", "BURL", "BURN", +"BURR", "BURT", "BURY", "BUSH", "BUSS", "BUST", "BUSY", "BYTE", +"CADY", "CAFE", "CAGE", "CAIN", "CAKE", "CALF", "CALL", "CALM", +"CAME", "CANE", "CANT", "CARD", "CARE", "CARL", "CARR", "CART", +"CASE", "CASH", "CASK", "CAST", "CAVE", "CEIL", "CELL", "CENT", +"CERN", "CHAD", "CHAR", "CHAT", "CHAW", "CHEF", "CHEN", "CHEW", +"CHIC", "CHIN", "CHOU", "CHOW", "CHUB", "CHUG", "CHUM", "CITE", +"CITY", "CLAD", "CLAM", "CLAN", "CLAW", "CLAY", "CLOD", "CLOG", +"CLOT", "CLUB", "CLUE", "COAL", "COAT", "COCA", "COCK", "COCO", +"CODA", "CODE", "CODY", "COED", "COIL", "COIN", "COKE", "COLA", +"COLD", "COLT", "COMA", "COMB", "COME", "COOK", "COOL", "COON", +"COOT", "CORD", "CORE", "CORK", "CORN", "COST", "COVE", "COWL", +"CRAB", "CRAG", "CRAM", "CRAY", "CREW", "CRIB", "CROW", "CRUD", +"CUBA", "CUBE", "CUFF", "CULL", "CULT", "CUNY", "CURB", "CURD", +"CURE", "CURL", "CURT", "CUTS", "DADE", "DALE", "DAME", "DANA", +"DANE", "DANG", "DANK", "DARE", "DARK", "DARN", "DART", "DASH", +"DATA", "DATE", "DAVE", "DAVY", "DAWN", "DAYS", "DEAD", "DEAF", +"DEAL", "DEAN", "DEAR", "DEBT", "DECK", "DEED", "DEEM", "DEER", +"DEFT", "DEFY", "DELL", "DENT", "DENY", "DESK", "DIAL", "DICE", +"DIED", "DIET", "DIME", "DINE", "DING", "DINT", "DIRE", "DIRT", +"DISC", "DISH", "DISK", "DIVE", "DOCK", "DOES", "DOLE", "DOLL", +"DOLT", "DOME", "DONE", "DOOM", "DOOR", "DORA", "DOSE", "DOTE", +"DOUG", "DOUR", "DOVE", "DOWN", "DRAB", "DRAG", "DRAM", "DRAW", +"DREW", "DRUB", "DRUG", "DRUM", "DUAL", "DUCK", "DUCT", "DUEL", +"DUET", "DUKE", "DULL", "DUMB", "DUNE", "DUNK", "DUSK", "DUST", +"DUTY", "EACH", "EARL", "EARN", "EASE", "EAST", "EASY", "EBEN", +"ECHO", "EDDY", "EDEN", "EDGE", "EDGY", "EDIT", "EDNA", "EGAN", +"ELAN", "ELBA", "ELLA", "ELSE", "EMIL", "EMIT", "EMMA", "ENDS", +"ERIC", "EROS", "EVEN", "EVER", "EVIL", "EYED", "FACE", "FACT", +"FADE", "FAIL", "FAIN", "FAIR", "FAKE", "FALL", "FAME", "FANG", +"FARM", "FAST", "FATE", "FAWN", "FEAR", "FEAT", "FEED", "FEEL", +"FEET", "FELL", "FELT", "FEND", "FERN", "FEST", "FEUD", "FIEF", +"FIGS", "FILE", "FILL", "FILM", "FIND", "FINE", "FINK", "FIRE", +"FIRM", "FISH", "FISK", "FIST", "FITS", "FIVE", "FLAG", "FLAK", +"FLAM", "FLAT", "FLAW", "FLEA", "FLED", "FLEW", "FLIT", "FLOC", +"FLOG", "FLOW", "FLUB", "FLUE", "FOAL", "FOAM", "FOGY", "FOIL", +"FOLD", "FOLK", "FOND", "FONT", "FOOD", "FOOL", "FOOT", "FORD", +"FORE", "FORK", "FORM", "FORT", "FOSS", "FOUL", "FOUR", "FOWL", +"FRAU", "FRAY", "FRED", "FREE", "FRET", "FREY", "FROG", "FROM", +"FUEL", "FULL", "FUME", "FUND", "FUNK", "FURY", "FUSE", "FUSS", +"GAFF", "GAGE", "GAIL", "GAIN", "GAIT", "GALA", "GALE", "GALL", +"GALT", "GAME", "GANG", "GARB", "GARY", "GASH", "GATE", "GAUL", +"GAUR", "GAVE", "GAWK", "GEAR", "GELD", "GENE", "GENT", "GERM", + + + +Haller Standards Track [Page 21] + +RFC 2289 A One-Time Password System February 1998 + + +"GETS", "GIBE", "GIFT", "GILD", "GILL", "GILT", "GINA", "GIRD", +"GIRL", "GIST", "GIVE", "GLAD", "GLEE", "GLEN", "GLIB", "GLOB", +"GLOM", "GLOW", "GLUE", "GLUM", "GLUT", "GOAD", "GOAL", "GOAT", +"GOER", "GOES", "GOLD", "GOLF", "GONE", "GONG", "GOOD", "GOOF", +"GORE", "GORY", "GOSH", "GOUT", "GOWN", "GRAB", "GRAD", "GRAY", +"GREG", "GREW", "GREY", "GRID", "GRIM", "GRIN", "GRIT", "GROW", +"GRUB", "GULF", "GULL", "GUNK", "GURU", "GUSH", "GUST", "GWEN", +"GWYN", "HAAG", "HAAS", "HACK", "HAIL", "HAIR", "HALE", "HALF", +"HALL", "HALO", "HALT", "HAND", "HANG", "HANK", "HANS", "HARD", +"HARK", "HARM", "HART", "HASH", "HAST", "HATE", "HATH", "HAUL", +"HAVE", "HAWK", "HAYS", "HEAD", "HEAL", "HEAR", "HEAT", "HEBE", +"HECK", "HEED", "HEEL", "HEFT", "HELD", "HELL", "HELM", "HERB", +"HERD", "HERE", "HERO", "HERS", "HESS", "HEWN", "HICK", "HIDE", +"HIGH", "HIKE", "HILL", "HILT", "HIND", "HINT", "HIRE", "HISS", +"HIVE", "HOBO", "HOCK", "HOFF", "HOLD", "HOLE", "HOLM", "HOLT", +"HOME", "HONE", "HONK", "HOOD", "HOOF", "HOOK", "HOOT", "HORN", +"HOSE", "HOST", "HOUR", "HOVE", "HOWE", "HOWL", "HOYT", "HUCK", +"HUED", "HUFF", "HUGE", "HUGH", "HUGO", "HULK", "HULL", "HUNK", +"HUNT", "HURD", "HURL", "HURT", "HUSH", "HYDE", "HYMN", "IBIS", +"ICON", "IDEA", "IDLE", "IFFY", "INCA", "INCH", "INTO", "IONS", +"IOTA", "IOWA", "IRIS", "IRMA", "IRON", "ISLE", "ITCH", "ITEM", +"IVAN", "JACK", "JADE", "JAIL", "JAKE", "JANE", "JAVA", "JEAN", +"JEFF", "JERK", "JESS", "JEST", "JIBE", "JILL", "JILT", "JIVE", +"JOAN", "JOBS", "JOCK", "JOEL", "JOEY", "JOHN", "JOIN", "JOKE", +"JOLT", "JOVE", "JUDD", "JUDE", "JUDO", "JUDY", "JUJU", "JUKE", +"JULY", "JUNE", "JUNK", "JUNO", "JURY", "JUST", "JUTE", "KAHN", +"KALE", "KANE", "KANT", "KARL", "KATE", "KEEL", "KEEN", "KENO", +"KENT", "KERN", "KERR", "KEYS", "KICK", "KILL", "KIND", "KING", +"KIRK", "KISS", "KITE", "KLAN", "KNEE", "KNEW", "KNIT", "KNOB", +"KNOT", "KNOW", "KOCH", "KONG", "KUDO", "KURD", "KURT", "KYLE", +"LACE", "LACK", "LACY", "LADY", "LAID", "LAIN", "LAIR", "LAKE", +"LAMB", "LAME", "LAND", "LANE", "LANG", "LARD", "LARK", "LASS", +"LAST", "LATE", "LAUD", "LAVA", "LAWN", "LAWS", "LAYS", "LEAD", +"LEAF", "LEAK", "LEAN", "LEAR", "LEEK", "LEER", "LEFT", "LEND", +"LENS", "LENT", "LEON", "LESK", "LESS", "LEST", "LETS", "LIAR", +"LICE", "LICK", "LIED", "LIEN", "LIES", "LIEU", "LIFE", "LIFT", +"LIKE", "LILA", "LILT", "LILY", "LIMA", "LIMB", "LIME", "LIND", +"LINE", "LINK", "LINT", "LION", "LISA", "LIST", "LIVE", "LOAD", +"LOAF", "LOAM", "LOAN", "LOCK", "LOFT", "LOGE", "LOIS", "LOLA", +"LONE", "LONG", "LOOK", "LOON", "LOOT", "LORD", "LORE", "LOSE", +"LOSS", "LOST", "LOUD", "LOVE", "LOWE", "LUCK", "LUCY", "LUGE", +"LUKE", "LULU", "LUND", "LUNG", "LURA", "LURE", "LURK", "LUSH", +"LUST", "LYLE", "LYNN", "LYON", "LYRA", "MACE", "MADE", "MAGI", +"MAID", "MAIL", "MAIN", "MAKE", "MALE", "MALI", "MALL", "MALT", +"MANA", "MANN", "MANY", "MARC", "MARE", "MARK", "MARS", "MART", +"MARY", "MASH", "MASK", "MASS", "MAST", "MATE", "MATH", "MAUL", +"MAYO", "MEAD", "MEAL", "MEAN", "MEAT", "MEEK", "MEET", "MELD", +"MELT", "MEMO", "MEND", "MENU", "MERT", "MESH", "MESS", "MICE", + + + +Haller Standards Track [Page 22] + +RFC 2289 A One-Time Password System February 1998 + + +"MIKE", "MILD", "MILE", "MILK", "MILL", "MILT", "MIMI", "MIND", +"MINE", "MINI", "MINK", "MINT", "MIRE", "MISS", "MIST", "MITE", +"MITT", "MOAN", "MOAT", "MOCK", "MODE", "MOLD", "MOLE", "MOLL", +"MOLT", "MONA", "MONK", "MONT", "MOOD", "MOON", "MOOR", "MOOT", +"MORE", "MORN", "MORT", "MOSS", "MOST", "MOTH", "MOVE", "MUCH", +"MUCK", "MUDD", "MUFF", "MULE", "MULL", "MURK", "MUSH", "MUST", +"MUTE", "MUTT", "MYRA", "MYTH", "NAGY", "NAIL", "NAIR", "NAME", +"NARY", "NASH", "NAVE", "NAVY", "NEAL", "NEAR", "NEAT", "NECK", +"NEED", "NEIL", "NELL", "NEON", "NERO", "NESS", "NEST", "NEWS", +"NEWT", "NIBS", "NICE", "NICK", "NILE", "NINA", "NINE", "NOAH", +"NODE", "NOEL", "NOLL", "NONE", "NOOK", "NOON", "NORM", "NOSE", +"NOTE", "NOUN", "NOVA", "NUDE", "NULL", "NUMB", "OATH", "OBEY", +"OBOE", "ODIN", "OHIO", "OILY", "OINT", "OKAY", "OLAF", "OLDY", +"OLGA", "OLIN", "OMAN", "OMEN", "OMIT", "ONCE", "ONES", "ONLY", +"ONTO", "ONUS", "ORAL", "ORGY", "OSLO", "OTIS", "OTTO", "OUCH", +"OUST", "OUTS", "OVAL", "OVEN", "OVER", "OWLY", "OWNS", "QUAD", +"QUIT", "QUOD", "RACE", "RACK", "RACY", "RAFT", "RAGE", "RAID", +"RAIL", "RAIN", "RAKE", "RANK", "RANT", "RARE", "RASH", "RATE", +"RAVE", "RAYS", "READ", "REAL", "REAM", "REAR", "RECK", "REED", +"REEF", "REEK", "REEL", "REID", "REIN", "RENA", "REND", "RENT", +"REST", "RICE", "RICH", "RICK", "RIDE", "RIFT", "RILL", "RIME", +"RING", "RINK", "RISE", "RISK", "RITE", "ROAD", "ROAM", "ROAR", +"ROBE", "ROCK", "RODE", "ROIL", "ROLL", "ROME", "ROOD", "ROOF", +"ROOK", "ROOM", "ROOT", "ROSA", "ROSE", "ROSS", "ROSY", "ROTH", +"ROUT", "ROVE", "ROWE", "ROWS", "RUBE", "RUBY", "RUDE", "RUDY", +"RUIN", "RULE", "RUNG", "RUNS", "RUNT", "RUSE", "RUSH", "RUSK", +"RUSS", "RUST", "RUTH", "SACK", "SAFE", "SAGE", "SAID", "SAIL", +"SALE", "SALK", "SALT", "SAME", "SAND", "SANE", "SANG", "SANK", +"SARA", "SAUL", "SAVE", "SAYS", "SCAN", "SCAR", "SCAT", "SCOT", +"SEAL", "SEAM", "SEAR", "SEAT", "SEED", "SEEK", "SEEM", "SEEN", +"SEES", "SELF", "SELL", "SEND", "SENT", "SETS", "SEWN", "SHAG", +"SHAM", "SHAW", "SHAY", "SHED", "SHIM", "SHIN", "SHOD", "SHOE", +"SHOT", "SHOW", "SHUN", "SHUT", "SICK", "SIDE", "SIFT", "SIGH", +"SIGN", "SILK", "SILL", "SILO", "SILT", "SINE", "SING", "SINK", +"SIRE", "SITE", "SITS", "SITU", "SKAT", "SKEW", "SKID", "SKIM", +"SKIN", "SKIT", "SLAB", "SLAM", "SLAT", "SLAY", "SLED", "SLEW", +"SLID", "SLIM", "SLIT", "SLOB", "SLOG", "SLOT", "SLOW", "SLUG", +"SLUM", "SLUR", "SMOG", "SMUG", "SNAG", "SNOB", "SNOW", "SNUB", +"SNUG", "SOAK", "SOAR", "SOCK", "SODA", "SOFA", "SOFT", "SOIL", +"SOLD", "SOME", "SONG", "SOON", "SOOT", "SORE", "SORT", "SOUL", +"SOUR", "SOWN", "STAB", "STAG", "STAN", "STAR", "STAY", "STEM", +"STEW", "STIR", "STOW", "STUB", "STUN", "SUCH", "SUDS", "SUIT", +"SULK", "SUMS", "SUNG", "SUNK", "SURE", "SURF", "SWAB", "SWAG", +"SWAM", "SWAN", "SWAT", "SWAY", "SWIM", "SWUM", "TACK", "TACT", +"TAIL", "TAKE", "TALE", "TALK", "TALL", "TANK", "TASK", "TATE", +"TAUT", "TEAL", "TEAM", "TEAR", "TECH", "TEEM", "TEEN", "TEET", +"TELL", "TEND", "TENT", "TERM", "TERN", "TESS", "TEST", "THAN", +"THAT", "THEE", "THEM", "THEN", "THEY", "THIN", "THIS", "THUD", + + + +Haller Standards Track [Page 23] + +RFC 2289 A One-Time Password System February 1998 + + +"THUG", "TICK", "TIDE", "TIDY", "TIED", "TIER", "TILE", "TILL", +"TILT", "TIME", "TINA", "TINE", "TINT", "TINY", "TIRE", "TOAD", +"TOGO", "TOIL", "TOLD", "TOLL", "TONE", "TONG", "TONY", "TOOK", +"TOOL", "TOOT", "TORE", "TORN", "TOTE", "TOUR", "TOUT", "TOWN", +"TRAG", "TRAM", "TRAY", "TREE", "TREK", "TRIG", "TRIM", "TRIO", +"TROD", "TROT", "TROY", "TRUE", "TUBA", "TUBE", "TUCK", "TUFT", +"TUNA", "TUNE", "TUNG", "TURF", "TURN", "TUSK", "TWIG", "TWIN", +"TWIT", "ULAN", "UNIT", "URGE", "USED", "USER", "USES", "UTAH", +"VAIL", "VAIN", "VALE", "VARY", "VASE", "VAST", "VEAL", "VEDA", +"VEIL", "VEIN", "VEND", "VENT", "VERB", "VERY", "VETO", "VICE", +"VIEW", "VINE", "VISE", "VOID", "VOLT", "VOTE", "WACK", "WADE", +"WAGE", "WAIL", "WAIT", "WAKE", "WALE", "WALK", "WALL", "WALT", +"WAND", "WANE", "WANG", "WANT", "WARD", "WARM", "WARN", "WART", +"WASH", "WAST", "WATS", "WATT", "WAVE", "WAVY", "WAYS", "WEAK", +"WEAL", "WEAN", "WEAR", "WEED", "WEEK", "WEIR", "WELD", "WELL", +"WELT", "WENT", "WERE", "WERT", "WEST", "WHAM", "WHAT", "WHEE", +"WHEN", "WHET", "WHOA", "WHOM", "WICK", "WIFE", "WILD", "WILL", +"WIND", "WINE", "WING", "WINK", "WINO", "WIRE", "WISE", "WISH", +"WITH", "WOLF", "WONT", "WOOD", "WOOL", "WORD", "WORE", "WORK", +"WORM", "WORN", "WOVE", "WRIT", "WYNN", "YALE", "YANG", "YANK", +"YARD", "YARN", "YAWL", "YAWN", "YEAH", "YEAR", "YELL", "YOGA", +"YOKE" }; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Haller Standards Track [Page 24] + +RFC 2289 A One-Time Password System February 1998 + + +Full Copyright Statement + + Copyright (C) The Internet Society (1998). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + + + + + + + + + + + + + + + + + + + + + + + + +Haller Standards Track [Page 25] + diff --git a/doc/specification/rfc2444.txt b/doc/specification/rfc2444.txt new file mode 100644 index 0000000..80a65a2 --- /dev/null +++ b/doc/specification/rfc2444.txt @@ -0,0 +1,395 @@ + + + + + + +Network Working Group C. Newman +Request for Comments: 2444 Innosoft +Updates: 2222 October 1998 +Category: Standards Track + + + The One-Time-Password SASL Mechanism + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (1998). All Rights Reserved. + +Abstract + + OTP [OTP] provides a useful authentication mechanism for situations + where there is limited client or server trust. Currently, OTP is + added to protocols in an ad-hoc fashion with heuristic parsing. This + specification defines an OTP SASL [SASL] mechanism so it can be + easily and formally integrated into many application protocols. + +1. How to Read This Document + + The key words "MUST", "MUST NOT", "REQUIRED", "SHOULD", "SHOULD NOT", + "RECOMMENDED" and "MAY" in this document are to be interpreted as + defined in "Key words for use in RFCs to Indicate Requirement Levels" + [KEYWORDS]. + + This memo assumes the reader is familiar with OTP [OTP], OTP extended + responses [OTP-EXT] and SASL [SASL]. + +2. Intended Use + + The OTP SASL mechanism replaces the SKEY SASL mechanism [SASL]. OTP + is a good choice for usage scenarios where the client is untrusted + (e.g., a kiosk client), as a one-time password will only give the + client a single opportunity to act on behalf of the user. OTP is + also a good choice for situations where interactive logins are + permitted to the server, as a compromised OTP authentication database + is only subject to dictionary attacks, unlike authentication + databases for other simple mechanisms such as CRAM-MD5 [CRAM-MD5]. + + + +Newman Standards Track [Page 1] + +RFC 2444 OTP SASL Mechanism October 1998 + + + It is important to note that each use of the OTP mechanism causes the + authentication database entry for a user to be updated. + + This SASL mechanism provides a formal way to integrate OTP into + SASL-enabled protocols including IMAP [IMAP4], ACAP [ACAP], POP3 + [POP-AUTH] and LDAPv3 [LDAPv3]. + +3. Profiling OTP for SASL + + OTP [OTP] and OTP extended responses [OTP-EXT] offer a number of + options. However, for authentication to succeed, the client and + server need compatible option sets. This specification defines a + single SASL mechanism: OTP. The following rules apply to this + mechanism: + + o The extended response syntax MUST be used. + + o Servers MUST support the following four OTP extended responses: + "hex", "word", "init-hex" and "init-word". Servers MUST support + the "word" and "init-word" responses for the standard dictionary + and SHOULD support alternate dictionaries. Servers MUST NOT + require use of any additional OTP extensions or options. + + o Clients SHOULD support display of the OTP challenge to the user + and entry of an OTP in multi-word format. Clients MAY also + support direct entry of the pass phrase and compute the "hex" or + "word" response. + + o Clients MUST indicate when authentication fails due to the + sequence number getting too low and SHOULD offer the user the + option to reset the sequence using the "init-hex" or "init-word" + response. + + Support for the MD5 algorithm is REQUIRED, and support for the SHA1 + algorithm is RECOMMENDED. + +4. OTP Authentication Mechanism + + The mechanism does not provide any security layer. + + The client begins by sending a message to the server containing the + following two pieces of information. + + (1) An authorization identity. When the empty string is used, this + defaults to the authentication identity. This is used by system + administrators or proxy servers to login with a different user + identity. This field may be up to 255 octets and is terminated by a + NUL (0) octet. US-ASCII printable characters are preferred, although + + + +Newman Standards Track [Page 2] + +RFC 2444 OTP SASL Mechanism October 1998 + + + UTF-8 [UTF-8] printable characters are permitted to support + international names. Use of character sets other than US-ASCII and + UTF-8 is forbidden. + + (2) An authentication identity. The identity whose pass phrase will + be used. This field may be up to 255 octets. US-ASCII printable + characters are preferred, although UTF-8 [UTF-8] printable characters + are permitted to support international names. Use of character sets + other than US-ASCII and UTF-8 is forbidden. + + The server responds by sending a message containing the OTP challenge + as described in OTP [OTP] and OTP extended responses [OTP-EXT]. + + If a client sees an unknown hash algorithm name it will not be able + to process a pass phrase input by the user. In this situation the + client MAY prompt for the six-word format, issue the cancel sequence + as specified by the SASL profile for the protocol in use and try a + different SASL mechanism, or close the connection and refuse to + authenticate. As a result of this behavior, a server is restricted + to one OTP hash algorithm per user. + + On success, the client generates an extended response in the "hex", + "word", "init-hex" or "init-word" format. The client is not required + to terminate the response with a space or a newline and SHOULD NOT + include unnecessary whitespace. + + Servers MUST tolerate input of arbitrary length, but MAY fail the + authentication if the length of client input exceeds reasonable size. + +5. Examples + + In these example, "C:" represents lines sent from the client to the + server and "S:" represents lines sent from the server to the client. + The user name is "tim" and no authorization identity is provided. + The "" below represents an ASCII NUL octet. + + The following is an example of the OTP mechanism using the ACAP + [ACAP] profile of SASL. The pass phrase used in this example is: + This is a test. + + C: a001 AUTHENTICATE "OTP" {4} + C: tim + S: + "otp-md5 499 ke1234 ext" + C: "hex:5bf075d9959d036f" + S: a001 OK "AUTHENTICATE completed" + + + + + + +Newman Standards Track [Page 3] + +RFC 2444 OTP SASL Mechanism October 1998 + + + Here is the same example using the six-words response: + + C: a001 AUTHENTICATE "OTP" {4} + C: tim + S: + "otp-md5 499 ke1234 ext" + C: "word:BOND FOGY DRAB NE RISE MART" + S: a001 OK "AUTHENTICATE completed" + + Here is the same example using the OTP-SHA1 mechanism: + + C: a001 AUTHENTICATE "OTP" {4} + C: tim + S: + "otp-sha1 499 ke1234 ext" + C: "hex:c90fc02cc488df5e" + S: a001 OK "AUTHENTICATE completed" + + Here is the same example with the init-hex extended response + + C: a001 AUTHENTICATE "OTP" {4} + C: tim + S: + "otp-md5 499 ke1234 ext" + C: "init-hex:5bf075d9959d036f:md5 499 ke1235:3712dcb4aa5316c1" + S: a001 OK "OTP sequence reset, authentication complete" + + The following is an example of the OTP mechanism using the IMAP + [IMAP4] profile of SASL. The pass phrase used in this example is: + this is a test + + C: a001 AUTHENTICATE OTP + S: + + C: AHRpbQ== + S: + b3RwLW1kNSAxMjMga2UxMjM0IGV4dA== + C: aGV4OjExZDRjMTQ3ZTIyN2MxZjE= + S: a001 OK AUTHENTICATE completed + + Note that the lack of an initial client response and the base64 + encoding are characteristics of the IMAP profile of SASL. The server + challenge is "otp-md5 123 ke1234 ext" and the client response is + "hex:11d4c147e227c1f1". + +6. Security Considerations + + This specification introduces no security considerations beyond those + those described in SASL [SASL], OTP [OTP] and OTP extended responses + [OTP-EXT]. A brief summary of these considerations follows: + + This mechanism does not provide session privacy, server + authentication or protection from active attacks. + + + +Newman Standards Track [Page 4] + +RFC 2444 OTP SASL Mechanism October 1998 + + + This mechanism is subject to passive dictionary attacks. The + severity of this attack can be reduced by choosing pass phrases well. + + The server authentication database necessary for use with OTP need + not be plaintext-equivalent. + + Server implementations MUST protect against the race attack [OTP]. + +7. Multinational Considerations + + As remote access is a crucial service, users are encouraged to + restrict user names and pass phrases to the US-ASCII character set. + However, if characters outside the US-ASCII chracter set are used in + user names and pass phrases, then they are interpreted according to + UTF-8 [UTF-8]. + + Server support for alternate dictionaries is strongly RECOMMENDED to + permit use of the six-word format with non-English words. + +8. IANA Considerations + + Here is the registration template for the OTP SASL mechanism: + + SASL mechanism name: OTP + Security Considerations: See section 6 of this memo + Published specification: this memo + Person & email address to contact for futher information: + see author's address section below + Intended usage: COMMON + Author/Change controller: see author's address section below + + This memo also amends the SKEY SASL mechanism registration [SASL] by + changing its intended usage to OBSOLETE. + +9. References + + [ACAP] Newman, C. and J. Myers, "ACAP -- Application + Configuration Access Protocol", RFC 2244, November 1997. + + [CRAM-MD5] Klensin, J., Catoe, R. and P. Krumviede, "IMAP/POP + AUTHorize Extension for Simple Challenge/Response", RFC + 2195, September 1997. + + [IMAP4] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, December 1996. + + [KEYWORDS] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + + +Newman Standards Track [Page 5] + +RFC 2444 OTP SASL Mechanism October 1998 + + + [LDAPv3] Wahl, M., Howes, T. and S. Kille, "Lightweight Directory + Access Protocol (v3)", RFC 2251, December 1997. + + [MD5] Rivest, R., "The MD5 Message Digest Algorithm", RFC 1321, + April 1992. + + [OTP] Haller, N., Metz, C., Nesser, P. and M. Straw, "A One-Time + Password System", RFC 2289, February 1998. + + [OTP-EXT] Metz, C., "OTP Extended Responses", RFC 2243, November + 1997. + + [POP-AUTH] Myers, J., "POP3 AUTHentication command", RFC 1734, + December 1994. + + [SASL] Myers, J., "Simple Authentication and Security Layer + (SASL)", RFC 2222, October 1997. + + [UTF-8] Yergeau, F., "UTF-8, a transformation format of ISO + 10646", RFC 2279, January 1998. + +10. Author's Address + + Chris Newman + Innosoft International, Inc. + 1050 Lakes Drive + West Covina, CA 91790 USA + + EMail: chris.newman@innosoft.com + + + + + + + + + + + + + + + + + + + + + + +Newman Standards Track [Page 6] + +RFC 2444 OTP SASL Mechanism October 1998 + + +11. Full Copyright Statement + + Copyright (C) The Internet Society (1998). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + + + + + + + + + + + + + + + + + + + + + + + + +Newman Standards Track [Page 7] + diff --git a/doc/specification/rfc2595.txt b/doc/specification/rfc2595.txt new file mode 100644 index 0000000..3b2b4c5 --- /dev/null +++ b/doc/specification/rfc2595.txt @@ -0,0 +1,843 @@ + + + + + + +Network Working Group C. Newman +Request for Comments: 2595 Innosoft +Category: Standards Track June 1999 + + + Using TLS with IMAP, POP3 and ACAP + + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (1999). All Rights Reserved. + +1. Motivation + + The TLS protocol (formerly known as SSL) provides a way to secure an + application protocol from tampering and eavesdropping. The option of + using such security is desirable for IMAP, POP and ACAP due to common + connection eavesdropping and hijacking attacks [AUTH]. Although + advanced SASL authentication mechanisms can provide a lightweight + version of this service, TLS is complimentary to simple + authentication-only SASL mechanisms or deployed clear-text password + login commands. + + Many sites have a high investment in authentication infrastructure + (e.g., a large database of a one-way-function applied to user + passwords), so a privacy layer which is not tightly bound to user + authentication can protect against network eavesdropping attacks + without requiring a new authentication infrastructure and/or forcing + all users to change their password. Recognizing that such sites will + desire simple password authentication in combination with TLS + encryption, this specification defines the PLAIN SASL mechanism for + use with protocols which lack a simple password authentication + command such as ACAP and SMTP. (Note there is a separate RFC for the + STARTTLS command in SMTP [SMTPTLS].) + + There is a strong desire in the IETF to eliminate the transmission of + clear-text passwords over unencrypted channels. While SASL can be + used for this purpose, TLS provides an additional tool with different + deployability characteristics. A server supporting both TLS with + + + + +Newman Standards Track [Page 1] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + + simple passwords and a challenge/response SASL mechanism is likely to + interoperate with a wide variety of clients without resorting to + unencrypted clear-text passwords. + + The STARTTLS command rectifies a number of the problems with using a + separate port for a "secure" protocol variant. Some of these are + mentioned in section 7. + +1.1. Conventions Used in this Document + + The key words "REQUIRED", "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", + "MAY", and "OPTIONAL" in this document are to be interpreted as + described in "Key words for use in RFCs to Indicate Requirement + Levels" [KEYWORDS]. + + Terms related to authentication are defined in "On Internet + Authentication" [AUTH]. + + Formal syntax is defined using ABNF [ABNF]. + + In examples, "C:" and "S:" indicate lines sent by the client and + server respectively. + +2. Basic Interoperability and Security Requirements + + The following requirements apply to all implementations of the + STARTTLS extension for IMAP, POP3 and ACAP. + +2.1. Cipher Suite Requirements + + Implementation of the TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA [TLS] cipher + suite is REQUIRED. This is important as it assures that any two + compliant implementations can be configured to interoperate. + + All other cipher suites are OPTIONAL. + +2.2. Privacy Operational Mode Security Requirements + + Both clients and servers SHOULD have a privacy operational mode which + refuses authentication unless successful activation of an encryption + layer (such as that provided by TLS) occurs prior to or at the time + of authentication and which will terminate the connection if that + encryption layer is deactivated. Implementations are encouraged to + have flexibility with respect to the minimal encryption strength or + cipher suites permitted. A minimalist approach to this + recommendation would be an operational mode where the + TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA cipher suite is mandatory prior to + permitting authentication. + + + +Newman Standards Track [Page 2] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + + Clients MAY have an operational mode which uses encryption only when + it is advertised by the server, but authentication continues + regardless. For backwards compatibility, servers SHOULD have an + operational mode where only the authentication mechanisms required by + the relevant base protocol specification are needed to successfully + authenticate. + +2.3. Clear-Text Password Requirements + + Clients and servers which implement STARTTLS MUST be configurable to + refuse all clear-text login commands or mechanisms (including both + standards-track and nonstandard mechanisms) unless an encryption + layer of adequate strength is active. Servers which allow + unencrypted clear-text logins SHOULD be configurable to refuse + clear-text logins both for the entire server, and on a per-user + basis. + +2.4. Server Identity Check + + During the TLS negotiation, the client MUST check its understanding + of the server hostname against the server's identity as presented in + the server Certificate message, in order to prevent man-in-the-middle + attacks. Matching is performed according to these rules: + + - The client MUST use the server hostname it used to open the + connection as the value to compare against the server name as + expressed in the server certificate. The client MUST NOT use any + form of the server hostname derived from an insecure remote source + (e.g., insecure DNS lookup). CNAME canonicalization is not done. + + - If a subjectAltName extension of type dNSName is present in the + certificate, it SHOULD be used as the source of the server's + identity. + + - Matching is case-insensitive. + + - A "*" wildcard character MAY be used as the left-most name + component in the certificate. For example, *.example.com would + match a.example.com, foo.example.com, etc. but would not match + example.com. + + - If the certificate contains multiple names (e.g. more than one + dNSName field), then a match with any one of the fields is + considered acceptable. + + If the match fails, the client SHOULD either ask for explicit user + confirmation, or terminate the connection and indicate the server's + identity is suspect. + + + +Newman Standards Track [Page 3] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + +2.5. TLS Security Policy Check + + Both the client and server MUST check the result of the STARTTLS + command and subsequent TLS negotiation to see whether acceptable + authentication or privacy was achieved. Ignoring this step + completely invalidates using TLS for security. The decision about + whether acceptable authentication or privacy was achieved is made + locally, is implementation-dependent, and is beyond the scope of this + document. + +3. IMAP STARTTLS extension + + When the TLS extension is present in IMAP, "STARTTLS" is listed as a + capability in response to the CAPABILITY command. This extension + adds a single command, "STARTTLS" to the IMAP protocol which is used + to begin a TLS negotiation. + +3.1. STARTTLS Command + + Arguments: none + + Responses: no specific responses for this command + + Result: OK - begin TLS negotiation + BAD - command unknown or arguments invalid + + A TLS negotiation begins immediately after the CRLF at the end of + the tagged OK response from the server. Once a client issues a + STARTTLS command, it MUST NOT issue further commands until a + server response is seen and the TLS negotiation is complete. + + The STARTTLS command is only valid in non-authenticated state. + The server remains in non-authenticated state, even if client + credentials are supplied during the TLS negotiation. The SASL + [SASL] EXTERNAL mechanism MAY be used to authenticate once TLS + client credentials are successfully exchanged, but servers + supporting the STARTTLS command are not required to support the + EXTERNAL mechanism. + + Once TLS has been started, the client MUST discard cached + information about server capabilities and SHOULD re-issue the + CAPABILITY command. This is necessary to protect against + man-in-the-middle attacks which alter the capabilities list prior + to STARTTLS. The server MAY advertise different capabilities + after STARTTLS. + + The formal syntax for IMAP is amended as follows: + + + + +Newman Standards Track [Page 4] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + + command_any =/ "STARTTLS" + + Example: C: a001 CAPABILITY + S: * CAPABILITY IMAP4rev1 STARTTLS LOGINDISABLED + S: a001 OK CAPABILITY completed + C: a002 STARTTLS + S: a002 OK Begin TLS negotiation now + + C: a003 CAPABILITY + S: * CAPABILITY IMAP4rev1 AUTH=EXTERNAL + S: a003 OK CAPABILITY completed + C: a004 LOGIN joe password + S: a004 OK LOGIN completed + +3.2. IMAP LOGINDISABLED capability + + The current IMAP protocol specification (RFC 2060) requires the + implementation of the LOGIN command which uses clear-text passwords. + Many sites may choose to disable this command unless encryption is + active for security reasons. An IMAP server MAY advertise that the + LOGIN command is disabled by including the LOGINDISABLED capability + in the capability response. Such a server will respond with a tagged + "NO" response to any attempt to use the LOGIN command. + + An IMAP server which implements STARTTLS MUST implement support for + the LOGINDISABLED capability on unencrypted connections. + + An IMAP client which complies with this specification MUST NOT issue + the LOGIN command if this capability is present. + + This capability is useful to prevent clients compliant with this + specification from sending an unencrypted password in an environment + subject to passive attacks. It has no impact on an environment + subject to active attacks as a man-in-the-middle attacker can remove + this capability. Therefore this does not relieve clients of the need + to follow the privacy mode recommendation in section 2.2. + + Servers advertising this capability will fail to interoperate with + many existing compliant IMAP clients and will be unable to prevent + those clients from disclosing the user's password. + +4. POP3 STARTTLS extension + + The POP3 STARTTLS extension adds the STLS command to POP3 servers. + If this is implemented, the POP3 extension mechanism [POP3EXT] MUST + also be implemented to avoid the need for client probing of multiple + commands. The capability name "STLS" indicates this command is + present and permitted in the current state. + + + +Newman Standards Track [Page 5] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + + STLS + + Arguments: none + + Restrictions: + Only permitted in AUTHORIZATION state. + + Discussion: + A TLS negotiation begins immediately after the CRLF at the + end of the +OK response from the server. A -ERR response + MAY result if a security layer is already active. Once a + client issues a STLS command, it MUST NOT issue further + commands until a server response is seen and the TLS + negotiation is complete. + + The STLS command is only permitted in AUTHORIZATION state + and the server remains in AUTHORIZATION state, even if + client credentials are supplied during the TLS negotiation. + The AUTH command [POP-AUTH] with the EXTERNAL mechanism + [SASL] MAY be used to authenticate once TLS client + credentials are successfully exchanged, but servers + supporting the STLS command are not required to support the + EXTERNAL mechanism. + + Once TLS has been started, the client MUST discard cached + information about server capabilities and SHOULD re-issue + the CAPA command. This is necessary to protect against + man-in-the-middle attacks which alter the capabilities list + prior to STLS. The server MAY advertise different + capabilities after STLS. + + Possible Responses: + +OK -ERR + + Examples: + C: STLS + S: +OK Begin TLS negotiation + + ... + C: STLS + S: -ERR Command not permitted when TLS active + + + + + + + + + + +Newman Standards Track [Page 6] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + +5. ACAP STARTTLS extension + + When the TLS extension is present in ACAP, "STARTTLS" is listed as a + capability in the ACAP greeting. No arguments to this capability are + defined at this time. This extension adds a single command, + "STARTTLS" to the ACAP protocol which is used to begin a TLS + negotiation. + +5.1. STARTTLS Command + + Arguments: none + + Responses: no specific responses for this command + + Result: OK - begin TLS negotiation + BAD - command unknown or arguments invalid + + A TLS negotiation begins immediately after the CRLF at the end of + the tagged OK response from the server. Once a client issues a + STARTTLS command, it MUST NOT issue further commands until a + server response is seen and the TLS negotiation is complete. + + The STARTTLS command is only valid in non-authenticated state. + The server remains in non-authenticated state, even if client + credentials are supplied during the TLS negotiation. The SASL + [SASL] EXTERNAL mechanism MAY be used to authenticate once TLS + client credentials are successfully exchanged, but servers + supporting the STARTTLS command are not required to support the + EXTERNAL mechanism. + + After the TLS layer is established, the server MUST re-issue an + untagged ACAP greeting. This is necessary to protect against + man-in-the-middle attacks which alter the capabilities list prior + to STARTTLS. The client MUST discard cached capability + information and replace it with the information from the new ACAP + greeting. The server MAY advertise different capabilities after + STARTTLS. + + The formal syntax for ACAP is amended as follows: + + command_any =/ "STARTTLS" + + Example: S: * ACAP (SASL "CRAM-MD5") (STARTTLS) + C: a002 STARTTLS + S: a002 OK "Begin TLS negotiation now" + + S: * ACAP (SASL "CRAM-MD5" "PLAIN" "EXTERNAL") + + + + +Newman Standards Track [Page 7] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + +6. PLAIN SASL mechanism + + Clear-text passwords are simple, interoperate with almost all + existing operating system authentication databases, and are useful + for a smooth transition to a more secure password-based + authentication mechanism. The drawback is that they are unacceptable + for use over an unencrypted network connection. + + This defines the "PLAIN" SASL mechanism for use with ACAP and other + protocols with no clear-text login command. The PLAIN SASL mechanism + MUST NOT be advertised or used unless a strong encryption layer (such + as the provided by TLS) is active or backwards compatibility dictates + otherwise. + + The mechanism consists of a single message from the client to the + server. The client sends the authorization identity (identity to + login as), followed by a US-ASCII NUL character, followed by the + authentication identity (identity whose password will be used), + followed by a US-ASCII NUL character, followed by the clear-text + password. The client may leave the authorization identity empty to + indicate that it is the same as the authentication identity. + + The server will verify the authentication identity and password with + the system authentication database and verify that the authentication + credentials permit the client to login as the authorization identity. + If both steps succeed, the user is logged in. + + The server MAY also use the password to initialize any new + authentication database, such as one suitable for CRAM-MD5 + [CRAM-MD5]. + + Non-US-ASCII characters are permitted as long as they are represented + in UTF-8 [UTF-8]. Use of non-visible characters or characters which + a user may be unable to enter on some keyboards is discouraged. + + The formal grammar for the client message using Augmented BNF [ABNF] + follows. + + message = [authorize-id] NUL authenticate-id NUL password + authenticate-id = 1*UTF8-SAFE ; MUST accept up to 255 octets + authorize-id = 1*UTF8-SAFE ; MUST accept up to 255 octets + password = 1*UTF8-SAFE ; MUST accept up to 255 octets + NUL = %x00 + UTF8-SAFE = %x01-09 / %x0B-0C / %x0E-7F / UTF8-2 / + UTF8-3 / UTF8-4 / UTF8-5 / UTF8-6 + UTF8-1 = %x80-BF + UTF8-2 = %xC0-DF UTF8-1 + UTF8-3 = %xE0-EF 2UTF8-1 + + + +Newman Standards Track [Page 8] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + + UTF8-4 = %xF0-F7 3UTF8-1 + UTF8-5 = %xF8-FB 4UTF8-1 + UTF8-6 = %xFC-FD 5UTF8-1 + + Here is an example of how this might be used to initialize a CRAM-MD5 + authentication database for ACAP: + + Example: S: * ACAP (SASL "CRAM-MD5") (STARTTLS) + C: a001 AUTHENTICATE "CRAM-MD5" + S: + "<1896.697170952@postoffice.reston.mci.net>" + C: "tim b913a602c7eda7a495b4e6e7334d3890" + S: a001 NO (TRANSITION-NEEDED) + "Please change your password, or use TLS to login" + C: a002 STARTTLS + S: a002 OK "Begin TLS negotiation now" + + S: * ACAP (SASL "CRAM-MD5" "PLAIN" "EXTERNAL") + C: a003 AUTHENTICATE "PLAIN" {21+} + C: timtanstaaftanstaaf + S: a003 OK CRAM-MD5 password initialized + + Note: In this example, represents a single ASCII NUL octet. + +7. imaps and pop3s ports + + Separate "imaps" and "pop3s" ports were registered for use with SSL. + Use of these ports is discouraged in favor of the STARTTLS or STLS + commands. + + A number of problems have been observed with separate ports for + "secure" variants of protocols. This is an attempt to enumerate some + of those problems. + + - Separate ports lead to a separate URL scheme which intrudes into + the user interface in inappropriate ways. For example, many web + pages use language like "click here if your browser supports SSL." + This is a decision the browser is often more capable of making than + the user. + + - Separate ports imply a model of either "secure" or "not secure." + This can be misleading in a number of ways. First, the "secure" + port may not in fact be acceptably secure as an export-crippled + cipher suite might be in use. This can mislead users into a false + sense of security. Second, the normal port might in fact be + secured by using a SASL mechanism which includes a security layer. + Thus the separate port distinction makes the complex topic of + security policy even more confusing. One common result of this + confusion is that firewall administrators are often misled into + + + +Newman Standards Track [Page 9] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + + permitting the "secure" port and blocking the standard port. This + could be a poor choice given the common use of SSL with a 40-bit + key encryption layer and plain-text password authentication is less + secure than strong SASL mechanisms such as GSSAPI with Kerberos 5. + + - Use of separate ports for SSL has caused clients to implement only + two security policies: use SSL or don't use SSL. The desirable + security policy "use TLS when available" would be cumbersome with + the separate port model, but is simple with STARTTLS. + + - Port numbers are a limited resource. While they are not yet in + short supply, it is unwise to set a precedent that could double (or + worse) the speed of their consumption. + + +8. IANA Considerations + + This constitutes registration of the "STARTTLS" and "LOGINDISABLED" + IMAP capabilities as required by section 7.2.1 of RFC 2060 [IMAP]. + + The registration for the POP3 "STLS" capability follows: + + CAPA tag: STLS + Arguments: none + Added commands: STLS + Standard commands affected: May enable USER/PASS as a side-effect. + CAPA command SHOULD be re-issued after successful completion. + Announced states/Valid states: AUTHORIZATION state only. + Specification reference: this memo + + The registration for the ACAP "STARTTLS" capability follows: + + Capability name: STARTTLS + Capability keyword: STARTTLS + Capability arguments: none + Published Specification(s): this memo + Person and email address for further information: + see author's address section below + + The registration for the PLAIN SASL mechanism follows: + + SASL mechanism name: PLAIN + Security Considerations: See section 9 of this memo + Published specification: this memo + Person & email address to contact for further information: + see author's address section below + Intended usage: COMMON + Author/Change controller: see author's address section below + + + +Newman Standards Track [Page 10] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + +9. Security Considerations + + TLS only provides protection for data sent over a network connection. + Messages transferred over IMAP or POP3 are still available to server + administrators and usually subject to eavesdropping, tampering and + forgery when transmitted through SMTP or NNTP. TLS is no substitute + for an end-to-end message security mechanism using MIME security + multiparts [MIME-SEC]. + + A man-in-the-middle attacker can remove STARTTLS from the capability + list or generate a failure response to the STARTTLS command. In + order to detect such an attack, clients SHOULD warn the user when + session privacy is not active and/or be configurable to refuse to + proceed without an acceptable level of security. + + A man-in-the-middle attacker can always cause a down-negotiation to + the weakest authentication mechanism or cipher suite available. For + this reason, implementations SHOULD be configurable to refuse weak + mechanisms or cipher suites. + + Any protocol interactions prior to the TLS handshake are performed in + the clear and can be modified by a man-in-the-middle attacker. For + this reason, clients MUST discard cached information about server + capabilities advertised prior to the start of the TLS handshake. + + Clients are encouraged to clearly indicate when the level of + encryption active is known to be vulnerable to attack using modern + hardware (such as encryption keys with 56 bits of entropy or less). + + The LOGINDISABLED IMAP capability (discussed in section 3.2) only + reduces the potential for passive attacks, it provides no protection + against active attacks. The responsibility remains with the client + to avoid sending a password over a vulnerable channel. + + The PLAIN mechanism relies on the TLS encryption layer for security. + When used without TLS, it is vulnerable to a common network + eavesdropping attack. Therefore PLAIN MUST NOT be advertised or used + unless a suitable TLS encryption layer is active or backwards + compatibility dictates otherwise. + + When the PLAIN mechanism is used, the server gains the ability to + impersonate the user to all services with the same password + regardless of any encryption provided by TLS or other network privacy + mechanisms. While many other authentication mechanisms have similar + weaknesses, stronger SASL mechanisms such as Kerberos address this + issue. Clients are encouraged to have an operational mode where all + mechanisms which are likely to reveal the user's password to the + server are disabled. + + + +Newman Standards Track [Page 11] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + + The security considerations for TLS apply to STARTTLS and the + security considerations for SASL apply to the PLAIN mechanism. + Additional security requirements are discussed in section 2. + +10. References + + [ABNF] Crocker, D. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", RFC 2234, November 1997. + + [ACAP] Newman, C. and J. Myers, "ACAP -- Application + Configuration Access Protocol", RFC 2244, November 1997. + + [AUTH] Haller, N. and R. Atkinson, "On Internet Authentication", + RFC 1704, October 1994. + + [CRAM-MD5] Klensin, J., Catoe, R. and P. Krumviede, "IMAP/POP + AUTHorize Extension for Simple Challenge/Response", RFC + 2195, September 1997. + + [IMAP] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, December 1996. + + [KEYWORDS] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [MIME-SEC] Galvin, J., Murphy, S., Crocker, S. and N. Freed, + "Security Multiparts for MIME: Multipart/Signed and + Multipart/Encrypted", RFC 1847, October 1995. + + [POP3] Myers, J. and M. Rose, "Post Office Protocol - Version 3", + STD 53, RFC 1939, May 1996. + + [POP3EXT] Gellens, R., Newman, C. and L. Lundblade, "POP3 Extension + Mechanism", RFC 2449, November 1998. + + [POP-AUTH] Myers, J., "POP3 AUTHentication command", RFC 1734, + December 1994. + + [SASL] Myers, J., "Simple Authentication and Security Layer + (SASL)", RFC 2222, October 1997. + + [SMTPTLS] Hoffman, P., "SMTP Service Extension for Secure SMTP over + TLS", RFC 2487, January 1999. + + [TLS] Dierks, T. and C. Allen, "The TLS Protocol Version 1.0", + RFC 2246, January 1999. + + + + + +Newman Standards Track [Page 12] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + + [UTF-8] Yergeau, F., "UTF-8, a transformation format of ISO + 10646", RFC 2279, January 1998. + + +11. Author's Address + + Chris Newman + Innosoft International, Inc. + 1050 Lakes Drive + West Covina, CA 91790 USA + + EMail: chris.newman@innosoft.com + + +A. Appendix -- Compliance Checklist + + An implementation is not compliant if it fails to satisfy one or more + of the MUST requirements for the protocols it implements. An + implementation that satisfies all the MUST and all the SHOULD + requirements for its protocols is said to be "unconditionally + compliant"; one that satisfies all the MUST requirements but not all + the SHOULD requirements for its protocols is said to be + "conditionally compliant". + + Rules Section + ----- ------- + Mandatory-to-implement Cipher Suite 2.1 + SHOULD have mode where encryption required 2.2 + server SHOULD have mode where TLS not required 2.2 + MUST be configurable to refuse all clear-text login + commands or mechanisms 2.3 + server SHOULD be configurable to refuse clear-text + login commands on entire server and on per-user basis 2.3 + client MUST check server identity 2.4 + client MUST use hostname used to open connection 2.4 + client MUST NOT use hostname from insecure remote lookup 2.4 + client SHOULD support subjectAltName of dNSName type 2.4 + client SHOULD ask for confirmation or terminate on fail 2.4 + MUST check result of STARTTLS for acceptable privacy 2.5 + client MUST NOT issue commands after STARTTLS + until server response and negotiation done 3.1,4,5.1 + client MUST discard cached information 3.1,4,5.1,9 + client SHOULD re-issue CAPABILITY/CAPA command 3.1,4 + IMAP server with STARTTLS MUST implement LOGINDISABLED 3.2 + IMAP client MUST NOT issue LOGIN if LOGINDISABLED 3.2 + POP server MUST implement POP3 extensions 4 + ACAP server MUST re-issue ACAP greeting 5.1 + + + + +Newman Standards Track [Page 13] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + + client SHOULD warn when session privacy not active and/or + refuse to proceed without acceptable security level 9 + SHOULD be configurable to refuse weak mechanisms or + cipher suites 9 + + The PLAIN mechanism is an optional part of this specification. + However if it is implemented the following rules apply: + + Rules Section + ----- ------- + MUST NOT use PLAIN unless strong encryption active + or backwards compatibility dictates otherwise 6,9 + MUST use UTF-8 encoding for characters in PLAIN 6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Newman Standards Track [Page 14] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + +Full Copyright Statement + + Copyright (C) The Internet Society (1999). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + +Newman Standards Track [Page 15] + diff --git a/doc/specification/rfc2808.txt b/doc/specification/rfc2808.txt new file mode 100644 index 0000000..0137dd8 --- /dev/null +++ b/doc/specification/rfc2808.txt @@ -0,0 +1,619 @@ + + + + + + +Network Working Group M. Nystrom +Request for Comments: 2808 RSA Laboratories +Category: Informational April 2000 + + + The SecurID(r) SASL Mechanism + +Status of this Memo + + This memo provides information for the Internet community. It does + not specify an Internet standard of any kind. Distribution of this + memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (2000). All Rights Reserved. + +Abstract + + SecurID is a hardware token card product (or software emulation + thereof) produced by RSA Security Inc., which is used for end-user + authentication. This document defines a SASL [RFC2222] authentication + mechanism using these tokens, thereby providing a means for such + tokens to be used in SASL environments. This mechanism is only for + authentication, and has no effect on the protocol encoding and is not + designed to provide integrity or confidentiality services. + + This memo assumes the reader has basic familiarity with the SecurID + token, its associated authentication protocol and SASL. + +How to read this document + + The key words "MUST", "MUST NOT", "SHALL", "SHOULD" and "MAY" in this + document are to be interpreted as defined in [RFC2119]. + + In examples, "C:" and "S:" indicate messages sent by the client and + server respectively. + +1. Introduction + + The SECURID SASL mechanism is a good choice for usage scenarios where + a client, acting on behalf of a user, is untrusted, as a one-time + passcode will only give the client a single opportunity to act + maliciously. This mechanism provides authentication only. + + + + + + + +Nystrom Informational [Page 1] + +RFC 2808 The SecurID(r) SASL Mechanism April 2000 + + + The SECURID SASL mechanism provides a formal way to integrate the + existing SecurID authentication method into SASL-enabled protocols + including IMAP [RFC2060], ACAP [RFC2244], POP3 [RFC1734] and LDAPv3 + [RFC2251]. + +2. Authentication Model + + The SECURID SASL mechanism provides two-factor based user + authentication as defined below. + + There are basically three entities in the authentication mechanism + described here: A user, possessing a SecurID token, an application + server, to which the user wants to connect, and an authentication + server, capable of authenticating the user. Even though the + application server in practice may function as a client with respect + to the authentication server, relaying authentication credentials + etc. as needed, both servers are, unless explicitly mentioned, + collectively termed "the server" here. The protocol used between the + application server and the authentication server is outside the scope + of this memo. The application client, acting on behalf of the user, + is termed "the client". + + The mechanism is based on the use of a shared secret key, or "seed", + and a personal identification number (PIN), which is known both by + the user and the authentication server. The secret seed is stored on + a token that the user possesses, as well as on the authentication + server. Hence the term "two-factor authentication", a user needs not + only physical access to the token but also knowledge about the PIN in + order to perform an authentication. Given the seed, current time of + day, and the PIN, a "PASSCODE(r)" is generated by the user's token + and sent to the server. + + The SECURID SASL mechanism provides one service: + + - User authentication where the user provides information to the + server, so that the server can authenticate the user. + + This mechanism is identified with the SASL key "SECURID". + +3. Authentication Procedure + + a) The client generates the credentials using local information + (seed, current time and user PIN/password). + + + + + + + + +Nystrom Informational [Page 2] + +RFC 2808 The SecurID(r) SASL Mechanism April 2000 + + + b) If the underlying protocol permits, the client sends credentials + to the server in an initial response message. Otherwise, the + client sends a request to the server to initiate the + authentication mechanism, and sends credentials after the server's + response (see [RFC2222] section 5.1 for more information regarding + the initial response option). + + Unless the server requests a new PIN (see below), the contents of + the client's initial response SHALL be as follows: + + (1) An authorization identity. When this field is empty, it + defaults to the authentication identity. This field MAY be used + by system administrators or proxy servers to login with a + different user identity. This field MUST NOT be longer than 255 + octets, SHALL be terminated by a NUL (0) octet, and MUST consist + of UTF-8-encoded [RFC2279] printable characters only (US-ASCII + [X3.4] is a subset of UTF-8). + + (2) An authentication identity. The identity whose passcode will + be used. If this field is empty, it is assumed to have been + transferred by other means (e.g. if the underlying protocol has + support for this, like [RFC2251]). This field MUST NOT be longer + than 255 octets, SHALL be terminated by a NUL (0) octet, and MUST + consist of UTF-8-encoded printable characters only. + + (3) A passcode. The one-time password that will be used to grant + access. This field MUST NOT be shorter than 4 octets, MUST NOT be + longer than 32 octets, SHALL be terminated by a NUL (0) octet, and + MUST consist of UTF-8-encoded printable characters only. + Passcodes usually consist of 4-8 digits. + + The ABNF [RFC2234] form of this message is as follows: + + credential-pdu = authorization-id authentication-id passcode [pin] + + authorization-id = 0*255VUTF8 %x00 + + authentication-id = 0*255VUTF8 %x00 + + passcode = 4*32VUTF8 %x00 + + pin ::= 4*32VUTF8 %x00 + + VUTF8 = + + Regarding the rule, see d) below. + + + + + +Nystrom Informational [Page 3] + +RFC 2808 The SecurID(r) SASL Mechanism April 2000 + + + c) The server verifies these credentials using its own information. + If the verification succeeds, the server sends back a response + indicating success to the client. After receiving this response, + the client is authenticated. Otherwise, the verification either + failed or the server needs an additional set of credentials from + the client in order to authenticate the user. + + d) If the server needs an additional set of credentials, it requests + them now. This request has the following format, described in ABNF + notation: + + server-request = passcode | pin + + passcode = "passcode" %x00 + + pin = "pin" %x00 [suggested-pin] + + suggested-pin = 4*32VUTF8 %x00 ; Between 4 and 32 UTF-8 characters + + The 'passcode' choice will be sent when the server requests + another passcode. The 'pin' choice will be sent when the server + requests a new user PIN. The server will either send an empty + string or suggest a new user PIN in this message. + + e) The client generates a new set of credentials using local + information and depending on the server's request and sends them + to the server. Authentication now continues as in c) above. + + Note 1: Case d) above may occur e.g. when the clocks on which the + server and the client relies are not synchronized. + + Note 2: If the server requests a new user PIN, the client MUST + respond with a new user PIN (together with a passcode), encoded as a + UTF-8 string. If the server supplies the client with a suggested PIN, + the client accepts this by replying with the same PIN, but MAY + replace it with another one. The length of the PIN is application- + dependent as are any other requirements for the PIN, e.g. allowed + characters. If the server for some reason does not accept the + received PIN, the client MUST be prepared to receive either a message + indicating the failure of the authentication or a repeated request + for a new PIN. Mechanisms for transferring knowledge about PIN + requirements from the server to the client are outside the scope of + this memo. However, some information MAY be provided in error + messages transferred from the server to the client when applicable. + + + + + + + +Nystrom Informational [Page 4] + +RFC 2808 The SecurID(r) SASL Mechanism April 2000 + + +4. Examples + +4.1 IMAP4 + + The following example shows the use of the SECURID SASL mechanism + with IMAP4. The example is only designed to illustrate the protocol + interaction but do provide valid encoding examples. + + The base64 encoding of the last client response, as well as the "+ " + preceding the response, is part of the IMAP4 profile, and not a part + of this specification itself. + + S: * OK IMAP4 server ready + C: A001 CAPABILITY + S: * CAPABILITY IMAP4 AUTH=CRAM-MD5 AUTH=SECURID + S: A001 OK done + C: A002 AUTHENTICATE SECURID + S: + + C: AG1hZ251cwAxMjM0NTY3OAA= + S: A002 OK Welcome, SECURID authenticated user: magnus + +4.2 LDAPv3 + + The following examples show the use of the SECURID SASL mechanism + with LDAPv3. The examples are only designed to illustrate the + protocol interaction, but do provide valid encoding examples. + Usernames, passcodes and PINs are of course fictitious. For + readability, all messages are shown in the value-notation defined in + [X680]. values are shown hex-encoded in the + 'credentials' field of LDAP's 'BindRequest' and + values are shown hex-encoded in the 'serverSaslCreds' field of LDAP's + 'BindResponse'. + +4.2.1 LDAPv3 Example 1 + + Initial response message, successful authentication. + + C: { messageID 1, + protocolOp bindRequest : + { version 1, + name '434E3D4D41474E5553'H, -- "CN=MAGNUS" + authentication sasl : + { mechanism '53454355524944'H, -- "SECURID" + credentials '006d61676e757300313233343536373800'H + } + } + } + + + + +Nystrom Informational [Page 5] + +RFC 2808 The SecurID(r) SASL Mechanism April 2000 + + + S: { messageID 1, + protocolOp bindResponse : + { resultCode success, + matchedDN ''H, + errorMessage ''H, + } + } + +4.2.2 LDAPv3 Example 2 + + Initial response message, server requires second passcode. + + C: { + messageID 1, + protocolOp bindRequest : { + version 1, + name '434E3D4D41474E5553'H, -- "CN=MAGNUS" + authentication sasl : { + mechanism '53454355524944'H, -- "SECURID" + credentials '006d61676e757300313233343536373800'H + } + } + } + + S: { + messageID 1, + protocolOp bindResponse : { + resultCode saslBindInProgress, + matchedDN ''H, + errorMessage ''H, + serverSaslCreds '70617373636f646500'H + } + } + + C: { + messageID 1, + protocolOp bindRequest : { + version 1, + name '434E3D4D41474E5553'H, -- "CN=MAGNUS" + authentication sasl : { + mechanism '53454355524944'H, -- "SECURID" + credentials '006d61676e757300383736353433323100'H + } + } + } + + S: { + messageID 1, + + + +Nystrom Informational [Page 6] + +RFC 2808 The SecurID(r) SASL Mechanism April 2000 + + + protocolOp bindResponse : { + resultCode success, + matchedDN ''H, + errorMessage ''H, + } + } + +4.2.3 LDAPv3 Example 3 + + Initial response message, server requires new PIN and passcode, and + supplies client with a suggested new PIN (which the client accepts). + + C: { + messageID 1, + protocolOp bindRequest : { + version 1, + name '434E3D4D41474E5553'H, -- "CN=MAGNUS" + authentication sasl : { + mechanism '53454355524944'H, -- "SECURID" + credentials '006d61676e757300313233343536373800'H + } + } + } + + S: { + messageID 1, + protocolOp bindResponse : { + resultCode saslBindInProgress, + matchedDN ''H, + errorMessage ''H, + serverSaslCreds '70696e006b616c6c6500'H + } + } + + C: { + messageID 1, + protocolOp bindRequest : { + version 1, + name '434E3D4D41474E5553'H, -- "CN=MAGNUS" + authentication sasl : { + mechanism '53454355524944'H, -- "SECURID" + credentials '006d61676e7573003837343434363734006b616c6c6500'H + } + } + } + + S: { + messageID 1, + + + +Nystrom Informational [Page 7] + +RFC 2808 The SecurID(r) SASL Mechanism April 2000 + + + protocolOp bindResponse : { + resultCode success, + matchedDN ''H, + errorMessage ''H, + } + } + +5. Security Considerations + + This mechanism only provides protection against passive eavesdropping + attacks. It does not provide session privacy, server authentication + or protection from active attacks. In particular, man-in-the-middle + attacks, were an attacker acts as an application server in order to + acquire a valid passcode are possible. + + In order to protect against such attacks, the client SHOULD make sure + that the server is properly authenticated. When user PINs are + transmitted, user authentication SHOULD take place on a server- + authenticated and confidentiality-protected connection. + + Server implementations MUST protect against replay attacks, since an + attacker could otherwise gain access by replaying a previous, valid + request. Clients MUST also protect against replay of PIN-change + messages. + +5.1 The Race Attack + + It is possible for an attacker to listen to most of a passcode, guess + the remainder, and then race the legitimate user to complete the + authentication. As for OTP [RFC2289], conforming server + implementations MUST protect against this race condition. One defense + against this attack is outlined below and borrowed from [RFC2289]; + implementations MAY use this approach or MAY select an alternative + defense. + + One possible defense is to prevent a user from starting multiple + simultaneous authentication sessions. This means that once the + legitimate user has initiated authentication, an attacker would be + blocked until the first authentication process has completed. In + this approach, a timeout is necessary to thwart a denial of service + attack. + +6. IANA Considerations + + By registering the SecurID protocol as a SASL mechanism, implementers + will have a well-defined way of adding this authentication mechanism + to their product. Here is the registration template for the SECURID + SASL mechanism: + + + +Nystrom Informational [Page 8] + +RFC 2808 The SecurID(r) SASL Mechanism April 2000 + + + SASL mechanism name: SECURID + Security Considerations: See corresponding section of this memo + Published specification: This memo + Person & email address to + contact for further + information: See author's address section below + Intended usage: COMMON + Author/Change controller: See author's address section below + +7. Intellectual Property Considerations + + RSA Security Inc. does not make any claims on the general + constructions described in this memo, although underlying techniques + may be covered. Among the underlying techniques, the SecurID + technology is covered by a number of US patents (and foreign + counterparts), in particular US patent no. 4,885,778, no. 5,097,505, + no. 5,168,520, and 5,657,388. + + SecurID is a registered trademark, and PASSCODE is a trademark, of + RSA Security Inc. + +8. References + + [RFC1734] Myers, J., "POP3 AUTHentication command", RFC 1734, + December 1994. + + [RFC2026] Bradner, S., "The Internet Standards Process -- Revision + 3", BCP 9, RFC 2026, October 1996. + + [RFC2060] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, December 1996. + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [RFC2222] Myers, J., "Simple Authentication and Security Layer", RFC + 2222, October 1997. + + [RFC2234] Crocker, D. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", RFC 2234, November 1997. + + [RFC2244] Newman, C. and J. Myers, "ACAP -- Application Configuration + Access Protocol", RFC 2244, November 1997. + + [RFC2251] Wahl, M., Howes, T. and S. Kille, "Lightweight Directory + Access Protocol (v3)", RFC 2251, December 1997. + + + + + +Nystrom Informational [Page 9] + +RFC 2808 The SecurID(r) SASL Mechanism April 2000 + + + [RFC2279] Yergeau, F., "UTF-8, a transformation format of ISO 10646", + RFC 2279, January 1998. + + [RFC2289] Haller, N., Metz, C., Nesser, P. and M. Straw, "A One-Time + Password System", RFC 2289, February 1998. + + [X3.4] ANSI, "ANSI X3.4: Information Systems - Coded Character + Sets - 7-Bit American National Standard Code for + Information Interchange (7-Bit ASCII)," American National + Standards Institute. + + [X680] ITU-T, "Information Technology - Abstract Syntax Notation + One (ASN.1): Specification of Basic Notation," + International Telecommunication Union, 1997. + +9. Acknowledgements + + The author gratefully acknowledges the contributions of various + reviewers of this memo, in particular the ones from John Myers. They + have significantly clarified and improved the utility of this + specification. + +10. Author's Address + + Magnus Nystrom + RSA Laboratories + Box 10704 + 121 29 Stockholm + Sweden + + Phone: +46 8 725 0900 + EMail: magnus@rsasecurity.com + + + + + + + + + + + + + + + + + + + +Nystrom Informational [Page 10] + +RFC 2808 The SecurID(r) SASL Mechanism April 2000 + + +11. Full Copyright Statement + + Copyright (C) The Internet Society (2000). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + +Nystrom Informational [Page 11] + diff --git a/doc/specification/rfc2831.txt b/doc/specification/rfc2831.txt new file mode 100644 index 0000000..c1a54c4 --- /dev/null +++ b/doc/specification/rfc2831.txt @@ -0,0 +1,1515 @@ + + + + + + +Network Working Group P. Leach +Request for Comments: 2831 Microsoft +Category: Standards Track C. Newman + Innosoft + May 2000 + + + Using Digest Authentication as a SASL Mechanism + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (2000). All Rights Reserved. + +Abstract + + This specification defines how HTTP Digest Authentication [Digest] + can be used as a SASL [RFC 2222] mechanism for any protocol that has + a SASL profile. It is intended both as an improvement over CRAM-MD5 + [RFC 2195] and as a convenient way to support a single authentication + mechanism for web, mail, LDAP, and other protocols. + +Table of Contents + + 1 INTRODUCTION.....................................................2 + 1.1 CONVENTIONS AND NOTATION......................................2 + 1.2 REQUIREMENTS..................................................3 + 2 AUTHENTICATION...................................................3 + 2.1 INITIAL AUTHENTICATION........................................3 + 2.1.1 Step One...................................................3 + 2.1.2 Step Two...................................................6 + 2.1.3 Step Three................................................12 + 2.2 SUBSEQUENT AUTHENTICATION....................................12 + 2.2.1 Step one..................................................13 + 2.2.2 Step Two..................................................13 + 2.3 INTEGRITY PROTECTION.........................................13 + 2.4 CONFIDENTIALITY PROTECTION...................................14 + 3 SECURITY CONSIDERATIONS.........................................15 + 3.1 AUTHENTICATION OF CLIENTS USING DIGEST AUTHENTICATION........15 + 3.2 COMPARISON OF DIGEST WITH PLAINTEXT PASSWORDS................16 + 3.3 REPLAY ATTACKS...............................................16 + + + +Leach & Newman Standards Track [Page 1] + +RFC 2831 Digest SASL Mechanism May 2000 + + + 3.4 ONLINE DICTIONARY ATTACKS....................................16 + 3.5 OFFLINE DICTIONARY ATTACKS...................................16 + 3.6 MAN IN THE MIDDLE............................................17 + 3.7 CHOSEN PLAINTEXT ATTACKS.....................................17 + 3.8 SPOOFING BY COUNTERFEIT SERVERS..............................17 + 3.9 STORING PASSWORDS............................................17 + 3.10 MULTIPLE REALMS.............................................18 + 3.11 SUMMARY.....................................................18 + 4 EXAMPLE.........................................................18 + 5 REFERENCES......................................................20 + 6 AUTHORS' ADDRESSES..............................................21 + 7 ABNF............................................................21 + 7.1 AUGMENTED BNF................................................21 + 7.2 BASIC RULES..................................................23 + 8 SAMPLE CODE.....................................................25 + 9 FULL COPYRIGHT STATEMENT........................................27 + +1 Introduction + + This specification describes the use of HTTP Digest Access + Authentication as a SASL mechanism. The authentication type + associated with the Digest SASL mechanism is "DIGEST-MD5". + + This specification is intended to be upward compatible with the + "md5-sess" algorithm of HTTP/1.1 Digest Access Authentication + specified in [Digest]. The only difference in the "md5-sess" + algorithm is that some directives not needed in a SASL mechanism have + had their values defaulted. + + There is one new feature for use as a SASL mechanism: integrity + protection on application protocol messages after an authentication + exchange. + + Also, compared to CRAM-MD5, DIGEST-MD5 prevents chosen plaintext + attacks, and permits the use of third party authentication servers, + mutual authentication, and optimized reauthentication if a client has + recently authenticated to a server. + +1.1 Conventions and Notation + + This specification uses the same ABNF notation and lexical + conventions as HTTP/1.1 specification; see appendix A. + + Let { a, b, ... } be the concatenation of the octet strings a, b, ... + + Let H(s) be the 16 octet MD5 hash [RFC 1321] of the octet string s. + + + + + +Leach & Newman Standards Track [Page 2] + +RFC 2831 Digest SASL Mechanism May 2000 + + + Let KD(k, s) be H({k, ":", s}), i.e., the 16 octet hash of the string + k, a colon and the string s. + + Let HEX(n) be the representation of the 16 octet MD5 hash n as a + string of 32 hex digits (with alphabetic characters always in lower + case, since MD5 is case sensitive). + + Let HMAC(k, s) be the 16 octet HMAC-MD5 [RFC 2104] of the octet + string s using the octet string k as a key. + + The value of a quoted string constant as an octet string does not + include any terminating null character. + +1.2 Requirements + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in RFC 2119 [RFC 2119]. + + An implementation is not compliant if it fails to satisfy one or more + of the MUST level requirements for the protocols it implements. An + implementation that satisfies all the MUST level and all the SHOULD + level requirements for its protocols is said to be "unconditionally + compliant"; one that satisfies all the MUST level requirements but + not all the SHOULD level requirements for its protocols is said to be + "conditionally compliant." + +2 Authentication + + The following sections describe how to use Digest as a SASL + authentication mechanism. + +2.1 Initial Authentication + + If the client has not recently authenticated to the server, then it + must perform "initial authentication", as defined in this section. If + it has recently authenticated, then a more efficient form is + available, defined in the next section. + +2.1.1 Step One + + The server starts by sending a challenge. The data encoded in the + challenge contains a string formatted according to the rules for a + "digest-challenge" defined as follows: + + + + + + + +Leach & Newman Standards Track [Page 3] + +RFC 2831 Digest SASL Mechanism May 2000 + + + digest-challenge = + 1#( realm | nonce | qop-options | stale | maxbuf | charset + algorithm | cipher-opts | auth-param ) + + realm = "realm" "=" <"> realm-value <"> + realm-value = qdstr-val + nonce = "nonce" "=" <"> nonce-value <"> + nonce-value = qdstr-val + qop-options = "qop" "=" <"> qop-list <"> + qop-list = 1#qop-value + qop-value = "auth" | "auth-int" | "auth-conf" | + token + stale = "stale" "=" "true" + maxbuf = "maxbuf" "=" maxbuf-value + maxbuf-value = 1*DIGIT + charset = "charset" "=" "utf-8" + algorithm = "algorithm" "=" "md5-sess" + cipher-opts = "cipher" "=" <"> 1#cipher-value <"> + cipher-value = "3des" | "des" | "rc4-40" | "rc4" | + "rc4-56" | token + auth-param = token "=" ( token | quoted-string ) + + The meanings of the values of the directives used above are as + follows: + + realm + Mechanistically, a string which can enable users to know which + username and password to use, in case they might have different + ones for different servers. Conceptually, it is the name of a + collection of accounts that might include the user's account. This + string should contain at least the name of the host performing the + authentication and might additionally indicate the collection of + users who might have access. An example might be + "registered_users@gotham.news.example.com". This directive is + optional; if not present, the client SHOULD solicit it from the + user or be able to compute a default; a plausible default might be + the realm supplied by the user when they logged in to the client + system. Multiple realm directives are allowed, in which case the + user or client must choose one as the realm for which to supply to + username and password. + + nonce + A server-specified data string which MUST be different each time a + digest-challenge is sent as part of initial authentication. It is + recommended that this string be base64 or hexadecimal data. Note + that since the string is passed as a quoted string, the + double-quote character is not allowed unless escaped (see section + 7.2). The contents of the nonce are implementation dependent. The + + + +Leach & Newman Standards Track [Page 4] + +RFC 2831 Digest SASL Mechanism May 2000 + + + security of the implementation depends on a good choice. It is + RECOMMENDED that it contain at least 64 bits of entropy. The nonce + is opaque to the client. This directive is required and MUST + appear exactly once; if not present, or if multiple instances are + present, the client should abort the authentication exchange. + + qop-options + A quoted string of one or more tokens indicating the "quality of + protection" values supported by the server. The value "auth" + indicates authentication; the value "auth-int" indicates + authentication with integrity protection; the value "auth-conf" + indicates authentication with integrity protection and encryption. + This directive is optional; if not present it defaults to "auth". + The client MUST ignore unrecognized options; if the client + recognizes no option, it should abort the authentication exchange. + + stale + The "stale" directive is not used in initial authentication. See + the next section for its use in subsequent authentications. This + directive may appear at most once; if multiple instances are + present, the client should abort the authentication exchange. + + maxbuf + A number indicating the size of the largest buffer the server is + able to receive when using "auth-int" or "auth-conf". If this + directive is missing, the default value is 65536. This directive + may appear at most once; if multiple instances are present, the + client should abort the authentication exchange. + + charset + This directive, if present, specifies that the server supports + UTF-8 encoding for the username and password. If not present, the + username and password must be encoded in ISO 8859-1 (of which + US-ASCII is a subset). The directive is needed for backwards + compatibility with HTTP Digest, which only supports ISO 8859-1. + This directive may appear at most once; if multiple instances are + present, the client should abort the authentication exchange. + + algorithm + This directive is required for backwards compatibility with HTTP + Digest., which supports other algorithms. . This directive is + required and MUST appear exactly once; if not present, or if + multiple instances are present, the client should abort the + authentication exchange. + + + + + + + +Leach & Newman Standards Track [Page 5] + +RFC 2831 Digest SASL Mechanism May 2000 + + + cipher-opts + A list of ciphers that the server supports. This directive must be + present exactly once if "auth-conf" is offered in the + "qop-options" directive, in which case the "3des" and "des" modes + are mandatory-to-implement. The client MUST ignore unrecognized + options; if the client recognizes no option, it should abort the + authentication exchange. + + des + the Data Encryption Standard (DES) cipher [FIPS] in cipher + block chaining (CBC) mode with a 56 bit key. + + 3des + the "triple DES" cipher in CBC mode with EDE with the same key + for each E stage (aka "two keys mode") for a total key length + of 112 bits. + + rc4, rc4-40, rc4-56 + the RC4 cipher with a 128 bit, 40 bit, and 56 bit key, + respectively. + + auth-param This construct allows for future extensions; it may appear + more than once. The client MUST ignore any unrecognized + directives. + + For use as a SASL mechanism, note that the following changes are made + to "digest-challenge" from HTTP: the following Digest options (called + "directives" in HTTP terminology) are unused (i.e., MUST NOT be sent, + and MUST be ignored if received): + + opaque + domain + + The size of a digest-challenge MUST be less than 2048 bytes. + +2.1.2 Step Two + + The client makes note of the "digest-challenge" and then responds + with a string formatted and computed according to the rules for a + "digest-response" defined as follows: + + + + + + + + + + + +Leach & Newman Standards Track [Page 6] + +RFC 2831 Digest SASL Mechanism May 2000 + + + digest-response = 1#( username | realm | nonce | cnonce | + nonce-count | qop | digest-uri | response | + maxbuf | charset | cipher | authzid | + auth-param ) + + username = "username" "=" <"> username-value <"> + username-value = qdstr-val + cnonce = "cnonce" "=" <"> cnonce-value <"> + cnonce-value = qdstr-val + nonce-count = "nc" "=" nc-value + nc-value = 8LHEX + qop = "qop" "=" qop-value + digest-uri = "digest-uri" "=" <"> digest-uri-value <"> + digest-uri-value = serv-type "/" host [ "/" serv-name ] + serv-type = 1*ALPHA + host = 1*( ALPHA | DIGIT | "-" | "." ) + serv-name = host + response = "response" "=" response-value + response-value = 32LHEX + LHEX = "0" | "1" | "2" | "3" | + "4" | "5" | "6" | "7" | + "8" | "9" | "a" | "b" | + "c" | "d" | "e" | "f" + cipher = "cipher" "=" cipher-value + authzid = "authzid" "=" <"> authzid-value <"> + authzid-value = qdstr-val + + + username + The user's name in the specified realm, encoded according to the + value of the "charset" directive. This directive is required and + MUST be present exactly once; otherwise, authentication fails. + + realm + The realm containing the user's account. This directive is + required if the server provided any realms in the + "digest-challenge", in which case it may appear exactly once and + its value SHOULD be one of those realms. If the directive is + missing, "realm-value" will set to the empty string when computing + A1 (see below for details). + + nonce + The server-specified data string received in the preceding + digest-challenge. This directive is required and MUST be present + exactly once; otherwise, authentication fails. + + + + + + +Leach & Newman Standards Track [Page 7] + +RFC 2831 Digest SASL Mechanism May 2000 + + + cnonce + A client-specified data string which MUST be different each time a + digest-response is sent as part of initial authentication. The + cnonce-value is an opaque quoted string value provided by the + client and used by both client and server to avoid chosen + plaintext attacks, and to provide mutual authentication. The + security of the implementation depends on a good choice. It is + RECOMMENDED that it contain at least 64 bits of entropy. This + directive is required and MUST be present exactly once; otherwise, + authentication fails. + + nonce-count + The nc-value is the hexadecimal count of the number of requests + (including the current request) that the client has sent with the + nonce value in this request. For example, in the first request + sent in response to a given nonce value, the client sends + "nc=00000001". The purpose of this directive is to allow the + server to detect request replays by maintaining its own copy of + this count - if the same nc-value is seen twice, then the request + is a replay. See the description below of the construction of + the response value. This directive may appear at most once; if + multiple instances are present, the client should abort the + authentication exchange. + + qop + Indicates what "quality of protection" the client accepted. If + present, it may appear exactly once and its value MUST be one of + the alternatives in qop-options. If not present, it defaults to + "auth". These values affect the computation of the response. Note + that this is a single token, not a quoted list of alternatives. + + serv-type + Indicates the type of service, such as "www" for web service, + "ftp" for FTP service, "smtp" for mail delivery service, etc. The + service name as defined in the SASL profile for the protocol see + section 4 of [RFC 2222], registered in the IANA registry of + "service" elements for the GSSAPI host-based service name form + [RFC 2078]. + + host + The DNS host name or IP address for the service requested. The + DNS host name must be the fully-qualified canonical name of the + host. The DNS host name is the preferred form; see notes on server + processing of the digest-uri. + + + + + + + +Leach & Newman Standards Track [Page 8] + +RFC 2831 Digest SASL Mechanism May 2000 + + + serv-name + Indicates the name of the service if it is replicated. The service + is considered to be replicated if the client's service-location + process involves resolution using standard DNS lookup operations, + and if these operations involve DNS records (such as SRV, or MX) + which resolve one DNS name into a set of other DNS names. In this + case, the initial name used by the client is the "serv-name", and + the final name is the "host" component. For example, the incoming + mail service for "example.com" may be replicated through the use + of MX records stored in the DNS, one of which points at an SMTP + server called "mail3.example.com"; it's "serv-name" would be + "example.com", it's "host" would be "mail3.example.com". If the + service is not replicated, or the serv-name is identical to the + host, then the serv-name component MUST be omitted. + + digest-uri + Indicates the principal name of the service with which the client + wishes to connect, formed from the serv-type, host, and serv-name. + For example, the FTP service on "ftp.example.com" would have a + "digest-uri" value of "ftp/ftp.example.com"; the SMTP server from + the example above would have a "digest-uri" value of + "smtp/mail3.example.com/example.com". + + Servers SHOULD check that the supplied value is correct. This will + detect accidental connection to the incorrect server. It is also so + that clients will be trained to provide values that will work with + implementations that use a shared back-end authentication service + that can provide server authentication. + + The serv-type component should match the service being offered. The + host component should match one of the host names of the host on + which the service is running, or it's IP address. Servers SHOULD NOT + normally support the IP address form, because server authentication + by IP address is not very useful; they should only do so if the DNS + is unavailable or unreliable. The serv-name component should match + one of the service's configured service names. + + This directive may appear at most once; if multiple instances are + present, the client should abort the authentication exchange. + + Note: In the HTTP use of Digest authentication, the digest-uri is the + URI (usually a URL) of the resource requested -- hence the name of + the directive. + + response + A string of 32 hex digits computed as defined below, which proves + that the user knows a password. This directive is required and + MUST be present exactly once; otherwise, authentication fails. + + + +Leach & Newman Standards Track [Page 9] + +RFC 2831 Digest SASL Mechanism May 2000 + + + maxbuf + A number indicating the size of the largest buffer the client is + able to receive. If this directive is missing, the default value + is 65536. This directive may appear at most once; if multiple + instances are present, the server should abort the authentication + exchange. + + charset + This directive, if present, specifies that the client has used + UTF-8 encoding for the username and password. If not present, the + username and password must be encoded in ISO 8859-1 (of which + US-ASCII is a subset). The client should send this directive only + if the server has indicated it supports UTF-8. The directive is + needed for backwards compatibility with HTTP Digest, which only + supports ISO 8859-1. + + LHEX + 32 hex digits, where the alphabetic characters MUST be lower case, + because MD5 is not case insensitive. + + cipher + The cipher chosen by the client. This directive MUST appear + exactly once if "auth-conf" is negotiated; if required and not + present, authentication fails. + + authzid + The "authorization ID" as per RFC 2222, encoded in UTF-8. This + directive is optional. If present, and the authenticating user has + sufficient privilege, and the server supports it, then after + authentication the server will use this identity for making all + accesses and access checks. If the client specifies it, and the + server does not support it, then the response-value will be + incorrect, and authentication will fail. + + The size of a digest-response MUST be less than 4096 bytes. + +2.1.2.1 Response-value + + The definition of "response-value" above indicates the encoding for + its value -- 32 lower case hex characters. The following definitions + show how the value is computed. + + Although qop-value and components of digest-uri-value may be + case-insensitive, the case which the client supplies in step two is + preserved for the purpose of computing and verifying the + response-value. + + response-value = + + + +Leach & Newman Standards Track [Page 10] + +RFC 2831 Digest SASL Mechanism May 2000 + + + HEX( KD ( HEX(H(A1)), + { nonce-value, ":" nc-value, ":", + cnonce-value, ":", qop-value, ":", HEX(H(A2)) })) + + If authzid is specified, then A1 is + + + A1 = { H( { username-value, ":", realm-value, ":", passwd } ), + ":", nonce-value, ":", cnonce-value, ":", authzid-value } + + If authzid is not specified, then A1 is + + + A1 = { H( { username-value, ":", realm-value, ":", passwd } ), + ":", nonce-value, ":", cnonce-value } + + where + + passwd = *OCTET + + The "username-value", "realm-value" and "passwd" are encoded + according to the value of the "charset" directive. If "charset=UTF-8" + is present, and all the characters of either "username-value" or + "passwd" are in the ISO 8859-1 character set, then it must be + converted to ISO 8859-1 before being hashed. This is so that + authentication databases that store the hashed username, realm and + password (which is common) can be shared compatibly with HTTP, which + specifies ISO 8859-1. A sample implementation of this conversion is + in section 8. + + If the "qop" directive's value is "auth", then A2 is: + + A2 = { "AUTHENTICATE:", digest-uri-value } + + If the "qop" value is "auth-int" or "auth-conf" then A2 is: + + A2 = { "AUTHENTICATE:", digest-uri-value, + ":00000000000000000000000000000000" } + + Note that "AUTHENTICATE:" must be in upper case, and the second + string constant is a string with a colon followed by 32 zeros. + + These apparently strange values of A2 are for compatibility with + HTTP; they were arrived at by setting "Method" to "AUTHENTICATE" and + the hash of the entity body to zero in the HTTP digest calculation of + A2. + + Also, in the HTTP usage of Digest, several directives in the + + + +Leach & Newman Standards Track [Page 11] + +RFC 2831 Digest SASL Mechanism May 2000 + + + "digest-challenge" sent by the server have to be returned by the + client in the "digest-response". These are: + + opaque + algorithm + + These directives are not needed when Digest is used as a SASL + mechanism (i.e., MUST NOT be sent, and MUST be ignored if received). + +2.1.3 Step Three + + The server receives and validates the "digest-response". The server + checks that the nonce-count is "00000001". If it supports subsequent + authentication (see section 2.2), it saves the value of the nonce and + the nonce-count. It sends a message formatted as follows: + + response-auth = "rspauth" "=" response-value + + where response-value is calculated as above, using the values sent in + step two, except that if qop is "auth", then A2 is + + A2 = { ":", digest-uri-value } + + And if qop is "auth-int" or "auth-conf" then A2 is + + A2 = { ":", digest-uri-value, ":00000000000000000000000000000000" } + + Compared to its use in HTTP, the following Digest directives in the + "digest-response" are unused: + + nextnonce + qop + cnonce + nonce-count + +2.2 Subsequent Authentication + + If the client has previously authenticated to the server, and + remembers the values of username, realm, nonce, nonce-count, cnonce, + and qop that it used in that authentication, and the SASL profile for + a protocol permits an initial client response, then it MAY perform + "subsequent authentication", as defined in this section. + + + + + + + + + +Leach & Newman Standards Track [Page 12] + +RFC 2831 Digest SASL Mechanism May 2000 + + +2.2.1 Step one + + The client uses the values from the previous authentication and sends + an initial response with a string formatted and computed according to + the rules for a "digest-response", as defined above, but with a + nonce-count one greater than used in the last "digest-response". + +2.2.2 Step Two + + The server receives the "digest-response". If the server does not + support subsequent authentication, then it sends a + "digest-challenge", and authentication proceeds as in initial + authentication. If the server has no saved nonce and nonce-count from + a previous authentication, then it sends a "digest-challenge", and + authentication proceeds as in initial authentication. Otherwise, the + server validates the "digest-response", checks that the nonce-count + is one greater than that used in the previous authentication using + that nonce, and saves the new value of nonce-count. + + If the response is invalid, then the server sends a + "digest-challenge", and authentication proceeds as in initial + authentication (and should be configurable to log an authentication + failure in some sort of security audit log, since the failure may be + a symptom of an attack). The nonce-count MUST NOT be incremented in + this case: to do so would allow a denial of service attack by sending + an out-of-order nonce-count. + + If the response is valid, the server MAY choose to deem that + authentication has succeeded. However, if it has been too long since + the previous authentication, or for any other reason, the server MAY + send a new "digest-challenge" with a new value for nonce. The + challenge MAY contain a "stale" directive with value "true", which + says that the client may respond to the challenge using the password + it used in the previous response; otherwise, the client must solicit + the password anew from the user. This permits the server to make sure + that the user has presented their password recently. (The directive + name refers to the previous nonce being stale, not to the last use of + the password.) Except for the handling of "stale", after sending the + "digest-challenge" authentication proceeds as in the case of initial + authentication. + +2.3 Integrity Protection + + If the server offered "qop=auth-int" and the client responded + "qop=auth-int", then subsequent messages, up to but not including the + next subsequent authentication, between the client and the server + + + + + +Leach & Newman Standards Track [Page 13] + +RFC 2831 Digest SASL Mechanism May 2000 + + + MUST be integrity protected. Using as a base session key the value of + H(A1) as defined above the client and server calculate a pair of + message integrity keys as follows. + + The key for integrity protecting messages from client to server is: + + Kic = MD5({H(A1), + "Digest session key to client-to-server signing key magic constant"}) + + The key for integrity protecting messages from server to client is: + + Kis = MD5({H(A1), + "Digest session key to server-to-client signing key magic constant"}) + + where MD5 is as specified in [RFC 1321]. If message integrity is + negotiated, a MAC block for each message is appended to the message. + The MAC block is 16 bytes: the first 10 bytes of the HMAC-MD5 [RFC + 2104] of the message, a 2-byte message type number in network byte + order with value 1, and the 4-byte sequence number in network byte + order. The message type is to allow for future extensions such as + rekeying. + + MAC(Ki, SeqNum, msg) = (HMAC(Ki, {SeqNum, msg})[0..9], 0x0001, + SeqNum) + + where Ki is Kic for messages sent by the client and Kis for those + sent by the server. The sequence number is initialized to zero, and + incremented by one for each message sent. + + Upon receipt, MAC(Ki, SeqNum, msg) is computed and compared with the + received value; the message is discarded if they differ. + +2.4 Confidentiality Protection + + If the server sent a "cipher-opts" directive and the client responded + with a "cipher" directive, then subsequent messages between the + client and the server MUST be confidentiality protected. Using as a + base session key the value of H(A1) as defined above the client and + server calculate a pair of message integrity keys as follows. + + The key for confidentiality protecting messages from client to server + is: + + Kcc = MD5({H(A1)[0..n], + "Digest H(A1) to client-to-server sealing key magic constant"}) + + The key for confidentiality protecting messages from server to client + is: + + + +Leach & Newman Standards Track [Page 14] + +RFC 2831 Digest SASL Mechanism May 2000 + + + Kcs = MD5({H(A1)[0..n], + "Digest H(A1) to server-to-client sealing key magic constant"}) + + where MD5 is as specified in [RFC 1321]. For cipher "rc4-40" n is 5; + for "rc4-56" n is 7; for the rest n is 16. The key for the "rc-*" + ciphers is all 16 bytes of Kcc or Kcs; the key for "des" is the first + 7 bytes; the key for "3des" is the first 14 bytes. The IV for "des" + and "3des" is the last 8 bytes of Kcc or Kcs. + + If message confidentiality is negotiated, each message is encrypted + with the chosen cipher and a MAC block is appended to the message. + + The MAC block is a variable length padding prefix followed by 16 + bytes formatted as follows: the first 10 bytes of the HMAC-MD5 [RFC + 2104] of the message, a 2-byte message type number in network byte + order with value 1, and the 4-byte sequence number in network byte + order. If the blocksize of the chosen cipher is not 1 byte, the + padding prefix is one or more octets each containing the number of + padding bytes, such that total length of the encrypted part of the + message is a multiple of the blocksize. The padding and first 10 + bytes of the MAC block are encrypted along with the message. + + SEAL(Ki, Kc, SeqNum, msg) = + {CIPHER(Kc, {msg, pad, HMAC(Ki, {SeqNum, msg})[0..9])}), 0x0001, + SeqNum} + + where CIPHER is the chosen cipher, Ki and Kc are Kic and Kcc for + messages sent by the client and Kis and Kcs for those sent by the + server. The sequence number is initialized to zero, and incremented + by one for each message sent. + + Upon receipt, the message is decrypted, HMAC(Ki, {SeqNum, msg}) is + computed and compared with the received value; the message is + discarded if they differ. + +3 Security Considerations + +3.1 Authentication of Clients using Digest Authentication + + Digest Authentication does not provide a strong authentication + mechanism, when compared to public key based mechanisms, for example. + However, since it prevents chosen plaintext attacks, it is stronger + than (e.g.) CRAM-MD5, which has been proposed for use with LDAP [10], + POP and IMAP (see RFC 2195 [9]). It is intended to replace the much + weaker and even more dangerous use of plaintext passwords; however, + since it is still a password based mechanism it avoids some of the + potential deployabilty issues with public-key, OTP or similar + mechanisms. + + + +Leach & Newman Standards Track [Page 15] + +RFC 2831 Digest SASL Mechanism May 2000 + + + Digest Authentication offers no confidentiality protection beyond + protecting the actual password. All of the rest of the challenge and + response are available to an eavesdropper, including the user's name + and authentication realm. + +3.2 Comparison of Digest with Plaintext Passwords + + The greatest threat to the type of transactions for which these + protocols are used is network snooping. This kind of transaction + might involve, for example, online access to a mail service whose use + is restricted to paying subscribers. With plaintext password + authentication an eavesdropper can obtain the password of the user. + This not only permits him to access anything in the database, but, + often worse, will permit access to anything else the user protects + with the same password. + +3.3 Replay Attacks + + Replay attacks are defeated if the client or the server chooses a + fresh nonce for each authentication, as this specification requires. + +3.4 Online dictionary attacks + + If the attacker can eavesdrop, then it can test any overheard + nonce/response pairs against a (potentially very large) list of + common words. Such a list is usually much smaller than the total + number of possible passwords. The cost of computing the response for + each password on the list is paid once for each challenge. + + The server can mitigate this attack by not allowing users to select + passwords that are in a dictionary. + +3.5 Offline dictionary attacks + + If the attacker can choose the challenge, then it can precompute the + possible responses to that challenge for a list of common words. Such + a list is usually much smaller than the total number of possible + passwords. The cost of computing the response for each password on + the list is paid just once. + + Offline dictionary attacks are defeated if the client chooses a fresh + nonce for each authentication, as this specification requires. + + + + + + + + + +Leach & Newman Standards Track [Page 16] + +RFC 2831 Digest SASL Mechanism May 2000 + + +3.6 Man in the Middle + + Digest authentication is vulnerable to "man in the middle" (MITM) + attacks. Clearly, a MITM would present all the problems of + eavesdropping. But it also offers some additional opportunities to + the attacker. + + A possible man-in-the-middle attack would be to substitute a weaker + qop scheme for the one(s) sent by the server; the server will not be + able to detect this attack. For this reason, the client should always + use the strongest scheme that it understands from the choices + offered, and should never choose a scheme that does not meet its + minimum requirements. + +3.7 Chosen plaintext attacks + + A chosen plaintext attack is where a MITM or a malicious server can + arbitrarily choose the challenge that the client will use to compute + the response. The ability to choose the challenge is known to make + cryptanalysis much easier [8]. + + However, Digest does not permit the attack to choose the challenge as + long as the client chooses a fresh nonce for each authentication, as + this specification requires. + +3.8 Spoofing by Counterfeit Servers + + If a user can be led to believe that she is connecting to a host + containing information protected by a password she knows, when in + fact she is connecting to a hostile server, then the hostile server + can obtain challenge/response pairs where it was able to partly + choose the challenge. There is no known way that this can be + exploited. + +3.9 Storing passwords + + Digest authentication requires that the authenticating agent (usually + the server) store some data derived from the user's name and password + in a "password file" associated with a given realm. Normally this + might contain pairs consisting of username and H({ username-value, + ":", realm-value, ":", passwd }), which is adequate to compute H(A1) + as described above without directly exposing the user's password. + + The security implications of this are that if this password file is + compromised, then an attacker gains immediate access to documents on + the server using this realm. Unlike, say a standard UNIX password + file, this information need not be decrypted in order to access + documents in the server realm associated with this file. On the other + + + +Leach & Newman Standards Track [Page 17] + +RFC 2831 Digest SASL Mechanism May 2000 + + + hand, decryption, or more likely a brute force attack, would be + necessary to obtain the user's password. This is the reason that the + realm is part of the digested data stored in the password file. It + means that if one Digest authentication password file is compromised, + it does not automatically compromise others with the same username + and password (though it does expose them to brute force attack). + + There are two important security consequences of this. First the + password file must be protected as if it contained plaintext + passwords, because for the purpose of accessing documents in its + realm, it effectively does. + + A second consequence of this is that the realm string should be + unique among all realms that any single user is likely to use. In + particular a realm string should include the name of the host doing + the authentication. + +3.10 Multiple realms + + Use of multiple realms may mean both that compromise of a the + security database for a single realm does not compromise all + security, and that there are more things to protect in order to keep + the whole system secure. + +3.11 Summary + + By modern cryptographic standards Digest Authentication is weak, + compared to (say) public key based mechanisms. But for a large range + of purposes it is valuable as a replacement for plaintext passwords. + Its strength may vary depending on the implementation. + +4 Example + + This example shows the use of the Digest SASL mechanism with the + IMAP4 AUTHENTICATE command [RFC 2060]. + + In this example, "C:" and "S:" represent a line sent by the client or + server respectively including a CRLF at the end. Linebreaks and + indentation within a "C:" or "S:" are editorial and not part of the + protocol. The password in this example was "secret". Note that the + base64 encoding of the challenges and responses is part of the IMAP4 + AUTHENTICATE command, not part of the Digest specification itself. + + S: * OK elwood.innosoft.com PMDF IMAP4rev1 V6.0-9 + C: c CAPABILITY + S: * CAPABILITY IMAP4 IMAP4rev1 ACL LITERAL+ NAMESPACE QUOTA + UIDPLUS AUTH=CRAM-MD5 AUTH=DIGEST-MD5 AUTH=PLAIN + S: c OK Completed + + + +Leach & Newman Standards Track [Page 18] + +RFC 2831 Digest SASL Mechanism May 2000 + + + C: a AUTHENTICATE DIGEST-MD5 + S: + cmVhbG09ImVsd29vZC5pbm5vc29mdC5jb20iLG5vbmNlPSJPQTZNRzl0 + RVFHbTJoaCIscW9wPSJhdXRoIixhbGdvcml0aG09bWQ1LXNlc3MsY2hh + cnNldD11dGYtOA== + C: Y2hhcnNldD11dGYtOCx1c2VybmFtZT0iY2hyaXMiLHJlYWxtPSJlbHdvb2 + QuaW5ub3NvZnQuY29tIixub25jZT0iT0E2TUc5dEVRR20yaGgiLG5jPTAw + MDAwMDAxLGNub25jZT0iT0E2TUhYaDZWcVRyUmsiLGRpZ2VzdC11cmk9Im + ltYXAvZWx3b29kLmlubm9zb2Z0LmNvbSIscmVzcG9uc2U9ZDM4OGRhZDkw + ZDRiYmQ3NjBhMTUyMzIxZjIxNDNhZjcscW9wPWF1dGg= + S: + cnNwYXV0aD1lYTQwZjYwMzM1YzQyN2I1NTI3Yjg0ZGJhYmNkZmZmZA== + C: + S: a OK User logged in + --- + + The base64-decoded version of the SASL exchange is: + + S: realm="elwood.innosoft.com",nonce="OA6MG9tEQGm2hh",qop="auth", + algorithm=md5-sess,charset=utf-8 + C: charset=utf-8,username="chris",realm="elwood.innosoft.com", + nonce="OA6MG9tEQGm2hh",nc=00000001,cnonce="OA6MHXh6VqTrRk", + digest-uri="imap/elwood.innosoft.com", + response=d388dad90d4bbd760a152321f2143af7,qop=auth + S: rspauth=ea40f60335c427b5527b84dbabcdfffd + + The password in this example was "secret". + + This example shows the use of the Digest SASL mechanism with the + ACAP, using the same notational conventions and password as in the + previous example. Note that ACAP does not base64 encode and uses + fewer round trips that IMAP4. + + S: * ACAP (IMPLEMENTATION "Test ACAP server") (SASL "CRAM-MD5" + "DIGEST-MD5" "PLAIN") + C: a AUTHENTICATE "DIGEST-MD5" + S: + {94} + S: realm="elwood.innosoft.com",nonce="OA9BSXrbuRhWay",qop="auth", + algorithm=md5-sess,charset=utf-8 + C: {206} + C: charset=utf-8,username="chris",realm="elwood.innosoft.com", + nonce="OA9BSXrbuRhWay",nc=00000001,cnonce="OA9BSuZWMSpW8m", + digest-uri="acap/elwood.innosoft.com", + response=6084c6db3fede7352c551284490fd0fc,qop=auth + S: a OK (SASL {40} + S: rspauth=2f0b3d7c3c2e486600ef710726aa2eae) "AUTHENTICATE + Completed" + --- + + + + + +Leach & Newman Standards Track [Page 19] + +RFC 2831 Digest SASL Mechanism May 2000 + + + The server uses the values of all the directives, plus knowledge of + the users password (or the hash of the user's name, server's realm + and the user's password) to verify the computations above. If they + check, then the user has authenticated. + +5 References + + [Digest] Franks, J., et al., "HTTP Authentication: Basic and Digest + Access Authentication", RFC 2617, June 1999. + + [ISO-8859] ISO-8859. International Standard--Information Processing-- + 8-bit Single-Byte Coded Graphic Character Sets -- + Part 1: Latin alphabet No. 1, ISO-8859-1:1987. + Part 2: Latin alphabet No. 2, ISO-8859-2, 1987. + Part 3: Latin alphabet No. 3, ISO-8859-3, 1988. + Part 4: Latin alphabet No. 4, ISO-8859-4, 1988. + Part 5: Latin/Cyrillic alphabet, ISO-8859-5, 1988. + Part 6: Latin/Arabic alphabet, ISO-8859-6, 1987. + Part 7: Latin/Greek alphabet, ISO-8859-7, 1987. + Part 8: Latin/Hebrew alphabet, ISO-8859-8, 1988. + Part 9: Latin alphabet No. 5, ISO-8859-9, 1990. + + [RFC 822] Crocker, D., "Standard for The Format of ARPA Internet + Text Messages," STD 11, RFC 822, August 1982. + + [RFC 1321] Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321, + April 1992. + + [RFC 2047] Moore, K., "MIME (Multipurpose Internet Mail Extensions) + Part Three: Message Header Extensions for Non-ASCII Text", + RFC 2047, November 1996. + + [RFC 2052] Gulbrandsen, A. and P. Vixie, "A DNS RR for specifying the + location of services (DNS SRV)", RFC 2052, October 1996. + + [RFC 2060] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, December 1996. + + [RFC 2104] Krawczyk, H., Bellare, M. and R. Canetti, "HMAC: Keyed- + Hashing for Message Authentication", RFC 2104, February + 1997. + + [RFC 2195] Klensin, J., Catoe, R. and P. Krumviede, "IMAP/POP + AUTHorize Extension for Simple Challenge/Response", RFC + 2195, September 1997. + + + + + + +Leach & Newman Standards Track [Page 20] + +RFC 2831 Digest SASL Mechanism May 2000 + + + [RFC 2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [RFC 2222] Myers, J., "Simple Authentication and Security Layer + (SASL)", RFC 2222, October 1997. + + [USASCII] US-ASCII. Coded Character Set - 7-Bit American Standard + Code for Information Interchange. Standard ANSI X3.4-1986, + ANSI, 1986. + +6 Authors' Addresses + + Paul Leach + Microsoft + 1 Microsoft Way + Redmond, WA 98052 + + EMail: paulle@microsoft.com + + + Chris Newman + Innosoft International, Inc. + 1050 Lakes Drive + West Covina, CA 91790 USA + + EMail: chris.newman@innosoft.com + +7 ABNF + + What follows is the definition of the notation as is used in the + HTTP/1.1 specification (RFC 2616) and the HTTP authentication + specification (RFC 2617); it is reproduced here for ease of + reference. Since it is intended that a single Digest implementation + can support both HTTP and SASL-based protocols, the same notation is + used in both to facilitate comparison and prevention of unwanted + differences. Since it is cut-and-paste from the HTTP specifications, + not all productions may be used in this specification. It is also not + quite legal ABNF; again, the errors were copied from the HTTP + specifications. + +7.1 Augmented BNF + + All of the mechanisms specified in this document are described in + both prose and an augmented Backus-Naur Form (BNF) similar to that + used by RFC 822 [RFC 822]. Implementers will need to be familiar with + the notation in order to understand this specification. + + + + + +Leach & Newman Standards Track [Page 21] + +RFC 2831 Digest SASL Mechanism May 2000 + + + The augmented BNF includes the following constructs: + + name = definition + The name of a rule is simply the name itself (without any + enclosing "<" and ">") and is separated from its definition by the + equal "=" character. White space is only significant in that + indentation of continuation lines is used to indicate a rule + definition that spans more than one line. Certain basic rules are + in uppercase, such as SP, LWS, HT, CRLF, DIGIT, ALPHA, etc. Angle + brackets are used within definitions whenever their presence will + facilitate discerning the use of rule names. + + "literal" + Quotation marks surround literal text. Unless stated otherwise, + the text is case-insensitive. + + rule1 | rule2 + Elements separated by a bar ("|") are alternatives, e.g., "yes | + no" will accept yes or no. + + (rule1 rule2) + Elements enclosed in parentheses are treated as a single element. + Thus, "(elem (foo | bar) elem)" allows the token sequences + "elem foo elem" and "elem bar elem". + + *rule + The character "*" preceding an element indicates repetition. The + full form is "*element" indicating at least and at most + occurrences of element. Default values are 0 and infinity so + that "*(element)" allows any number, including zero; "1*element" + requires at least one; and "1*2element" allows one or two. + + [rule] + Square brackets enclose optional elements; "[foo bar]" is + equivalent to "*1(foo bar)". + + N rule + Specific repetition: "(element)" is equivalent to + "*(element)"; that is, exactly occurrences of (element). + Thus 2DIGIT is a 2-digit number, and 3ALPHA is a string of three + alphabetic characters. + + #rule + A construct "#" is defined, similar to "*", for defining lists of + elements. The full form is "#element" indicating at least + and at most elements, each separated by one or more commas + (",") and OPTIONAL linear white space (LWS). This makes the usual + form of lists very easy; a rule such as + + + +Leach & Newman Standards Track [Page 22] + +RFC 2831 Digest SASL Mechanism May 2000 + + + ( *LWS element *( *LWS "," *LWS element )) + can be shown as + 1#element + Wherever this construct is used, null elements are allowed, but do + not contribute to the count of elements present. That is, + "(element), , (element) " is permitted, but counts as only two + elements. Therefore, where at least one element is required, at + least one non-null element MUST be present. Default values are 0 + and infinity so that "#element" allows any number, including zero; + "1#element" requires at least one; and "1#2element" allows one or + two. + + ; comment + A semi-colon, set off some distance to the right of rule text, + starts a comment that continues to the end of line. This is a + simple way of including useful notes in parallel with the + specifications. + + implied *LWS + The grammar described by this specification is word-based. Except + where noted otherwise, linear white space (LWS) can be included + between any two adjacent words (token or quoted-string), and + between adjacent words and separators, without changing the + interpretation of a field. At least one delimiter (LWS and/or + separators) MUST exist between any two tokens (for the definition + of "token" below), since they would otherwise be interpreted as a + single token. + +7.2 Basic Rules + + The following rules are used throughout this specification to + describe basic parsing constructs. The US-ASCII coded character set + is defined by ANSI X3.4-1986 [USASCII]. + + OCTET = + CHAR = + UPALPHA = + LOALPHA = + ALPHA = UPALPHA | LOALPHA + DIGIT = + CTL = + CR = + LF = + SP = + HT = + <"> = + CRLF = CR LF + + + +Leach & Newman Standards Track [Page 23] + +RFC 2831 Digest SASL Mechanism May 2000 + + + + All linear white space, including folding, has the same semantics as + SP. A recipient MAY replace any linear white space with a single SP + before interpreting the field value or forwarding the message + downstream. + + LWS = [CRLF] 1*( SP | HT ) + + The TEXT rule is only used for descriptive field contents and values + that are not intended to be interpreted by the message parser. Words + of *TEXT MAY contain characters from character sets other than + ISO-8859-1 [ISO 8859] only when encoded according to the rules of RFC + 2047 [RFC 2047]. + + TEXT = + + A CRLF is allowed in the definition of TEXT only as part of a header + field continuation. It is expected that the folding LWS will be + replaced with a single SP before interpretation of the TEXT value. + + Hexadecimal numeric characters are used in several protocol elements. + + HEX = "A" | "B" | "C" | "D" | "E" | "F" + | "a" | "b" | "c" | "d" | "e" | "f" | DIGIT + + Many HTTP/1.1 header field values consist of words separated by LWS + or special characters. These special characters MUST be in a quoted + string to be used within a parameter value. + + token = 1* + separators = "(" | ")" | "<" | ">" | "@" + | "," | ";" | ":" | "\" | <"> + | "/" | "[" | "]" | "?" | "=" + | "{" | "}" | SP | HT + + A string of text is parsed as a single word if it is quoted using + double-quote marks. + + quoted-string = ( <"> qdstr-val <"> ) + qdstr-val = *( qdtext | quoted-pair ) + qdtext = > + + Note that LWS is NOT implicit between the double-quote marks (<">) + surrounding a qdstr-val and the qdstr-val; any LWS will be considered + part of the qdstr-val. This is also the case for quotation marks + surrounding any other construct. + + + + +Leach & Newman Standards Track [Page 24] + +RFC 2831 Digest SASL Mechanism May 2000 + + + The backslash character ("\") MAY be used as a single-character + quoting mechanism only within qdstr-val and comment constructs. + + quoted-pair = "\" CHAR + + The value of this construct is CHAR. Note that an effect of this rule + is that backslash must be quoted. + +8 Sample Code + + The sample implementation in [Digest] also applies to DIGEST-MD5. + + The following code implements the conversion from UTF-8 to 8859-1 if + necessary. + + /* if the string is entirely in the 8859-1 subset of UTF-8, then + * translate to 8859-1 prior to MD5 + */ + void MD5_UTF8_8859_1(MD5_CTX *ctx, const unsigned char *base, + int len) + { + const unsigned char *scan, *end; + unsigned char cbuf; + + end = base + len; + for (scan = base; scan < end; ++scan) { + if (*scan > 0xC3) break; /* abort if outside 8859-1 */ + if (*scan >= 0xC0 && *scan <= 0xC3) { + if (++scan == end || *scan < 0x80 || *scan > 0xBF) + break; + } + } + /* if we found a character outside 8859-1, don't alter string + */ + if (scan < end) { + MD5Update(ctx, base, len); + return; + } + + /* convert to 8859-1 prior to applying hash + */ + do { + for (scan = base; scan < end && *scan < 0xC0; ++scan) + ; + if (scan != base) MD5Update(ctx, base, scan - base); + if (scan + 1 >= end) break; + cbuf = ((scan[0] & 0x3) << 6) | (scan[1] & 0x3f); + MD5Update(ctx, &cbuf, 1); + + + +Leach & Newman Standards Track [Page 25] + +RFC 2831 Digest SASL Mechanism May 2000 + + + base = scan + 2; + } while (base < end); + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Leach & Newman Standards Track [Page 26] + +RFC 2831 Digest SASL Mechanism May 2000 + + +9 Full Copyright Statement + + Copyright (C) The Internet Society (2000). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + +Leach & Newman Standards Track [Page 27] + diff --git a/doc/specification/rfc2945.txt b/doc/specification/rfc2945.txt new file mode 100644 index 0000000..983c441 --- /dev/null +++ b/doc/specification/rfc2945.txt @@ -0,0 +1,451 @@ + + + + + + +Network Working Group T. Wu +Request for Comments: 2945 Stanford University +Category: Standards Track September 2000 + + + The SRP Authentication and Key Exchange System + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (2000). All Rights Reserved. + +Abstract + + This document describes a cryptographically strong network + authentication mechanism known as the Secure Remote Password (SRP) + protocol. This mechanism is suitable for negotiating secure + connections using a user-supplied password, while eliminating the + security problems traditionally associated with reusable passwords. + This system also performs a secure key exchange in the process of + authentication, allowing security layers (privacy and/or integrity + protection) to be enabled during the session. Trusted key servers + and certificate infrastructures are not required, and clients are not + required to store or manage any long-term keys. SRP offers both + security and deployment advantages over existing challenge-response + techniques, making it an ideal drop-in replacement where secure + password authentication is needed. + +1. Introduction + + The lack of a secure authentication mechanism that is also easy to + use has been a long-standing problem with the vast majority of + Internet protocols currently in use. The problem is two-fold: Users + like to use passwords that they can remember, but most password-based + authentication systems offer little protection against even passive + attackers, especially if weak and easily-guessed passwords are used. + + Eavesdropping on a TCP/IP network can be carried out very easily and + very effectively against protocols that transmit passwords in the + clear. Even so-called "challenge-response" techniques like the one + described in [RFC 2095] and [RFC 1760], which are designed to defeat + + + +Wu Standards Track [Page 1] + +RFC 2945 SRP Authentication & Key Exchange System September 2000 + + + simple sniffing attacks, can be compromised by what is known as a + "dictionary attack". This occurs when an attacker captures the + messages exchanged during a legitimate run of the protocol and uses + that information to verify a series of guessed passwords taken from a + precompiled "dictionary" of common passwords. This works because + users often choose simple, easy-to-remember passwords, which + invariably are also easy to guess. + + Many existing mechanisms also require the password database on the + host to be kept secret because the password P or some private hash + h(P) is stored there and would compromise security if revealed. That + approach often degenerates into "security through obscurity" and goes + against the UNIX convention of keeping a "public" password file whose + contents can be revealed without destroying system security. + + SRP meets the strictest requirements laid down in [RFC 1704] for a + non-disclosing authentication protocol. It offers complete + protection against both passive and active attacks, and accomplishes + this efficiently using a single Diffie-Hellman-style round of + computation, making it feasible to use in both interactive and non- + interactive authentication for a wide range of Internet protocols. + Since it retains its security when used with low-entropy passwords, + it can be seamlessly integrated into existing user applications. + +2. Conventions and Terminology + + The protocol described by this document is sometimes referred to as + "SRP-3" for historical purposes. This particular protocol is + described in [SRP] and is believed to have very good logical and + cryptographic resistance to both eavesdropping and active attacks. + + This document does not attempt to describe SRP in the context of any + particular Internet protocol; instead it describes an abstract + protocol that can be easily fitted to a particular application. For + example, the specific format of messages (including padding) is not + specified. Those issues have been left to the protocol implementor + to decide. + + The one implementation issue worth specifying here is the mapping + between strings and integers. Internet protocols are byte-oriented, + while SRP performs algebraic operations on its messages, so it is + logical to define at least one method by which integers can be + converted into a string of bytes and vice versa. + + An n-byte string S can be converted to an integer as follows: + + i = S[n-1] + 256 * S[n-2] + 256^2 * S[n-3] + ... + 256^(n-1) * S[0] + + + + +Wu Standards Track [Page 2] + +RFC 2945 SRP Authentication & Key Exchange System September 2000 + + + where i is the integer and S[x] is the value of the x'th byte of S. + In human terms, the string of bytes is the integer expressed in base + 256, with the most significant digit first. When converting back to + a string, S[0] must be non-zero (padding is considered to be a + separate, independent process). This conversion method is suitable + for file storage, in-memory representation, and network transmission + of large integer values. Unless otherwise specified, this mapping + will be assumed. + + If implementations require padding a string that represents an + integer value, it is recommended that they use zero bytes and add + them to the beginning of the string. The conversion back to integer + automatically discards leading zero bytes, making this padding scheme + less prone to error. + + The SHA hash function, when used in this document, refers to the + SHA-1 message digest algorithm described in [SHA1]. + +3. The SRP-SHA1 mechanism + + This section describes an implementation of the SRP authentication + and key-exchange protocol that employs the SHA hash function to + generate session keys and authentication proofs. + + The host stores user passwords as triplets of the form + + { , , } + + Password entries are generated as follows: + + = random() + x = SHA( | SHA( | ":" | )) + = v = g^x % N + + The | symbol indicates string concatenation, the ^ operator is the + exponentiation operation, and the % operator is the integer remainder + operation. Most implementations perform the exponentiation and + remainder in a single stage to avoid generating unwieldy intermediate + results. Note that the 160-bit output of SHA is implicitly converted + to an integer before it is operated upon. + + Authentication is generally initiated by the client. + + Client Host + -------- ------ + U = --> + <-- s = + + + + +Wu Standards Track [Page 3] + +RFC 2945 SRP Authentication & Key Exchange System September 2000 + + + Upon identifying himself to the host, the client will receive the + salt stored on the host under his username. + + a = random() + A = g^a % N --> + v = + b = random() + <-- B = (v + g^b) % N + + p = + x = SHA(s | SHA(U | ":" | p)) + + S = (B - g^x) ^ (a + u * x) % N S = (A * v^u) ^ b % N + K = SHA_Interleave(S) K = SHA_Interleave(S) + (this function is described + in the next section) + + The client generates a random number, raises g to that power modulo + the field prime, and sends the result to the host. The host does the + same thing and also adds the public verifier before sending it to the + client. Both sides then construct the shared session key based on + the respective formulae. + + The parameter u is a 32-bit unsigned integer which takes its value + from the first 32 bits of the SHA1 hash of B, MSB first. + + The client MUST abort authentication if B % N is zero. + + The host MUST abort the authentication attempt if A % N is zero. The + host MUST send B after receiving A from the client, never before. + + At this point, the client and server should have a common session key + that is secure (i.e. not known to an outside party). To finish + authentication, they must prove to each other that their keys are + identical. + + M = H(H(N) XOR H(g) | H(U) | s | A | B | K) + --> + <-- H(A | M | K) + + The server will calculate M using its own K and compare it against + the client's response. If they do not match, the server MUST abort + and signal an error before it attempts to answer the client's + challenge. Not doing so could compromise the security of the user's + password. + + + + + + +Wu Standards Track [Page 4] + +RFC 2945 SRP Authentication & Key Exchange System September 2000 + + + If the server receives a correct response, it issues its own proof to + the client. The client will compute the expected response using its + own K to verify the authenticity of the server. If the client + responded correctly, the server MUST respond with its hash value. + + The transactions in this protocol description do not necessarily have + a one-to-one correspondence with actual protocol messages. This + description is only intended to illustrate the relationships between + the different parameters and how they are computed. It is possible, + for example, for an implementation of the SRP-SHA1 mechanism to + consolidate some of the flows as follows: + + Client Host + -------- ------ + U, A --> + <-- s, B + H(H(N) XOR H(g) | H(U) | s | A | B | K) + --> + <-- H(A | M | K) + + The values of N and g used in this protocol must be agreed upon by + the two parties in question. They can be set in advance, or the host + can supply them to the client. In the latter case, the host should + send the parameters in the first message along with the salt. For + maximum security, N should be a safe prime (i.e. a number of the form + N = 2q + 1, where q is also prime). Also, g should be a generator + modulo N (see [SRP] for details), which means that for any X where 0 + < X < N, there exists a value x for which g^x % N == X. + +3.1. Interleaved SHA + + The SHA_Interleave function used in SRP-SHA1 is used to generate a + session key that is twice as long as the 160-bit output of SHA1. To + compute this function, remove all leading zero bytes from the input. + If the length of the resulting string is odd, also remove the first + byte. Call the resulting string T. Extract the even-numbered bytes + into a string E and the odd-numbered bytes into a string F, i.e. + + E = T[0] | T[2] | T[4] | ... + F = T[1] | T[3] | T[5] | ... + + Both E and F should be exactly half the length of T. Hash each one + with regular SHA1, i.e. + + G = SHA(E) + H = SHA(F) + + + + + +Wu Standards Track [Page 5] + +RFC 2945 SRP Authentication & Key Exchange System September 2000 + + + Interleave the two hashes back together to form the output, i.e. + + result = G[0] | H[0] | G[1] | H[1] | ... | G[19] | H[19] + + The result will be 40 bytes (320 bits) long. + +3.2. Other Hash Algorithms + + SRP can be used with hash functions other than SHA. If the hash + function produces an output of a different length than SHA (20 + bytes), it may change the length of some of the messages in the + protocol, but the fundamental operation will be unaffected. + + Earlier versions of the SRP mechanism used the MD5 hash function, + described in [RFC 1321]. Keyed hash transforms are also recommended + for use with SRP; one possible construction uses HMAC [RFC 2104], + using K to key the hash in each direction instead of concatenating it + with the other parameters. + + Any hash function used with SRP should produce an output of at least + 16 bytes and have the property that small changes in the input cause + significant nonlinear changes in the output. [SRP] covers these + issues in more depth. + +4. Security Considerations + + This entire memo discusses an authentication and key-exchange system + that protects passwords and exchanges keys across an untrusted + network. This system improves security by eliminating the need to + send cleartext passwords over the network and by enabling encryption + through its secure key-exchange mechanism. + + The private values for a and b correspond roughly to the private + values in a Diffie-Hellman exchange and have similar constraints of + length and entropy. Implementations may choose to increase the + length of the parameter u, as long as both client and server agree, + but it is not recommended that it be shorter than 32 bits. + + SRP has been designed not only to counter the threat of casual + password-sniffing, but also to prevent a determined attacker equipped + with a dictionary of passwords from guessing at passwords using + captured network traffic. The SRP protocol itself also resists + active network attacks, and implementations can use the securely + exchanged keys to protect the session against hijacking and provide + confidentiality. + + + + + + +Wu Standards Track [Page 6] + +RFC 2945 SRP Authentication & Key Exchange System September 2000 + + + SRP also has the added advantage of permitting the host to store + passwords in a form that is not directly useful to an attacker. Even + if the host's password database were publicly revealed, the attacker + would still need an expensive dictionary search to obtain any + passwords. The exponential computation required to validate a guess + in this case is much more time-consuming than the hash currently used + by most UNIX systems. Hosts are still advised, though, to try their + best to keep their password files secure. + +5. References + + [RFC 1321] Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321, + April 1992. + + [RFC 1704] Haller, N. and R. Atkinson, "On Internet Authentication", + RFC 1704, October 1994. + + [RFC 1760] Haller, N., "The S/Key One-Time Password System", RFC + 1760, Feburary 1995. + + [RFC 2095] Klensin, J., Catoe, R. and P. Krumviede, "IMAP/POP + AUTHorize Extension for Simple Challenge/Response", RFC + 2095, January 1997. + + [RFC 2104] Krawczyk, H., Bellare, M. and R. Canetti, "HMAC: Keyed- + Hashing for Message Authentication", RFC 2104, February + 1997. + + [SHA1] National Institute of Standards and Technology (NIST), + "Announcing the Secure Hash Standard", FIPS 180-1, U.S. + Department of Commerce, April 1995. + + [SRP] T. Wu, "The Secure Remote Password Protocol", In + Proceedings of the 1998 Internet Society Symposium on + Network and Distributed Systems Security, San Diego, CA, + pp. 97-111. + +6. Author's Address + + Thomas Wu + Stanford University + Stanford, CA 94305 + + EMail: tjw@cs.Stanford.EDU + + + + + + + +Wu Standards Track [Page 7] + +RFC 2945 SRP Authentication & Key Exchange System September 2000 + + +7. Full Copyright Statement + + Copyright (C) The Internet Society (2000). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + +Wu Standards Track [Page 8] + diff --git a/doc/specification/rfc3163.txt b/doc/specification/rfc3163.txt new file mode 100644 index 0000000..88f7ba9 --- /dev/null +++ b/doc/specification/rfc3163.txt @@ -0,0 +1,955 @@ + + + + + + +Network Working Group R. Zuccherato +Request for Comments: 3163 Entrust Technologies +Category: Experimental M. Nystrom + RSA Security + August 2001 + + + ISO/IEC 9798-3 Authentication SASL Mechanism + +Status of this Memo + + This memo defines an Experimental Protocol for the Internet + community. It does not specify an Internet standard of any kind. + Discussion and suggestions for improvement are requested. + Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (2001). All Rights Reserved. + +IESG Note + + It is the opinion of the Security Area Directors that this document + defines a mechanism to use a complex system (namely PKI certificates) + for authentication, but then intentionally discards the key benefits + (namely integrity on each transmission). Put another way, it has all + of the pain of implementing a PKI and none of the benefits. We + should not support it in use in Internet protocols. + + The same effect, with the benefits of PKI, can be had by using + TLS/SSL, an existing already standards track protocol. + +Abstract + + This document defines a SASL (Simple Authentication and Security + Layer) authentication mechanism based on ISO/IEC 9798-3 and FIPS PUB + 196 entity authentication. + + + + + + + + + + + + + + +Zuccherato & Nystrom Experimental [Page 1] + +RFC 3163 ISO/IEC 9798-3 Authentication SASL Mechanism August 2001 + + +1. Introduction + +1.1. Overview + + This document defines a SASL [RFC2222] authentication mechanism based + on ISO/IEC 9798-3 [ISO3] and FIPS PUB 196 [FIPS] entity + authentication. + + This mechanism only provides authentication using X.509 certificates + [X509]. It has no effect on the protocol encodings and does not + provide integrity or confidentiality services. + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in RFC 2119 [RFC2119]. + + The key benefit of asymmetric (public key) security, is that the + secret (private key) only needs to be placed with the entity that is + being authenticated. Thus, a private key can be issued to a client, + which can then be authenticated by ANY server based on a token + generated by the client and the generally available public key. + Symmetric authentication mechanisms (password mechanisms such as + CRAM-MD5 [RFC2195]) require a shared secret, and the need to maintain + it at both endpoints. This means that a secret key for the client + needs to be maintained at every server that may need to authenticate + the client. + + The service described in this memo provides authentication only. + There are a number of places where an authentication only service is + useful, e.g., where confidentiality and integrity are provided by + lower layers, or where confidentiality or integrity services are + provided by the application. + +1.2. Relationship to TLS + + The functionality defined here can be provided by TLS, and it is + important to consider why it is useful to have it in both places. + There are several reasons for this, e.g.: + + - Simplicity. This mechanism is simpler than TLS. If there is + only a requirement for this functionality (as distinct from all + of TLS), this simplicity will facilitate deployment. + + - Layering. The SASL mechanism to establish authentication works + cleanly with most protocols. This mechanism can fit more + cleanly than TLS for some protocols. + + + + + +Zuccherato & Nystrom Experimental [Page 2] + +RFC 3163 ISO/IEC 9798-3 Authentication SASL Mechanism August 2001 + + + - Proxies. In some architectures the endpoint of the TLS session + may not be the application endpoint. In these situations, this + mechanism can be used to obtain end-to-end authentication. + + - Upgrade of authentication. In some applications it may not be + clear at the time of TLS session negotiation what type of + authentication may be required (e.g., anonymous, server, + client-server). This mechanism allows the negotiation of an + anonymous or server authenticated TLS session which can, at a + later time, be upgraded to provide the desired level of + authentication. + +2. Description of Mechanism + +2.1. Scope + + The mechanism described in this memo provides either mutual or + unilateral entity authentication as defined in ISO/IEC 9798-1 [ISO1] + using an asymmetric (public-key) digital signature mechanism. + +2.2. Authentication modes + + This SASL mechanism contains two authentication modes: + + - Unilateral client authentication: The client digitally signs a + challenge from the server, thus authenticating itself to the + server. + + - Mutual authentication: The client digitally signs a challenge + from the server and the server digitally signs a challenge from + the client. Thus both the client and server authenticate each + other. + +2.3. SASL key + + This mechanism has two SASL keys corresponding to the two different + modes: + + - "9798-U-" for unilateral client authentication. + + - "9798-M-" for mutual authentication. + + Each SASL key may be used with a list of algorithms. A list of + supported algorithms is given in Section 4. + + + + + + + +Zuccherato & Nystrom Experimental [Page 3] + +RFC 3163 ISO/IEC 9798-3 Authentication SASL Mechanism August 2001 + + +2.4. Unilateral Client Authentication + + This section gives a brief description of the steps that are + performed for unilateral client authentication. The actual data + structures are described fully in Section 3. + + a) The server generates a random challenge value R_B and sends it + to the client. + + b) The client generates a random value R_A and creates a token + TokenAB. The token contains R_A, the client's certificate and + also a digital signature created by the client over both R_A + and R_B. Optionally, it also contains an identifier for the + server. + + c) The client sends the token to the server. + + d) The server verifies the token by: + + - verifying the client's signature in TokenAB (this includes + full certificate path processing as described in [RFC2459]), + + - verifying that the random number R_B, sent to the client in + Step 1, agrees with the random number contained in the + signed data of TokenAB, and + + - verifying that the identifier for the server, if present, + matches the server's distinguishing identifier. + +2.5. Mutual Authentication + + This section gives a brief description of the steps that are + performed for mutual authentication. The actual data structures are + described fully in Section 3. + + a) The server generates a random challenge value R_B and sends it + to the client. + + b) The client generates a random value R_A and creates a token + TokenAB. The token contains R_A, the client's certificate and + also a digital signature created by the client over both R_A + and R_B. Optionally, it also contains an identifier for the + server. + + c) The client sends the token to the server. + + d) The server verifies the token by: + + + + +Zuccherato & Nystrom Experimental [Page 4] + +RFC 3163 ISO/IEC 9798-3 Authentication SASL Mechanism August 2001 + + + - verifying the client's signature in TokenAB (this includes + full certificate path processing as described in [RFC2459]), + + - verifying that the random number R_B, sent to the client in + Step 1, agrees with the random number contained in the + signed data of TokenAB, and + + - verifying that the identifier for the server, if present, + matches the server's distinguishing identifier. + + e) The server creates a token TokenBA. The token contains a third + random value R_C, the server's certificate and a digital + signature created by the server over R_A, R_B and R_C. + Optionally, it also contains an identifier for the client. + + f) The server sends the token to the client. + + g) The client verifies the token by: + + - verifying the server's signature in TokenBA (this includes + full certificate path processing as described in [RFC2459]), + + - verifying that the random number R_B, received by the client + in Step 1, agrees with the random number contained in the + signed data of TokenBA, + + - verifying that the random number R_A, sent to the server in + Step 2, agrees with the random number contained in the + signed data of Token BA and + + - verifying that the identifier for the client, if present, + matches the client's distinguishing identifier. + +3. Token and Message Definition + + Note - Protocol data units (PDUs) SHALL be DER-encoded [X690] + before transmitted. + +3.1. The "TokenBA1" PDU + + TokenBA1 is used in both the unilateral client authentication and + mutual authentication modes and is sent by the server to the client. + + TokenBA1 contains a random value, and, optionally, the servers name + and certificate information. + + + + + + +Zuccherato & Nystrom Experimental [Page 5] + +RFC 3163 ISO/IEC 9798-3 Authentication SASL Mechanism August 2001 + + + TokenBA1 ::= SEQUENCE { + randomB RandomNumber, + entityB [0] GeneralNames OPTIONAL, + certPref [1] SEQUENCE SIZE (1..MAX) OF TrustedAuth OPTIONAL + } + +3.2. The "TokenAB" PDU + + TokenAB is used in the unilateral client authentication and mutual + authentication modes and is sent by the client to the server. + TokenAB contains a random number, entity B's name (optionally), + entity certification information, an (optional) authorization + identity, and a signature of a DER-encoded value of type TBSDataAB. + The certA field is used to send the client's X.509 certificate (or a + URL to it) and a related certificate chain to the server. + + The authID field is to be used when the identity to be used for + access control is different than the identity contained in the + certificate of the signer. If this field is not present, then the + identity from the client's X.509 certificate shall be used. + + TokenAB ::= SEQUENCE { + randomA RandomNumber, + entityB [0] GeneralNames OPTIONAL, + certA [1] CertData, + authID [2] GeneralNames OPTIONAL, + signature SIGNATURE { TBSDataAB } + + }(CONSTRAINED BY {-- The entityB and authID fields shall be included + -- in TokenAB if and only if they are also included in TBSDataAB. + -- The entityB field SHOULD be present in TokenAB whenever the + -- client believes it knows the identity of the server.--}) + + TBSDataAB ::= SEQUENCE { + randomA RandomNumber, + randomB RandomNumber, + entityB [0] GeneralNames OPTIONAL, + authID [1] GeneralNames OPTIONAL + } + +3.3. The "TokenBA2" PDU + + TokenBA2 is used in the mutual authentication mode and is sent by the + server to the client. TokenBA2 contains a random number, entity A's + name (optionally), certification information, and a signature of a + DER-encoded value of type TBSDataBA. The certB field is to be used + to send the server's X.509 certificate and a related certificate + chain to the client. + + + +Zuccherato & Nystrom Experimental [Page 6] + +RFC 3163 ISO/IEC 9798-3 Authentication SASL Mechanism August 2001 + + + TokenBA2 ::= SEQUENCE { + randomC RandomNumber, + entityA [0] GeneralNames OPTIONAL, + certB [1] CertData, + signature SIGNATURE { TBSDataBA } + }(CONSTRAINED BY {-- The entityA field shall be included in TokenBA2 + -- if and only if it is also included in TBSDataBA. The entityA + -- field SHOULD be present and MUST contain the client's name + -- from their X.509 certificate.--}) + + TBSDataBA ::= SEQUENCE { + randomB RandomNumber, + randomA RandomNumber, + randomC RandomNumber, + entityA GeneralNames OPTIONAL + } + +3.4. The "TrustedAuth" type + + TrustedAuth ::= CHOICE { + authorityName [0] Name, + -- SubjectName from CA certificate + issuerNameHash [1] OCTET STRING, + -- SHA-1 hash of Authority's DN + issuerKeyHash [2] OCTET STRING, + -- SHA-1 hash of Authority's public key + authorityCertificate [3] Certificate, + -- CA certificate + pkcs15KeyHash [4] OCTET STRING + -- PKCS #15 key hash + } + + The TrustedAuth type can be used by a server in its initial message + ("TokenBA1") to indicate to a client preferred certificates/public + key pairs to use in the authentication. + + A trusted authority is identified by its name, hash of its name, hash + of its public key, its certificate, or PKCS #15 key hash. If + identified by its name, then the authorityName field in TrustedAuth + contains the SubjectName of its CA certificate. If it is identified + by the hash of its name then the issuerNameHash field contains the + SHA-1 hash of the DER encoding of SubjectName from its CA + certificate. If it is identified by the hash of its public key then + the issuerKeyHash field contains the SHA-1 hash of the authority's + public key. The hash shall be calculated over the value (excluding + tag and length) of the subject public key field in the issuer's + certificate. If it is identified by its certificate then the + authorityCertificate field contains its CA certificate. If it is + + + +Zuccherato & Nystrom Experimental [Page 7] + +RFC 3163 ISO/IEC 9798-3 Authentication SASL Mechanism August 2001 + + + identified by the PKCS #15 key hash then the pkcs15KeyHash field + contains the hash of the CA's public key as defined in PKCS #15 + [PKCS15] Section 6.1.4. + +3.5. The "CertData" type + + The certification data is a choice between a set of certificates and + a certificate URL. + + The certificate set alternative is as in [RFC2630], meaning it is + intended that the set be sufficient to contain chains from a + recognized "root" or "top-level certification authority" to all of + the sender certificates with which the set is associated. However, + there may be more certificates than necessary, or there may be fewer + than necessary. + + Note - The precise meaning of a "chain" is outside the scope of + this document. Some applications may impose upper limits on + the length of a chain; others may enforce certain + relationships between the subjects and issuers of + certificates within a chain. + + When the certURL type is used to specify the location at which the + user's certificate can be found, it MUST be a non-relative URL, and + MUST follow the URL syntax and encoding rules specified in [RFC1738]. + The URL must include both a scheme (e.g., "http" or "ldap") and a + scheme-specific part. The scheme-specific part must include a fully + qualified domain name or IP address as the host. + + CertData ::= CHOICE { + certificateSet SET SIZE (1..MAX) OF Certificate, + certURL IA5String, + ... -- For future extensions + } + +3.6. The "RandomNumber" type + + A random number is simply defined as an octet string, at least 8 + bytes long. + + RandomNumber ::= OCTET STRING (SIZE(8..MAX)) + +3.7. The "SIGNATURE" type + + This is similar to the "SIGNED" parameterized type defined in + [RFC2459], the difference being that the "SIGNATURE" type does not + include the data to be signed. + + + + +Zuccherato & Nystrom Experimental [Page 8] + +RFC 3163 ISO/IEC 9798-3 Authentication SASL Mechanism August 2001 + + + SIGNATURE { ToBeSigned } ::= SEQUENCE { + algorithm AlgorithmIdentifier, + signature BIT STRING + }(CONSTRAINED BY {-- Must be the result of applying the signing + -- operation indicated in "algorithm" to the DER-encoded octets of + -- a value of type -- ToBeSigned }) + +3.8. Other types + + The "GeneralNames" type is defined in [RFC2459]. + +4. Supported Algorithms + + The following signature algorithms are recognized for use with this + mechanism, and identified by a key. Each key would be combined to + make two possible SASL mechanisms. For example the DSA-SHA1 + algorithm would give 9798-U-DSA-SHA1, and 9798-M-DSA-SHA1. All + algorithm names are constrained to 13 characters, to keep within the + total SASL limit of 20 characters. + + The following table gives a list of algorithm keys, noting the object + identifier and the body that assigned the identifier. + + Key Object Id Body + RSA-SHA1-ENC 1.2.840.113549.1.1.5 RSA + DSA-SHA1 1.2.840.10040.4.3 ANSI + ECDSA-SHA1 1.2.840.10045.4.1 ANSI + + Support of the RSA-SHA1-ENC algorithm is RECOMMENDED for use with + this mechanism. + +5. Examples + +5.1. IMAP4 example + + The following example shows the use of the ISO/IEC 9798-3 + Authentication SASL mechanism with IMAP4 [RFC2060]. + + The base64 encoding of challenges and responses, as well as the "+ " + preceding the responses are part of the IMAP4 profile, not part of + this specification itself (note that the line breaks in the sample + authenticators are for editorial clarity and are not in real + authenticators). + + + + + + + + +Zuccherato & Nystrom Experimental [Page 9] + +RFC 3163 ISO/IEC 9798-3 Authentication SASL Mechanism August 2001 + + + S: * OK IMAP4 server ready + C: A001 AUTHENTICATE 9798-U-RSA-SHA1 + S: + MAoECBI4l1h5h0eY + C: MIIBAgQIIxh5I0h5RYegD4INc2FzbC1yLXVzLmNvbaFPFk1odHRwOi8vY2VydHMt + ci11cy5jb20vY2VydD9paD1odmNOQVFFRkJRQURnWUVBZ2hBR2hZVFJna0ZqJnNu + PUVQOXVFbFkzS0RlZ2pscjCBkzANBgkqhkiG9w0BAQUFAAOBgQCkuC2GgtYcxGG1 + NEzLA4bh5lqJGOZySACMmc+mDrV7A7KAgbpO2OuZpMCl7zvNt/L3OjQZatiX8d1X + buQ40l+g2TJzJt06o7ogomxdDwqlA/3zp2WMohlI0MotHmfDSWEDZmEYDEA3/eGg + kWyi1v1lEVdFuYmrTr8E4wE9hxdQrA== + S: A001 OK Welcome, 9798-U-RSA-SHA1 authenticated user: Magnus + +6. IANA Considerations + + By registering the 9798-- protocols as SASL + mechanisms, implementers will have a well-defined way of adding this + authentication mechanism to their product. Here is the registration + template for the SASL mechanisms defined in this memo: + + SASL mechanism names: 9798-U-RSA-SHA1-ENC + 9798-M-RSA-SHA1-ENC + 9798-U-DSA-SHA1 + 9798-M-DSA-SHA1 + 9798-U-ECDSA-SHA1 + 9798-M-ECDSA-SHA1 + ; For a definition of the algorithms + see Section 4 of this memo. + + Security Considerations: See Section 7 of this memo + Published specification: This memo + Person & email address to + contact for further + information: See Section 9 of this memo. + Intended usage: COMMON + Author/Change controller: See Section 9 of this memo. + +7. Security Considerations + + The mechanisms described in this memo only provides protection + against passive eavesdropping attacks. They do not provide session + privacy or protection from active attacks. In particular, man-in- + the-middle attacks aimed at session "hi-jacking" are possible. + + The random numbers used in this protocol MUST be generated by a + cryptographically strong random number generator. If the number is + chosen from a small set or is otherwise predictable by a third party, + then this mechanism can be attacked. + + + + + +Zuccherato & Nystrom Experimental [Page 10] + +RFC 3163 ISO/IEC 9798-3 Authentication SASL Mechanism August 2001 + + + The inclusion of the random number R_A in the signed part of TokenAB + prevents the server from obtaining the signature of the client on + data chosen by the server prior to the start of the authentication + mechanism. This measure may be required, for example, when the same + key is used by the client for purposes other than entity + authentication. However, the inclusion of R_B in TokenBA2, whilst + necessary for security reasons which dictate that the client should + check that it is the same as the value sent in the first message, may + not offer the same protection to the server, since R_B is known to + the client before R_A is chosen. For this reason a third random + number, R_C, is included in the TokenBA2 PDU. + +8. Bibliography + + [FIPS] FIPS 196, "Entity authentication using public key + cryptography," Federal Information Processing Standards + Publication 196, U.S. Department of Commerce/N.I.S.T., + National Technical Information Service, Springfield, + Virginia, 1997. + + [ISO1] ISO/IEC 9798-1: 1997, Information technology - Security + techniques - Entity authentication - Part 1: General. + + [ISO3] ISO/IEC 9798-3: 1997, Information technology - Security + techniques - Entity authentication - Part 3: Mechanisms + using digital signature techniques. + + [PKCS15] RSA Laboratories, "The Public-Key Cryptography Standards + - PKCS #15 v1.1: Cryptographic token information syntax + standard", June 6, 2000. + + [RFC1738] Berners-Lee, T., Masinter L. and M. McCahill "Uniform + Resource Locators (URL)", RFC 1738, December 1994. + + [RFC2026] Bradner, S., "The Internet Standards Process -- Revision + 3", BCP 9, RFC 2026, October 1996. + + [RFC2060] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, December 1996. + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [RFC2195] Klensin, J., Catoe, R. and P. Krumviede "IMAP/POP + AUTHorize Extension for Simple Challenge/Response", RFC + 2195, September 1997. + + + + + +Zuccherato & Nystrom Experimental [Page 11] + +RFC 3163 ISO/IEC 9798-3 Authentication SASL Mechanism August 2001 + + + [RFC2222] J. Meyers, "Simple Authentication and Security Layer", + RFC 2222, October 1997. + + [RFC2459] Housley, R., Ford, W., Polk, W. and D. Solo "Internet + X.509 Public Key Infrastructure: X.509 Certificate and + CRL Profile", RFC 2459, January 1999. + + [RFC2630] R. Housley, "Cryptographic Message Syntax", RFC 2630, + June 1999. + + [X509] ITU-T Recommendation X.509 (1997) | ISO/IEC 9594-8:1998, + Information Technology - Open Systems Interconnection - + The Directory: Authentication Framework. + + [X690] ITU-T Recommendation X.690 (1997) | ISO/IEC 8825-1:1998, + Information Technology - ASN.1 Encoding Rules: + Specification of Basic Encoding Rules (BER), Canonical + Encoding Rules (CER) and Distinguished Encoding Rules + (DER). + +9. Authors' Addresses + + Robert Zuccherato + Entrust Technologies + 1000 Innovation Drive + Ottawa, Ontario + Canada K2K 3E7 + + Phone: +1 613 247 2598 + EMail: robert.zuccherato@entrust.com + + + Magnus Nystrom + RSA Security + Box 10704 + 121 29 Stockholm + Sweden + + Phone: +46 8 725 0900 + EMail: magnus@rsasecurity.com + + + + + + + + + + + +Zuccherato & Nystrom Experimental [Page 12] + +RFC 3163 ISO/IEC 9798-3 Authentication SASL Mechanism August 2001 + + +APPENDICES + +A. ASN.1 modules + +A.1. 1988 ASN.1 module + + SASL-9798-3-1988 + + DEFINITIONS IMPLICIT TAGS ::= + + BEGIN + + -- EXPORTS ALL -- + + IMPORTS + + Name, AlgorithmIdentifier, Certificate + FROM PKIX1Explicit88 {iso(1) identified-organization(3) dod(6) + internet(1) security(5) mechanisms(5) pkix(7) id-mod(0) + id-pkix1-explicit-88(1)} + + GeneralNames + FROM PKIX1Implicit88 {iso(1) identified-organization(3) dod(6) + internet(1) security(5) mechanisms(5) pkix(7) id-mod(0) + id-pkix1-implicit-88(2)}; + + TokenBA1 ::= SEQUENCE { + randomB RandomNumber, + entityB [0] GeneralNames OPTIONAL, + certPref [1] SEQUENCE SIZE (1..MAX) OF TrustedAuth OPTIONAL + } + + TokenAB ::= SEQUENCE { + randomA RandomNumber, + entityB [0] GeneralNames OPTIONAL, + certA [1] CertData, + authID [2] GeneralNames OPTIONAL, + signature SEQUENCE { + algorithm AlgorithmIdentifier, + signature BIT STRING + } + } -- The entityB and authID fields shall be included in TokenAB + -- if and only if they are also included in TBSDataAB. The entityB + -- field SHOULD be present in TokenAB whenever the client + -- believes it knows the identity of the server. + -- The signature operation shall be done on a + -- DER-encoded value of type TBSDataAB. + + + + +Zuccherato & Nystrom Experimental [Page 13] + +RFC 3163 ISO/IEC 9798-3 Authentication SASL Mechanism August 2001 + + + TBSDataAB ::= SEQUENCE { + randomA RandomNumber, + randomB RandomNumber, + entityB [0] GeneralNames OPTIONAL, + authID [1] GeneralNames OPTIONAL + } + + TokenBA2 ::= SEQUENCE { + randomC RandomNumber, + entityA [0] GeneralNames OPTIONAL, + certB [1] CertData, + signature SEQUENCE { + algorithm AlgorithmIdentifier, + signature BIT STRING + } + } -- The entityA field shall be included in TokenBA2 + -- if and only if it is also included in TBSDataBA. The entityA + -- field SHOULD be present and MUST contain the client's name + -- from their X.509 certificate. The signature shall be done + -- on a DER-encoded value of type TBSDataBA. + + TBSDataBA ::= SEQUENCE { + randomB RandomNumber, + randomA RandomNumber, + randomC RandomNumber, + entityA GeneralNames OPTIONAL + } + + TrustedAuth ::= CHOICE { + authorityName [0] Name, + -- SubjectName from CA certificate + issuerNameHash [1] OCTET STRING, + -- SHA-1 hash of Authority's DN + issuerKeyHash [2] OCTET STRING, + -- SHA-1 hash of Authority's public key + authorityCertificate [3] Certificate, + -- CA certificate + pkcs15KeyHash [4] OCTET STRING + -- PKCS #15 key hash + } + + CertData ::= CHOICE { + certificateSet SET SIZE (1..MAX) OF Certificate, + certURL IA5String + } + + RandomNumber ::= OCTET STRING (SIZE(8..MAX)) + + + + +Zuccherato & Nystrom Experimental [Page 14] + +RFC 3163 ISO/IEC 9798-3 Authentication SASL Mechanism August 2001 + + + END + +A.2. 1997 ASN.1 module + + SASL-9798-3-1997 + + DEFINITIONS IMPLICIT TAGS ::= + + BEGIN + + -- EXPORTS ALL -- + + IMPORTS + + AlgorithmIdentifier, Name, Certificate + FROM PKIX1Explicit93 {iso(1) identified-organization(3) dod(6) + internet(1) security(5) mechanisms(5) pkix(7) id-mod(0) + id-pkix1-explicit-93(3)} + + GeneralNames + FROM PKIX1Implicit93 {iso(1) identified-organization(3) dod(6) + internet(1) security(5) mechanisms(5) pkix(7) id-mod(0) + id-pkix1-implicit-93(4)}; + + TokenBA1 ::= SEQUENCE { + randomB RandomNumber, + entityB [0] GeneralNames OPTIONAL, + certPref [1] SEQUENCE SIZE (1..MAX) OF TrustedAuth OPTIONAL + } + + TokenAB ::= SEQUENCE { + randomA RandomNumber, + entityB [0] GeneralNames OPTIONAL, + certA [1] CertData, + authID [2] GeneralNames OPTIONAL, + signature SIGNATURE { TBSDataAB } + }(CONSTRAINED BY {-- The entityB and authID fields shall be included + -- in TokenAB if and only if they are also included in TBSDataAB. + -- The entityB field SHOULD be present in TokenAB whenever the + -- client believes it knows the identity of the server.--}) + + TBSDataAB ::= SEQUENCE { + randomA RandomNumber, + randomB RandomNumber, + entityB [0] GeneralNames OPTIONAL, + authID [1] GeneralNames OPTIONAL + } + + + + +Zuccherato & Nystrom Experimental [Page 15] + +RFC 3163 ISO/IEC 9798-3 Authentication SASL Mechanism August 2001 + + + TokenBA2 ::= SEQUENCE { + randomC RandomNumber, + entityA [0] GeneralNames OPTIONAL, + certB [1] CertData, + signature SIGNATURE { TBSDataBA } + }(CONSTRAINED BY {-- The entityA field shall be included in TokenBA2 + -- if and only if it is also included in TBSDataBA. The entityA + -- field SHOULD be present and MUST contain the client's name + -- from their X.509 certificate.--}) + + TBSDataBA ::= SEQUENCE { + randomB RandomNumber, + randomA RandomNumber, + randomC RandomNumber, + entityA GeneralNames OPTIONAL + } + + TrustedAuth ::= CHOICE { + authorityName [0] Name, + -- SubjectName from CA certificate + issuerNameHash [1] OCTET STRING, + -- SHA-1 hash of Authority's DN + issuerKeyHash [2] OCTET STRING, + -- SHA-1 hash of Authority's public key + authorityCertificate [3] Certificate, + -- CA certificate + pkcs15KeyHash [4] OCTET STRING + -- PKCS #15 key hash + } + + CertData ::= CHOICE { + certificateSet SET SIZE (1..MAX) OF Certificate, + certURL IA5String, + ... -- For future extensions + } + + RandomNumber ::= OCTET STRING (SIZE(8..MAX)) + + SIGNATURE { ToBeSigned } ::= SEQUENCE { + algorithm AlgorithmIdentifier, + signature BIT STRING + }(CONSTRAINED BY {-- Must be the result of applying the signing + -- operation indicated in "algorithm" to the DER-encoded octets of + -- a value of type -- ToBeSigned }) + + END + + + + + +Zuccherato & Nystrom Experimental [Page 16] + +RFC 3163 ISO/IEC 9798-3 Authentication SASL Mechanism August 2001 + + +Full Copyright Statement + + Copyright (C) The Internet Society (2001). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + +Zuccherato & Nystrom Experimental [Page 17] + diff --git a/doc/specification/rfc3174.txt b/doc/specification/rfc3174.txt new file mode 100644 index 0000000..ebe515d --- /dev/null +++ b/doc/specification/rfc3174.txt @@ -0,0 +1,1235 @@ + + + + + + +Network Working Group D. Eastlake, 3rd +Request for Comments: 3174 Motorola +Category: Informational P. Jones + Cisco Systems + September 2001 + + + US Secure Hash Algorithm 1 (SHA1) + +Status of this Memo + + This memo provides information for the Internet community. It does + not specify an Internet standard of any kind. Distribution of this + memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (2001). All Rights Reserved. + +Abstract + + The purpose of this document is to make the SHA-1 (Secure Hash + Algorithm 1) hash algorithm conveniently available to the Internet + community. The United States of America has adopted the SHA-1 hash + algorithm described herein as a Federal Information Processing + Standard. Most of the text herein was taken by the authors from FIPS + 180-1. Only the C code implementation is "original". + +Acknowledgements + + Most of the text herein was taken from [FIPS 180-1]. Only the C code + implementation is "original" but its style is similar to the + previously published MD4 and MD5 RFCs [RFCs 1320, 1321]. + + The SHA-1 is based on principles similar to those used by Professor + Ronald L. Rivest of MIT when designing the MD4 message digest + algorithm [MD4] and is modeled after that algorithm [RFC 1320]. + + Useful comments from the following, which have been incorporated + herein, are gratefully acknowledged: + + Tony Hansen + Garrett Wollman + + + + + + + + +Eastlake & Jones Informational [Page 1] + +RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001 + + +Table of Contents + + 1. Overview of Contents........................................... 2 + 2. Definitions of Bit Strings and Integers........................ 3 + 3. Operations on Words............................................ 3 + 4. Message Padding................................................ 4 + 5. Functions and Constants Used................................... 6 + 6. Computing the Message Digest................................... 6 + 6.1 Method 1...................................................... 6 + 6.2 Method 2...................................................... 7 + 7. C Code......................................................... 8 + 7.1 .h file....................................................... 8 + 7.2 .c file....................................................... 10 + 7.3 Test Driver................................................... 18 + 8. Security Considerations........................................ 20 + References........................................................ 21 + Authors' Addresses................................................ 21 + Full Copyright Statement.......................................... 22 + +1. Overview of Contents + + NOTE: The text below is mostly taken from [FIPS 180-1] and assertions + therein of the security of SHA-1 are made by the US Government, the + author of [FIPS 180-1], and not by the authors of this document. + + This document specifies a Secure Hash Algorithm, SHA-1, for computing + a condensed representation of a message or a data file. When a + message of any length < 2^64 bits is input, the SHA-1 produces a + 160-bit output called a message digest. The message digest can then, + for example, be input to a signature algorithm which generates or + verifies the signature for the message. Signing the message digest + rather than the message often improves the efficiency of the process + because the message digest is usually much smaller in size than the + message. The same hash algorithm must be used by the verifier of a + digital signature as was used by the creator of the digital + signature. Any change to the message in transit will, with very high + probability, result in a different message digest, and the signature + will fail to verify. + + The SHA-1 is called secure because it is computationally infeasible + to find a message which corresponds to a given message digest, or to + find two different messages which produce the same message digest. + Any change to a message in transit will, with very high probability, + result in a different message digest, and the signature will fail to + verify. + + + + + + +Eastlake & Jones Informational [Page 2] + +RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001 + + + Section 2 below defines the terminology and functions used as + building blocks to form SHA-1. + +2. Definitions of Bit Strings and Integers + + The following terminology related to bit strings and integers will be + used: + + a. A hex digit is an element of the set {0, 1, ... , 9, A, ... , F}. + A hex digit is the representation of a 4-bit string. Examples: 7 + = 0111, A = 1010. + + b. A word equals a 32-bit string which may be represented as a + sequence of 8 hex digits. To convert a word to 8 hex digits each + 4-bit string is converted to its hex equivalent as described in + (a) above. Example: + + 1010 0001 0000 0011 1111 1110 0010 0011 = A103FE23. + + c. An integer between 0 and 2^32 - 1 inclusive may be represented as + a word. The least significant four bits of the integer are + represented by the right-most hex digit of the word + representation. Example: the integer 291 = 2^8+2^5+2^1+2^0 = + 256+32+2+1 is represented by the hex word, 00000123. + + If z is an integer, 0 <= z < 2^64, then z = (2^32)x + y where 0 <= + x < 2^32 and 0 <= y < 2^32. Since x and y can be represented as + words X and Y, respectively, z can be represented as the pair of + words (X,Y). + + d. block = 512-bit string. A block (e.g., B) may be represented as a + sequence of 16 words. + +3. Operations on Words + + The following logical operators will be applied to words: + + a. Bitwise logical word operations + + X AND Y = bitwise logical "and" of X and Y. + + X OR Y = bitwise logical "inclusive-or" of X and Y. + + X XOR Y = bitwise logical "exclusive-or" of X and Y. + + NOT X = bitwise logical "complement" of X. + + + + + +Eastlake & Jones Informational [Page 3] + +RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001 + + + Example: + + 01101100101110011101001001111011 + XOR 01100101110000010110100110110111 + -------------------------------- + = 00001001011110001011101111001100 + + b. The operation X + Y is defined as follows: words X and Y + represent integers x and y, where 0 <= x < 2^32 and 0 <= y < 2^32. + For positive integers n and m, let n mod m be the remainder upon + dividing n by m. Compute + + z = (x + y) mod 2^32. + + Then 0 <= z < 2^32. Convert z to a word, Z, and define Z = X + + Y. + + c. The circular left shift operation S^n(X), where X is a word and n + is an integer with 0 <= n < 32, is defined by + + S^n(X) = (X << n) OR (X >> 32-n). + + In the above, X << n is obtained as follows: discard the left-most + n bits of X and then pad the result with n zeroes on the right + (the result will still be 32 bits). X >> n is obtained by + discarding the right-most n bits of X and then padding the result + with n zeroes on the left. Thus S^n(X) is equivalent to a + circular shift of X by n positions to the left. + +4. Message Padding + + SHA-1 is used to compute a message digest for a message or data file + that is provided as input. The message or data file should be + considered to be a bit string. The length of the message is the + number of bits in the message (the empty message has length 0). If + the number of bits in a message is a multiple of 8, for compactness + we can represent the message in hex. The purpose of message padding + is to make the total length of a padded message a multiple of 512. + SHA-1 sequentially processes blocks of 512 bits when computing the + message digest. The following specifies how this padding shall be + performed. As a summary, a "1" followed by m "0"s followed by a 64- + bit integer are appended to the end of the message to produce a + padded message of length 512 * n. The 64-bit integer is the length + of the original message. The padded message is then processed by the + SHA-1 as n 512-bit blocks. + + + + + + +Eastlake & Jones Informational [Page 4] + +RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001 + + + Suppose a message has length l < 2^64. Before it is input to the + SHA-1, the message is padded on the right as follows: + + a. "1" is appended. Example: if the original message is "01010000", + this is padded to "010100001". + + b. "0"s are appended. The number of "0"s will depend on the original + length of the message. The last 64 bits of the last 512-bit block + are reserved + + for the length l of the original message. + + Example: Suppose the original message is the bit string + + 01100001 01100010 01100011 01100100 01100101. + + After step (a) this gives + + 01100001 01100010 01100011 01100100 01100101 1. + + Since l = 40, the number of bits in the above is 41 and 407 "0"s + are appended, making the total now 448. This gives (in hex) + + 61626364 65800000 00000000 00000000 + 00000000 00000000 00000000 00000000 + 00000000 00000000 00000000 00000000 + 00000000 00000000. + + c. Obtain the 2-word representation of l, the number of bits in the + original message. If l < 2^32 then the first word is all zeroes. + Append these two words to the padded message. + + Example: Suppose the original message is as in (b). Then l = 40 + (note that l is computed before any padding). The two-word + representation of 40 is hex 00000000 00000028. Hence the final + padded message is hex + + 61626364 65800000 00000000 00000000 + 00000000 00000000 00000000 00000000 + 00000000 00000000 00000000 00000000 + 00000000 00000000 00000000 00000028. + + The padded message will contain 16 * n words for some n > 0. + The padded message is regarded as a sequence of n blocks M(1) , + M(2), first characters (or bits) of the message. + + + + + + +Eastlake & Jones Informational [Page 5] + +RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001 + + +5. Functions and Constants Used + + A sequence of logical functions f(0), f(1),..., f(79) is used in + SHA-1. Each f(t), 0 <= t <= 79, operates on three 32-bit words B, C, + D and produces a 32-bit word as output. f(t;B,C,D) is defined as + follows: for words B, C, D, + + f(t;B,C,D) = (B AND C) OR ((NOT B) AND D) ( 0 <= t <= 19) + + f(t;B,C,D) = B XOR C XOR D (20 <= t <= 39) + + f(t;B,C,D) = (B AND C) OR (B AND D) OR (C AND D) (40 <= t <= 59) + + f(t;B,C,D) = B XOR C XOR D (60 <= t <= 79). + + A sequence of constant words K(0), K(1), ... , K(79) is used in the + SHA-1. In hex these are given by + + K(t) = 5A827999 ( 0 <= t <= 19) + + K(t) = 6ED9EBA1 (20 <= t <= 39) + + K(t) = 8F1BBCDC (40 <= t <= 59) + + K(t) = CA62C1D6 (60 <= t <= 79). + +6. Computing the Message Digest + + The methods given in 6.1 and 6.2 below yield the same message digest. + Although using method 2 saves sixty-four 32-bit words of storage, it + is likely to lengthen execution time due to the increased complexity + of the address computations for the { W[t] } in step (c). There are + other computation methods which give identical results. + +6.1 Method 1 + + The message digest is computed using the message padded as described + in section 4. The computation is described using two buffers, each + consisting of five 32-bit words, and a sequence of eighty 32-bit + words. The words of the first 5-word buffer are labeled A,B,C,D,E. + The words of the second 5-word buffer are labeled H0, H1, H2, H3, H4. + The words of the 80-word sequence are labeled W(0), W(1),..., W(79). + A single word buffer TEMP is also employed. + + To generate the message digest, the 16-word blocks M(1), M(2),..., + M(n) defined in section 4 are processed in order. The processing of + each M(i) involves 80 steps. + + + + +Eastlake & Jones Informational [Page 6] + +RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001 + + + Before processing any blocks, the H's are initialized as follows: in + hex, + + H0 = 67452301 + + H1 = EFCDAB89 + + H2 = 98BADCFE + + H3 = 10325476 + + H4 = C3D2E1F0. + + Now M(1), M(2), ... , M(n) are processed. To process M(i), we + proceed as follows: + + a. Divide M(i) into 16 words W(0), W(1), ... , W(15), where W(0) + is the left-most word. + + b. For t = 16 to 79 let + + W(t) = S^1(W(t-3) XOR W(t-8) XOR W(t-14) XOR W(t-16)). + + c. Let A = H0, B = H1, C = H2, D = H3, E = H4. + + d. For t = 0 to 79 do + + TEMP = S^5(A) + f(t;B,C,D) + E + W(t) + K(t); + + E = D; D = C; C = S^30(B); B = A; A = TEMP; + + e. Let H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + + E. + + After processing M(n), the message digest is the 160-bit string + represented by the 5 words + + H0 H1 H2 H3 H4. + +6.2 Method 2 + + The method above assumes that the sequence W(0), ... , W(79) is + implemented as an array of eighty 32-bit words. This is efficient + from the standpoint of minimization of execution time, since the + addresses of W(t-3), ... ,W(t-16) in step (b) are easily computed. + If space is at a premium, an alternative is to regard { W(t) } as a + + + + + +Eastlake & Jones Informational [Page 7] + +RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001 + + + circular queue, which may be implemented using an array of sixteen + 32-bit words W[0], ... W[15]. In this case, in hex let + + MASK = 0000000F. Then processing of M(i) is as follows: + + a. Divide M(i) into 16 words W[0], ... , W[15], where W[0] is the + left-most word. + + b. Let A = H0, B = H1, C = H2, D = H3, E = H4. + + c. For t = 0 to 79 do + + s = t AND MASK; + + if (t >= 16) W[s] = S^1(W[(s + 13) AND MASK] XOR W[(s + 8) AND + MASK] XOR W[(s + 2) AND MASK] XOR W[s]); + + TEMP = S^5(A) + f(t;B,C,D) + E + W[s] + K(t); + + E = D; D = C; C = S^30(B); B = A; A = TEMP; + + d. Let H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + + E. + +7. C Code + + Below is a demonstration implementation of SHA-1 in C. Section 7.1 + contains the header file, 7.2 the C code, and 7.3 a test driver. + +7.1 .h file + +/* + * sha1.h + * + * Description: + * This is the header file for code which implements the Secure + * Hashing Algorithm 1 as defined in FIPS PUB 180-1 published + * April 17, 1995. + * + * Many of the variable names in this code, especially the + * single character names, were used because those were the names + * used in the publication. + * + * Please read the file sha1.c for more information. + * + */ + + + + + +Eastlake & Jones Informational [Page 8] + +RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001 + + +#ifndef _SHA1_H_ +#define _SHA1_H_ + +#include +/* + * If you do not have the ISO standard stdint.h header file, then you + * must typdef the following: + * name meaning + * uint32_t unsigned 32 bit integer + * uint8_t unsigned 8 bit integer (i.e., unsigned char) + * int_least16_t integer of >= 16 bits + * + */ + +#ifndef _SHA_enum_ +#define _SHA_enum_ +enum +{ + shaSuccess = 0, + shaNull, /* Null pointer parameter */ + shaInputTooLong, /* input data too long */ + shaStateError /* called Input after Result */ +}; +#endif +#define SHA1HashSize 20 + +/* + * This structure will hold context information for the SHA-1 + * hashing operation + */ +typedef struct SHA1Context +{ + uint32_t Intermediate_Hash[SHA1HashSize/4]; /* Message Digest */ + + uint32_t Length_Low; /* Message length in bits */ + uint32_t Length_High; /* Message length in bits */ + + /* Index into message block array */ + int_least16_t Message_Block_Index; + uint8_t Message_Block[64]; /* 512-bit message blocks */ + + int Computed; /* Is the digest computed? */ + int Corrupted; /* Is the message digest corrupted? */ +} SHA1Context; + +/* + * Function Prototypes + */ + + + +Eastlake & Jones Informational [Page 9] + +RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001 + + +int SHA1Reset( SHA1Context *); +int SHA1Input( SHA1Context *, + const uint8_t *, + unsigned int); +int SHA1Result( SHA1Context *, + uint8_t Message_Digest[SHA1HashSize]); + +#endif + +7.2 .c file + +/* + * sha1.c + * + * Description: + * This file implements the Secure Hashing Algorithm 1 as + * defined in FIPS PUB 180-1 published April 17, 1995. + * + * The SHA-1, produces a 160-bit message digest for a given + * data stream. It should take about 2**n steps to find a + * message with the same digest as a given message and + * 2**(n/2) to find any two messages with the same digest, + * when n is the digest size in bits. Therefore, this + * algorithm can serve as a means of providing a + * "fingerprint" for a message. + * + * Portability Issues: + * SHA-1 is defined in terms of 32-bit "words". This code + * uses (included via "sha1.h" to define 32 and 8 + * bit unsigned integer types. If your C compiler does not + * support 32 bit unsigned integers, this code is not + * appropriate. + * + * Caveats: + * SHA-1 is designed to work with messages less than 2^64 bits + * long. Although SHA-1 allows a message digest to be generated + * for messages of any number of bits less than 2^64, this + * implementation only works with messages with a length that is + * a multiple of the size of an 8-bit character. + * + */ + + + + + + + + + + +Eastlake & Jones Informational [Page 10] + +RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001 + + +#include "sha1.h" + +/* + * Define the SHA1 circular left shift macro + */ +#define SHA1CircularShift(bits,word) \ + (((word) << (bits)) | ((word) >> (32-(bits)))) + +/* Local Function Prototyptes */ +void SHA1PadMessage(SHA1Context *); +void SHA1ProcessMessageBlock(SHA1Context *); + +/* + * SHA1Reset + * + * Description: + * This function will initialize the SHA1Context in preparation + * for computing a new SHA1 message digest. + * + * Parameters: + * context: [in/out] + * The context to reset. + * + * Returns: + * sha Error Code. + * + */ +int SHA1Reset(SHA1Context *context) +{ + if (!context) + { + return shaNull; + } + + context->Length_Low = 0; + context->Length_High = 0; + context->Message_Block_Index = 0; + + context->Intermediate_Hash[0] = 0x67452301; + context->Intermediate_Hash[1] = 0xEFCDAB89; + context->Intermediate_Hash[2] = 0x98BADCFE; + context->Intermediate_Hash[3] = 0x10325476; + context->Intermediate_Hash[4] = 0xC3D2E1F0; + + context->Computed = 0; + context->Corrupted = 0; + + + + + +Eastlake & Jones Informational [Page 11] + +RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001 + + + return shaSuccess; +} + +/* + * SHA1Result + * + * Description: + * This function will return the 160-bit message digest into the + * Message_Digest array provided by the caller. + * NOTE: The first octet of hash is stored in the 0th element, + * the last octet of hash in the 19th element. + * + * Parameters: + * context: [in/out] + * The context to use to calculate the SHA-1 hash. + * Message_Digest: [out] + * Where the digest is returned. + * + * Returns: + * sha Error Code. + * + */ +int SHA1Result( SHA1Context *context, + uint8_t Message_Digest[SHA1HashSize]) +{ + int i; + + if (!context || !Message_Digest) + { + return shaNull; + } + + if (context->Corrupted) + { + return context->Corrupted; + } + + if (!context->Computed) + { + SHA1PadMessage(context); + for(i=0; i<64; ++i) + { + /* message may be sensitive, clear it out */ + context->Message_Block[i] = 0; + } + context->Length_Low = 0; /* and clear length */ + context->Length_High = 0; + context->Computed = 1; + + + +Eastlake & Jones Informational [Page 12] + +RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001 + + + } + + for(i = 0; i < SHA1HashSize; ++i) + { + Message_Digest[i] = context->Intermediate_Hash[i>>2] + >> 8 * ( 3 - ( i & 0x03 ) ); + } + + return shaSuccess; +} + +/* + * SHA1Input + * + * Description: + * This function accepts an array of octets as the next portion + * of the message. + * + * Parameters: + * context: [in/out] + * The SHA context to update + * message_array: [in] + * An array of characters representing the next portion of + * the message. + * length: [in] + * The length of the message in message_array + * + * Returns: + * sha Error Code. + * + */ +int SHA1Input( SHA1Context *context, + const uint8_t *message_array, + unsigned length) +{ + if (!length) + { + return shaSuccess; + } + + if (!context || !message_array) + { + return shaNull; + } + + if (context->Computed) + { + context->Corrupted = shaStateError; + + + +Eastlake & Jones Informational [Page 13] + +RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001 + + + return shaStateError; + } + + if (context->Corrupted) + { + return context->Corrupted; + } + while(length-- && !context->Corrupted) + { + context->Message_Block[context->Message_Block_Index++] = + (*message_array & 0xFF); + + context->Length_Low += 8; + if (context->Length_Low == 0) + { + context->Length_High++; + if (context->Length_High == 0) + { + /* Message is too long */ + context->Corrupted = 1; + } + } + + if (context->Message_Block_Index == 64) + { + SHA1ProcessMessageBlock(context); + } + + message_array++; + } + + return shaSuccess; +} + +/* + * SHA1ProcessMessageBlock + * + * Description: + * This function will process the next 512 bits of the message + * stored in the Message_Block array. + * + * Parameters: + * None. + * + * Returns: + * Nothing. + * + * Comments: + + + +Eastlake & Jones Informational [Page 14] + +RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001 + + + * Many of the variable names in this code, especially the + * single character names, were used because those were the + * names used in the publication. + * + * + */ +void SHA1ProcessMessageBlock(SHA1Context *context) +{ + const uint32_t K[] = { /* Constants defined in SHA-1 */ + 0x5A827999, + 0x6ED9EBA1, + 0x8F1BBCDC, + 0xCA62C1D6 + }; + int t; /* Loop counter */ + uint32_t temp; /* Temporary word value */ + uint32_t W[80]; /* Word sequence */ + uint32_t A, B, C, D, E; /* Word buffers */ + + /* + * Initialize the first 16 words in the array W + */ + for(t = 0; t < 16; t++) + { + W[t] = context->Message_Block[t * 4] << 24; + W[t] |= context->Message_Block[t * 4 + 1] << 16; + W[t] |= context->Message_Block[t * 4 + 2] << 8; + W[t] |= context->Message_Block[t * 4 + 3]; + } + + for(t = 16; t < 80; t++) + { + W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]); + } + + A = context->Intermediate_Hash[0]; + B = context->Intermediate_Hash[1]; + C = context->Intermediate_Hash[2]; + D = context->Intermediate_Hash[3]; + E = context->Intermediate_Hash[4]; + + for(t = 0; t < 20; t++) + { + temp = SHA1CircularShift(5,A) + + ((B & C) | ((~B) & D)) + E + W[t] + K[0]; + E = D; + D = C; + C = SHA1CircularShift(30,B); + + + +Eastlake & Jones Informational [Page 15] + +RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001 + + + B = A; + A = temp; + } + + for(t = 20; t < 40; t++) + { + temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1]; + E = D; + D = C; + C = SHA1CircularShift(30,B); + B = A; + A = temp; + } + + for(t = 40; t < 60; t++) + { + temp = SHA1CircularShift(5,A) + + ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2]; + E = D; + D = C; + C = SHA1CircularShift(30,B); + B = A; + A = temp; + } + + for(t = 60; t < 80; t++) + { + temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3]; + E = D; + D = C; + C = SHA1CircularShift(30,B); + B = A; + A = temp; + } + + context->Intermediate_Hash[0] += A; + context->Intermediate_Hash[1] += B; + context->Intermediate_Hash[2] += C; + context->Intermediate_Hash[3] += D; + context->Intermediate_Hash[4] += E; + + context->Message_Block_Index = 0; +} + + +/* + * SHA1PadMessage + * + + + +Eastlake & Jones Informational [Page 16] + +RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001 + + + * Description: + * According to the standard, the message must be padded to an even + * 512 bits. The first padding bit must be a '1'. The last 64 + * bits represent the length of the original message. All bits in + * between should be 0. This function will pad the message + * according to those rules by filling the Message_Block array + * accordingly. It will also call the ProcessMessageBlock function + * provided appropriately. When it returns, it can be assumed that + * the message digest has been computed. + * + * Parameters: + * context: [in/out] + * The context to pad + * ProcessMessageBlock: [in] + * The appropriate SHA*ProcessMessageBlock function + * Returns: + * Nothing. + * + */ + +void SHA1PadMessage(SHA1Context *context) +{ + /* + * Check to see if the current message block is too small to hold + * the initial padding bits and length. If so, we will pad the + * block, process it, and then continue padding into a second + * block. + */ + if (context->Message_Block_Index > 55) + { + context->Message_Block[context->Message_Block_Index++] = 0x80; + while(context->Message_Block_Index < 64) + { + context->Message_Block[context->Message_Block_Index++] = 0; + } + + SHA1ProcessMessageBlock(context); + + while(context->Message_Block_Index < 56) + { + context->Message_Block[context->Message_Block_Index++] = 0; + } + } + else + { + context->Message_Block[context->Message_Block_Index++] = 0x80; + while(context->Message_Block_Index < 56) + { + + + +Eastlake & Jones Informational [Page 17] + +RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001 + + + context->Message_Block[context->Message_Block_Index++] = 0; + } + } + + /* + * Store the message length as the last 8 octets + */ + context->Message_Block[56] = context->Length_High >> 24; + context->Message_Block[57] = context->Length_High >> 16; + context->Message_Block[58] = context->Length_High >> 8; + context->Message_Block[59] = context->Length_High; + context->Message_Block[60] = context->Length_Low >> 24; + context->Message_Block[61] = context->Length_Low >> 16; + context->Message_Block[62] = context->Length_Low >> 8; + context->Message_Block[63] = context->Length_Low; + + SHA1ProcessMessageBlock(context); +} + +7.3 Test Driver + + The following code is a main program test driver to exercise the code + in sha1.c. + +/* + * sha1test.c + * + * Description: + * This file will exercise the SHA-1 code performing the three + * tests documented in FIPS PUB 180-1 plus one which calls + * SHA1Input with an exact multiple of 512 bits, plus a few + * error test checks. + * + * Portability Issues: + * None. + * + */ + +#include +#include +#include +#include "sha1.h" + +/* + * Define patterns for testing + */ +#define TEST1 "abc" +#define TEST2a "abcdbcdecdefdefgefghfghighijhi" + + + +Eastlake & Jones Informational [Page 18] + +RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001 + + +#define TEST2b "jkijkljklmklmnlmnomnopnopq" +#define TEST2 TEST2a TEST2b +#define TEST3 "a" +#define TEST4a "01234567012345670123456701234567" +#define TEST4b "01234567012345670123456701234567" + /* an exact multiple of 512 bits */ +#define TEST4 TEST4a TEST4b +char *testarray[4] = +{ + TEST1, + TEST2, + TEST3, + TEST4 +}; +long int repeatcount[4] = { 1, 1, 1000000, 10 }; +char *resultarray[4] = +{ + "A9 99 3E 36 47 06 81 6A BA 3E 25 71 78 50 C2 6C 9C D0 D8 9D", + "84 98 3E 44 1C 3B D2 6E BA AE 4A A1 F9 51 29 E5 E5 46 70 F1", + "34 AA 97 3C D4 C4 DA A4 F6 1E EB 2B DB AD 27 31 65 34 01 6F", + "DE A3 56 A2 CD DD 90 C7 A7 EC ED C5 EB B5 63 93 4F 46 04 52" +}; + +int main() +{ + SHA1Context sha; + int i, j, err; + uint8_t Message_Digest[20]; + + /* + * Perform SHA-1 tests + */ + for(j = 0; j < 4; ++j) + { + printf( "\nTest %d: %d, '%s'\n", + j+1, + repeatcount[j], + testarray[j]); + + err = SHA1Reset(&sha); + if (err) + { + fprintf(stderr, "SHA1Reset Error %d.\n", err ); + break; /* out of for j loop */ + } + + for(i = 0; i < repeatcount[j]; ++i) + { + + + +Eastlake & Jones Informational [Page 19] + +RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001 + + + err = SHA1Input(&sha, + (const unsigned char *) testarray[j], + strlen(testarray[j])); + if (err) + { + fprintf(stderr, "SHA1Input Error %d.\n", err ); + break; /* out of for i loop */ + } + } + + err = SHA1Result(&sha, Message_Digest); + if (err) + { + fprintf(stderr, + "SHA1Result Error %d, could not compute message digest.\n", + err ); + } + else + { + printf("\t"); + for(i = 0; i < 20 ; ++i) + { + printf("%02X ", Message_Digest[i]); + } + printf("\n"); + } + printf("Should match:\n"); + printf("\t%s\n", resultarray[j]); + } + + /* Test some error returns */ + err = SHA1Input(&sha,(const unsigned char *) testarray[1], 1); + printf ("\nError %d. Should be %d.\n", err, shaStateError ); + err = SHA1Reset(0); + printf ("\nError %d. Should be %d.\n", err, shaNull ); + return 0; +} + +8. Security Considerations + + This document is intended to provide convenient open source access by + the Internet community to the United States of America Federal + Information Processing Standard Secure Hash Function SHA-1 [FIPS + 180-1]. No independent assertion of the security of this hash + function by the authors for any particular use is intended. + + + + + + +Eastlake & Jones Informational [Page 20] + +RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001 + + +References + + [FIPS 180-1] "Secure Hash Standard", United States of American, + National Institute of Science and Technology, Federal + Information Processing Standard (FIPS) 180-1, April + 1993. + + [MD4] "The MD4 Message Digest Algorithm," Advances in + Cryptology - CRYPTO '90 Proceedings, Springer-Verlag, + 1991, pp. 303-311. + + [RFC 1320] Rivest, R., "The MD4 Message-Digest Algorithm", RFC + 1320, April 1992. + + [RFC 1321] Rivest, R., "The MD5 Message-Digest Algorithm", RFC + 1321, April 1992. + + [RFC 1750] Eastlake, D., Crocker, S. and J. Schiller, "Randomness + Requirements for Security", RFC 1750, December 1994. + +Authors' Addresses + + Donald E. Eastlake, 3rd + Motorola + 155 Beaver Street + Milford, MA 01757 USA + + Phone: +1 508-634-2066 (h) + +1 508-261-5434 (w) + Fax: +1 508-261-4777 + EMail: Donald.Eastlake@motorola.com + + + Paul E. Jones + Cisco Systems, Inc. + 7025 Kit Creek Road + Research Triangle Park, NC 27709 USA + + Phone: +1 919 392 6948 + EMail: paulej@packetizer.com + + + + + + + + + + + +Eastlake & Jones Informational [Page 21] + +RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001 + + +Full Copyright Statement + + Copyright (C) The Internet Society (2001). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + +Eastlake & Jones Informational [Page 22] + diff --git a/doc/specification/sasl-mechanisms b/doc/specification/sasl-mechanisms new file mode 100644 index 0000000..00ea6a3 --- /dev/null +++ b/doc/specification/sasl-mechanisms @@ -0,0 +1,114 @@ + +SIMPLE AUTHENTICATION AND SECURITY LAYER (SASL) MECHANISMS +---------------------------------------------------------- + +(last updated 2001 August 17) + +The Simple Authentication and Security Layer (SASL) [RFC2222] is a +method for adding authentication support to connection-based +protocols. To use this specification, a protocol includes a command +for identifying and authenticating a user to a server and for +optionally negotiating a security layer for subsequent protocol +interactions. The command has a required argument identifying a SASL +mechanism. + +SASL mechanisms are named by strings, from 1 to 20 characters in +length, consisting of upper-case letters, digits, hyphens, and/or +underscores. SASL mechanism names must be registered with the IANA. +Procedures for registering new SASL mechanisms are given in the +section "Registration procedures" of RFC2222. + + +MECHANISMS OWNER REFERENCE +---------- ----- --------- + +KERBEROS_V4 IESG [RFC2222] + +GSSAPI IESG [RFC2222] + +SKEY (OBSOLETE) IESG [RFC2444] + +EXTERNAL IESG [RFC2222] + +CRAM-MD5 IESG [RFC2195] + +ANONYMOUS IESG [RFC2245] + +OTP IESG [RFC2444] + +GSS-SPNEGO Paul Leach [Leach] + +PLAIN IESG [RFC2595] + +SECURID Magnus Nystrom [RFC2808] + +NTLM Paul Leach [Leach] + +NMAS_LOGIN Mark G. Gayman [Gayman] + +NMAS_AUTHEN Mark G. Gayman [Gayman] + +DIGEST-MD5 IESG [RFC2831] + +9798-U-RSA-SHA1-ENC robert.zuccherato@entrust.com [RFC3163] + +9798-M-RSA-SHA1-ENC robert.zuccherato@entrust.com [RFC3163] + +9798-U-DSA-SHA1 robert.zuccherato@entrust.com [RFC3163] + +9798-M-DSA-SHA1 robert.zuccherato@entrust.com [RFC3163] + +9798-U-ECDSA-SHA1 robert.zuccherato@entrust.com [RFC3163] + +9798-M-ECDSA-SHA1 robert.zuccherato@entrust.com [RFC3163] + + + +References +---------- + +[RFC2222] Myers, J., "Simple Authentication and Security Layer + (SASL)", RFC 2222, Netscape Communications, October 1997. + +[RFC2195] Klensin, J., Catoe, R., Krumviede, P. "IMAP/POP AUTHorize + Extension for Simple Challenge/Response", RFC 2195, MCI, + September 1997. + +[RFC2245] Newman, C., "Anonymous SASL Mechanism", RFC 2245, Innosoft, + November 1997. + +[RFC2444] Newman, C., "The One-Time-Password SASL Mechanism", RFC + 2444, October 1998. + +[RFC2595] Newman, C., "Using TLS with IMAP, POP3 and ACAP", RFC 2595, + Innosoft, June 1999. + +[RFC2808] Nystrom, M., "The SecurID(r) SASL Mechanism", RFC 2808, + April 2000. + +[RFC2831] Leach, P. and C. Newman, "Using Digest Authentication as a + SASL Mechanism", RFC 2831, May 2000. + + +[RFC3163] R. Zuccherato and M. Nystrom, "ISO/IEC 9798-3 Authentication + SASL Mechanism", RFC 3163, August 2001. + + + +People +------ + +[Gayman] Mark G. Gayman, , September 2000. + +[Leach] Paul Leach, , December 1998, June 2000. + +[] + + + + + + + + + diff --git a/intl/ChangeLog b/intl/ChangeLog new file mode 100644 index 0000000..65ec50f --- /dev/null +++ b/intl/ChangeLog @@ -0,0 +1,4 @@ +2002-08-06 GNU + + * Version 0.11.5 released. + diff --git a/intl/Makefile.in b/intl/Makefile.in new file mode 100644 index 0000000..0486dc9 --- /dev/null +++ b/intl/Makefile.in @@ -0,0 +1,337 @@ +# Makefile for directory with message catalog handling in GNU NLS Utilities. +# Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +SHELL = /bin/sh + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +top_builddir = .. +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +transform = @program_transform_name@ +libdir = @libdir@ +includedir = @includedir@ +datadir = @datadir@ +localedir = $(datadir)/locale +gettextsrcdir = $(datadir)/gettext/intl +aliaspath = $(localedir) +subdir = intl + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +mkinstalldirs = $(SHELL) `case "$(MKINSTALLDIRS)" in /*) echo "$(MKINSTALLDIRS)" ;; *) echo "$(top_builddir)/$(MKINSTALLDIRS)" ;; esac` + +l = @INTL_LIBTOOL_SUFFIX_PREFIX@ + +AR = ar +CC = @CC@ +LIBTOOL = @LIBTOOL@ +RANLIB = @RANLIB@ +YACC = @INTLBISON@ -y -d +YFLAGS = --name-prefix=__gettext + +DEFS = -DLOCALEDIR=\"$(localedir)\" -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" \ +-DLIBDIR=\"$(libdir)\" -DIN_LIBINTL @DEFS@ +CPPFLAGS = @CPPFLAGS@ +CFLAGS = @CFLAGS@ +LDFLAGS = @LDFLAGS@ + +COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) + +HEADERS = $(COMHDRS) libgnuintl.h loadinfo.h +COMHDRS = gmo.h gettextP.h hash-string.h plural-exp.h eval-plural.h os2compat.h +SOURCES = $(COMSRCS) intl-compat.c +COMSRCS = bindtextdom.c dcgettext.c dgettext.c gettext.c \ +finddomain.c loadmsgcat.c localealias.c textdomain.c l10nflist.c \ +explodename.c dcigettext.c dcngettext.c dngettext.c ngettext.c plural.y \ +plural-exp.c localcharset.c localename.c osdep.c os2compat.c +OBJECTS = @INTLOBJS@ bindtextdom.$lo dcgettext.$lo dgettext.$lo gettext.$lo \ +finddomain.$lo loadmsgcat.$lo localealias.$lo textdomain.$lo l10nflist.$lo \ +explodename.$lo dcigettext.$lo dcngettext.$lo dngettext.$lo ngettext.$lo \ +plural.$lo plural-exp.$lo localcharset.$lo localename.$lo osdep.$lo +GETTOBJS = intl-compat.$lo +DISTFILES.common = Makefile.in \ +config.charset locale.alias ref-add.sin ref-del.sin $(HEADERS) $(SOURCES) +DISTFILES.generated = plural.c +DISTFILES.normal = VERSION +DISTFILES.gettext = COPYING.LIB-2.0 COPYING.LIB-2.1 libintl.glibc +DISTFILES.obsolete = xopen-msg.sed linux-msg.sed po2tbl.sed.in cat-compat.c \ +COPYING.LIB-2 gettext.h libgettext.h plural-eval.c + +# Libtool's library version information for libintl. +# Before making a gettext release, the gettext maintainer must change this +# according to the libtool documentation, section "Library interface versions". +# Maintainers of other packages that include the intl directory must *not* +# change these values. +LTV_CURRENT=4 +LTV_REVISION=0 +LTV_AGE=2 + +.SUFFIXES: +.SUFFIXES: .c .y .o .lo .sin .sed +.c.o: + $(COMPILE) $< +.c.lo: + $(LIBTOOL) --mode=compile $(COMPILE) $< + +.y.c: + $(YACC) $(YFLAGS) --output $@ $< + rm -f $*.h + +.sin.sed: + sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $< > t-$@ + mv t-$@ $@ + +INCLUDES = -I.. -I. -I$(top_srcdir)/intl + +all: all-@USE_INCLUDED_LIBINTL@ +all-yes: libintl.$la libintl.h charset.alias ref-add.sed ref-del.sed +all-no: all-no-@BUILD_INCLUDED_LIBINTL@ +all-no-yes: libgnuintl.$la +all-no-no: + +libintl.a libgnuintl.a: $(OBJECTS) + rm -f $@ + $(AR) cru $@ $(OBJECTS) + $(RANLIB) $@ + +libintl.la libgnuintl.la: $(OBJECTS) + $(LIBTOOL) --mode=link \ + $(CC) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ \ + $(OBJECTS) @LTLIBICONV@ -lc \ + -version-info $(LTV_CURRENT):$(LTV_REVISION):$(LTV_AGE) \ + -rpath $(libdir) \ + -no-undefined + +libintl.h: libgnuintl.h + cp $(srcdir)/libgnuintl.h libintl.h + +charset.alias: config.charset + $(SHELL) $(srcdir)/config.charset '@host@' > t-$@ + mv t-$@ $@ + +check: all + +# This installation goal is only used in GNU gettext. Packages which +# only use the library should use install instead. + +# We must not install the libintl.h/libintl.a files if we are on a +# system which has the GNU gettext() function in its C library or in a +# separate library. +# If you want to use the one which comes with this version of the +# package, you have to use `configure --with-included-gettext'. +install: install-exec install-data +install-exec: all + if test "$(PACKAGE)" = "gettext" \ + && test '@INTLOBJS@' = '$(GETTOBJS)'; then \ + $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \ + $(INSTALL_DATA) libintl.h $(DESTDIR)$(includedir)/libintl.h; \ + $(LIBTOOL) --mode=install \ + $(INSTALL_DATA) libintl.$la $(DESTDIR)$(libdir)/libintl.$la; \ + else \ + : ; \ + fi + if test '@USE_INCLUDED_LIBINTL@' = yes; then \ + test @GLIBC21@ != no || $(mkinstalldirs) $(DESTDIR)$(libdir); \ + temp=$(DESTDIR)$(libdir)/t-charset.alias; \ + dest=$(DESTDIR)$(libdir)/charset.alias; \ + if test -f $(DESTDIR)$(libdir)/charset.alias; then \ + orig=$(DESTDIR)$(libdir)/charset.alias; \ + sed -f ref-add.sed $$orig > $$temp; \ + $(INSTALL_DATA) $$temp $$dest; \ + rm -f $$temp; \ + else \ + if test @GLIBC21@ = no; then \ + orig=charset.alias; \ + sed -f ref-add.sed $$orig > $$temp; \ + $(INSTALL_DATA) $$temp $$dest; \ + rm -f $$temp; \ + fi; \ + fi; \ + $(mkinstalldirs) $(DESTDIR)$(localedir); \ + test -f $(DESTDIR)$(localedir)/locale.alias \ + && orig=$(DESTDIR)$(localedir)/locale.alias \ + || orig=$(srcdir)/locale.alias; \ + temp=$(DESTDIR)$(localedir)/t-locale.alias; \ + dest=$(DESTDIR)$(localedir)/locale.alias; \ + sed -f ref-add.sed $$orig > $$temp; \ + $(INSTALL_DATA) $$temp $$dest; \ + rm -f $$temp; \ + else \ + : ; \ + fi +install-data: all + if test "$(PACKAGE)" = "gettext"; then \ + $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ + $(INSTALL_DATA) VERSION $(DESTDIR)$(gettextsrcdir)/VERSION; \ + $(INSTALL_DATA) ChangeLog.inst $(DESTDIR)$(gettextsrcdir)/ChangeLog; \ + dists="COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common)"; \ + for file in $$dists; do \ + $(INSTALL_DATA) $(srcdir)/$$file \ + $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + chmod a+x $(DESTDIR)$(gettextsrcdir)/config.charset; \ + dists="$(DISTFILES.generated)"; \ + for file in $$dists; do \ + if test -f $$file; then dir=.; else dir=$(srcdir); fi; \ + $(INSTALL_DATA) $$dir/$$file \ + $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + dists="$(DISTFILES.obsolete)"; \ + for file in $$dists; do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi + +install-strip: install + +installdirs: + if test "$(PACKAGE)" = "gettext" \ + && test '@INTLOBJS@' = '$(GETTOBJS)'; then \ + $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \ + else \ + : ; \ + fi + if test '@USE_INCLUDED_LIBINTL@' = yes; then \ + test @GLIBC21@ != no || $(mkinstalldirs) $(DESTDIR)$(libdir); \ + $(mkinstalldirs) $(DESTDIR)$(localedir); \ + else \ + : ; \ + fi + if test "$(PACKAGE)" = "gettext"; then \ + $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ + else \ + : ; \ + fi + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: + if test "$(PACKAGE)" = "gettext" \ + && test '@INTLOBJS@' = '$(GETTOBJS)'; then \ + rm -f $(DESTDIR)$(includedir)/libintl.h; \ + $(LIBTOOL) --mode=uninstall \ + rm -f $(DESTDIR)$(libdir)/libintl.$la; \ + else \ + : ; \ + fi + if test '@USE_INCLUDED_LIBINTL@' = yes; then \ + if test -f $(DESTDIR)$(libdir)/charset.alias; then \ + temp=$(DESTDIR)$(libdir)/t-charset.alias; \ + dest=$(DESTDIR)$(libdir)/charset.alias; \ + sed -f ref-del.sed $$dest > $$temp; \ + if grep '^# Packages using this file: $$' $$temp > /dev/null; then \ + rm -f $$dest; \ + else \ + $(INSTALL_DATA) $$temp $$dest; \ + fi; \ + rm -f $$temp; \ + fi; \ + if test -f $(DESTDIR)$(localedir)/locale.alias; then \ + temp=$(DESTDIR)$(localedir)/t-locale.alias; \ + dest=$(DESTDIR)$(localedir)/locale.alias; \ + sed -f ref-del.sed $$dest > $$temp; \ + if grep '^# Packages using this file: $$' $$temp > /dev/null; then \ + rm -f $$dest; \ + else \ + $(INSTALL_DATA) $$temp $$dest; \ + fi; \ + rm -f $$temp; \ + fi; \ + else \ + : ; \ + fi + if test "$(PACKAGE)" = "gettext"; then \ + for file in VERSION ChangeLog COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common) $(DISTFILES.generated); do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi + +info dvi: + +$(OBJECTS): ../config.h libgnuintl.h +bindtextdom.$lo dcgettext.$lo dcigettext.$lo dcngettext.$lo dgettext.$lo dngettext.$lo finddomain.$lo gettext.$lo intl-compat.$lo loadmsgcat.$lo localealias.$lo ngettext.$lo textdomain.$lo: gettextP.h gmo.h loadinfo.h +dcigettext.$lo: hash-string.h +explodename.$lo l10nflist.$lo: loadinfo.h +dcigettext.$lo loadmsgcat.$lo plural.$lo plural-exp.$lo: plural-exp.h +dcigettext.$lo: eval-plural.h + +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) + here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES) + +id: ID + +ID: $(HEADERS) $(SOURCES) + here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES) + + +mostlyclean: + rm -f *.a *.la *.o *.lo core core.* + rm -f libintl.h charset.alias ref-add.sed ref-del.sed + rm -f -r .libs _libs + +clean: mostlyclean + +distclean: clean + rm -f Makefile ID TAGS + if test "$(PACKAGE)" = gettext; then \ + rm -f ChangeLog.inst $(DISTFILES.normal); \ + else \ + : ; \ + fi + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + + +# GNU gettext needs not contain the file `VERSION' but contains some +# other files which should not be distributed in other packages. +distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: Makefile + if test "$(PACKAGE)" = gettext; then \ + additional="$(DISTFILES.gettext)"; \ + else \ + additional="$(DISTFILES.normal)"; \ + fi; \ + $(MAKE) $(DISTFILES.common) $(DISTFILES.generated) $$additional; \ + for file in ChangeLog $(DISTFILES.common) $(DISTFILES.generated) $$additional; do \ + if test -f $$file; then dir=.; else dir=$(srcdir); fi; \ + cp -p $$dir/$$file $(distdir); \ + done + +Makefile: Makefile.in ../config.status + cd .. \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/intl/VERSION b/intl/VERSION new file mode 100644 index 0000000..acc8052 --- /dev/null +++ b/intl/VERSION @@ -0,0 +1 @@ +GNU gettext library from gettext-0.11.5 diff --git a/intl/bindtextdom.c b/intl/bindtextdom.c new file mode 100644 index 0000000..d582ce1 --- /dev/null +++ b/intl/bindtextdom.c @@ -0,0 +1,369 @@ +/* Implementation of the bindtextdomain(3) function + Copyright (C) 1995-1998, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif +#include "gettextP.h" + +#ifdef _LIBC +/* We have to handle multi-threaded applications. */ +# include +#else +/* Provide dummy implementation if this is outside glibc. */ +# define __libc_rwlock_define(CLASS, NAME) +# define __libc_rwlock_wrlock(NAME) +# define __libc_rwlock_unlock(NAME) +#endif + +/* The internal variables in the standalone libintl.a must have different + names than the internal variables in GNU libc, otherwise programs + using libintl.a cannot be linked statically. */ +#if !defined _LIBC +# define _nl_default_dirname libintl_nl_default_dirname +# define _nl_domain_bindings libintl_nl_domain_bindings +#endif + +/* Some compilers, like SunOS4 cc, don't have offsetof in . */ +#ifndef offsetof +# define offsetof(type,ident) ((size_t)&(((type*)0)->ident)) +#endif + +/* @@ end of prolog @@ */ + +/* Contains the default location of the message catalogs. */ +extern const char _nl_default_dirname[]; + +/* List with bindings of specific domains. */ +extern struct binding *_nl_domain_bindings; + +/* Lock variable to protect the global data in the gettext implementation. */ +__libc_rwlock_define (extern, _nl_state_lock attribute_hidden) + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define BINDTEXTDOMAIN __bindtextdomain +# define BIND_TEXTDOMAIN_CODESET __bind_textdomain_codeset +# ifndef strdup +# define strdup(str) __strdup (str) +# endif +#else +# define BINDTEXTDOMAIN libintl_bindtextdomain +# define BIND_TEXTDOMAIN_CODESET libintl_bind_textdomain_codeset +#endif + +/* Prototypes for local functions. */ +static void set_binding_values PARAMS ((const char *domainname, + const char **dirnamep, + const char **codesetp)); + +/* Specifies the directory name *DIRNAMEP and the output codeset *CODESETP + to be used for the DOMAINNAME message catalog. + If *DIRNAMEP or *CODESETP is NULL, the corresponding attribute is not + modified, only the current value is returned. + If DIRNAMEP or CODESETP is NULL, the corresponding attribute is neither + modified nor returned. */ +static void +set_binding_values (domainname, dirnamep, codesetp) + const char *domainname; + const char **dirnamep; + const char **codesetp; +{ + struct binding *binding; + int modified; + + /* Some sanity checks. */ + if (domainname == NULL || domainname[0] == '\0') + { + if (dirnamep) + *dirnamep = NULL; + if (codesetp) + *codesetp = NULL; + return; + } + + __libc_rwlock_wrlock (_nl_state_lock); + + modified = 0; + + for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) + { + int compare = strcmp (domainname, binding->domainname); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It is not in the list. */ + binding = NULL; + break; + } + } + + if (binding != NULL) + { + if (dirnamep) + { + const char *dirname = *dirnamep; + + if (dirname == NULL) + /* The current binding has be to returned. */ + *dirnamep = binding->dirname; + else + { + /* The domain is already bound. If the new value and the old + one are equal we simply do nothing. Otherwise replace the + old binding. */ + char *result = binding->dirname; + if (strcmp (dirname, result) != 0) + { + if (strcmp (dirname, _nl_default_dirname) == 0) + result = (char *) _nl_default_dirname; + else + { +#if defined _LIBC || defined HAVE_STRDUP + result = strdup (dirname); +#else + size_t len = strlen (dirname) + 1; + result = (char *) malloc (len); + if (__builtin_expect (result != NULL, 1)) + memcpy (result, dirname, len); +#endif + } + + if (__builtin_expect (result != NULL, 1)) + { + if (binding->dirname != _nl_default_dirname) + free (binding->dirname); + + binding->dirname = result; + modified = 1; + } + } + *dirnamep = result; + } + } + + if (codesetp) + { + const char *codeset = *codesetp; + + if (codeset == NULL) + /* The current binding has be to returned. */ + *codesetp = binding->codeset; + else + { + /* The domain is already bound. If the new value and the old + one are equal we simply do nothing. Otherwise replace the + old binding. */ + char *result = binding->codeset; + if (result == NULL || strcmp (codeset, result) != 0) + { +#if defined _LIBC || defined HAVE_STRDUP + result = strdup (codeset); +#else + size_t len = strlen (codeset) + 1; + result = (char *) malloc (len); + if (__builtin_expect (result != NULL, 1)) + memcpy (result, codeset, len); +#endif + + if (__builtin_expect (result != NULL, 1)) + { + if (binding->codeset != NULL) + free (binding->codeset); + + binding->codeset = result; + binding->codeset_cntr++; + modified = 1; + } + } + *codesetp = result; + } + } + } + else if ((dirnamep == NULL || *dirnamep == NULL) + && (codesetp == NULL || *codesetp == NULL)) + { + /* Simply return the default values. */ + if (dirnamep) + *dirnamep = _nl_default_dirname; + if (codesetp) + *codesetp = NULL; + } + else + { + /* We have to create a new binding. */ + size_t len = strlen (domainname) + 1; + struct binding *new_binding = + (struct binding *) malloc (offsetof (struct binding, domainname) + len); + + if (__builtin_expect (new_binding == NULL, 0)) + goto failed; + + memcpy (new_binding->domainname, domainname, len); + + if (dirnamep) + { + const char *dirname = *dirnamep; + + if (dirname == NULL) + /* The default value. */ + dirname = _nl_default_dirname; + else + { + if (strcmp (dirname, _nl_default_dirname) == 0) + dirname = _nl_default_dirname; + else + { + char *result; +#if defined _LIBC || defined HAVE_STRDUP + result = strdup (dirname); + if (__builtin_expect (result == NULL, 0)) + goto failed_dirname; +#else + size_t len = strlen (dirname) + 1; + result = (char *) malloc (len); + if (__builtin_expect (result == NULL, 0)) + goto failed_dirname; + memcpy (result, dirname, len); +#endif + dirname = result; + } + } + *dirnamep = dirname; + new_binding->dirname = (char *) dirname; + } + else + /* The default value. */ + new_binding->dirname = (char *) _nl_default_dirname; + + new_binding->codeset_cntr = 0; + + if (codesetp) + { + const char *codeset = *codesetp; + + if (codeset != NULL) + { + char *result; + +#if defined _LIBC || defined HAVE_STRDUP + result = strdup (codeset); + if (__builtin_expect (result == NULL, 0)) + goto failed_codeset; +#else + size_t len = strlen (codeset) + 1; + result = (char *) malloc (len); + if (__builtin_expect (result == NULL, 0)) + goto failed_codeset; + memcpy (result, codeset, len); +#endif + codeset = result; + new_binding->codeset_cntr++; + } + *codesetp = codeset; + new_binding->codeset = (char *) codeset; + } + else + new_binding->codeset = NULL; + + /* Now enqueue it. */ + if (_nl_domain_bindings == NULL + || strcmp (domainname, _nl_domain_bindings->domainname) < 0) + { + new_binding->next = _nl_domain_bindings; + _nl_domain_bindings = new_binding; + } + else + { + binding = _nl_domain_bindings; + while (binding->next != NULL + && strcmp (domainname, binding->next->domainname) > 0) + binding = binding->next; + + new_binding->next = binding->next; + binding->next = new_binding; + } + + modified = 1; + + /* Here we deal with memory allocation failures. */ + if (0) + { + failed_codeset: + if (new_binding->dirname != _nl_default_dirname) + free (new_binding->dirname); + failed_dirname: + free (new_binding); + failed: + if (dirnamep) + *dirnamep = NULL; + if (codesetp) + *codesetp = NULL; + } + } + + /* If we modified any binding, we flush the caches. */ + if (modified) + ++_nl_msg_cat_cntr; + + __libc_rwlock_unlock (_nl_state_lock); +} + +/* Specify that the DOMAINNAME message catalog will be found + in DIRNAME rather than in the system locale data base. */ +char * +BINDTEXTDOMAIN (domainname, dirname) + const char *domainname; + const char *dirname; +{ + set_binding_values (domainname, &dirname, NULL); + return (char *) dirname; +} + +/* Specify the character encoding in which the messages from the + DOMAINNAME message catalog will be returned. */ +char * +BIND_TEXTDOMAIN_CODESET (domainname, codeset) + const char *domainname; + const char *codeset; +{ + set_binding_values (domainname, NULL, &codeset); + return (char *) codeset; +} + +#ifdef _LIBC +/* Aliases for function names in GNU C Library. */ +weak_alias (__bindtextdomain, bindtextdomain); +weak_alias (__bind_textdomain_codeset, bind_textdomain_codeset); +#endif diff --git a/intl/config.charset b/intl/config.charset new file mode 100755 index 0000000..4f98b5b --- /dev/null +++ b/intl/config.charset @@ -0,0 +1,466 @@ +#! /bin/sh +# Output a system dependent table of character encoding aliases. +# +# Copyright (C) 2000-2002 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. +# +# The table consists of lines of the form +# ALIAS CANONICAL +# +# ALIAS is the (system dependent) result of "nl_langinfo (CODESET)". +# ALIAS is compared in a case sensitive way. +# +# CANONICAL is the GNU canonical name for this character encoding. +# It must be an encoding supported by libiconv. Support by GNU libc is +# also desirable. CANONICAL is case insensitive. Usually an upper case +# MIME charset name is preferred. +# The current list of GNU canonical charset names is as follows. +# +# name used by which systems a MIME name? +# ASCII, ANSI_X3.4-1968 glibc solaris freebsd +# ISO-8859-1 glibc aix hpux irix osf solaris freebsd yes +# ISO-8859-2 glibc aix hpux irix osf solaris freebsd yes +# ISO-8859-3 glibc solaris yes +# ISO-8859-4 osf solaris freebsd yes +# ISO-8859-5 glibc aix hpux irix osf solaris freebsd yes +# ISO-8859-6 glibc aix hpux solaris yes +# ISO-8859-7 glibc aix hpux irix osf solaris yes +# ISO-8859-8 glibc aix hpux osf solaris yes +# ISO-8859-9 glibc aix hpux irix osf solaris yes +# ISO-8859-13 glibc +# ISO-8859-14 glibc +# ISO-8859-15 glibc aix osf solaris freebsd +# KOI8-R glibc solaris freebsd yes +# KOI8-U glibc freebsd yes +# KOI8-T glibc +# CP437 dos +# CP775 dos +# CP850 aix osf dos +# CP852 dos +# CP855 dos +# CP856 aix +# CP857 dos +# CP861 dos +# CP862 dos +# CP864 dos +# CP865 dos +# CP866 freebsd dos +# CP869 dos +# CP874 woe32 dos +# CP922 aix +# CP932 aix woe32 dos +# CP943 aix +# CP949 osf woe32 dos +# CP950 woe32 dos +# CP1046 aix +# CP1124 aix +# CP1125 dos +# CP1129 aix +# CP1250 woe32 +# CP1251 glibc woe32 +# CP1252 aix woe32 +# CP1253 woe32 +# CP1254 woe32 +# CP1255 glibc woe32 +# CP1256 woe32 +# CP1257 woe32 +# GB2312 glibc aix hpux irix solaris freebsd yes +# EUC-JP glibc aix hpux irix osf solaris freebsd yes +# EUC-KR glibc aix hpux irix osf solaris freebsd yes +# EUC-TW glibc aix hpux irix osf solaris +# BIG5 glibc aix hpux osf solaris freebsd yes +# BIG5-HKSCS glibc solaris +# GBK glibc aix osf solaris woe32 dos +# GB18030 glibc solaris +# SHIFT_JIS hpux osf solaris freebsd yes +# JOHAB glibc solaris woe32 +# TIS-620 glibc aix hpux osf solaris +# VISCII glibc yes +# TCVN5712-1 glibc +# GEORGIAN-PS glibc +# HP-ROMAN8 hpux +# HP-ARABIC8 hpux +# HP-GREEK8 hpux +# HP-HEBREW8 hpux +# HP-TURKISH8 hpux +# HP-KANA8 hpux +# DEC-KANJI osf +# DEC-HANYU osf +# UTF-8 glibc aix hpux osf solaris yes +# +# Note: Names which are not marked as being a MIME name should not be used in +# Internet protocols for information interchange (mail, news, etc.). +# +# Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications +# must understand both names and treat them as equivalent. +# +# The first argument passed to this file is the canonical host specification, +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM + +host="$1" +os=`echo "$host" | sed -e 's/^[^-]*-[^-]*-\(.*\)$/\1/'` +echo "# This file contains a table of character encoding aliases," +echo "# suitable for operating system '${os}'." +echo "# It was automatically generated from config.charset." +# List of references, updated during installation: +echo "# Packages using this file: " +case "$os" in + linux* | *-gnu*) + # With glibc-2.1 or newer, we don't need any canonicalization, + # because glibc has iconv and both glibc and libiconv support all + # GNU canonical names directly. Therefore, the Makefile does not + # need to install the alias file at all. + # The following applies only to glibc-2.0.x and older libcs. + echo "ISO_646.IRV:1983 ASCII" + ;; + aix*) + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-6 ISO-8859-6" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-8 ISO-8859-8" + echo "ISO8859-9 ISO-8859-9" + echo "ISO8859-15 ISO-8859-15" + echo "IBM-850 CP850" + echo "IBM-856 CP856" + echo "IBM-921 ISO-8859-13" + echo "IBM-922 CP922" + echo "IBM-932 CP932" + echo "IBM-943 CP943" + echo "IBM-1046 CP1046" + echo "IBM-1124 CP1124" + echo "IBM-1129 CP1129" + echo "IBM-1252 CP1252" + echo "IBM-eucCN GB2312" + echo "IBM-eucJP EUC-JP" + echo "IBM-eucKR EUC-KR" + echo "IBM-eucTW EUC-TW" + echo "big5 BIG5" + echo "GBK GBK" + echo "TIS-620 TIS-620" + echo "UTF-8 UTF-8" + ;; + hpux*) + echo "iso88591 ISO-8859-1" + echo "iso88592 ISO-8859-2" + echo "iso88595 ISO-8859-5" + echo "iso88596 ISO-8859-6" + echo "iso88597 ISO-8859-7" + echo "iso88598 ISO-8859-8" + echo "iso88599 ISO-8859-9" + echo "iso885915 ISO-8859-15" + echo "roman8 HP-ROMAN8" + echo "arabic8 HP-ARABIC8" + echo "greek8 HP-GREEK8" + echo "hebrew8 HP-HEBREW8" + echo "turkish8 HP-TURKISH8" + echo "kana8 HP-KANA8" + echo "tis620 TIS-620" + echo "big5 BIG5" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + echo "hp15CN GB2312" + #echo "ccdc ?" # what is this? + echo "SJIS SHIFT_JIS" + echo "utf8 UTF-8" + ;; + irix*) + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-9 ISO-8859-9" + echo "eucCN GB2312" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + ;; + osf*) + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-4 ISO-8859-4" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-8 ISO-8859-8" + echo "ISO8859-9 ISO-8859-9" + echo "ISO8859-15 ISO-8859-15" + echo "cp850 CP850" + echo "big5 BIG5" + echo "dechanyu DEC-HANYU" + echo "dechanzi GB2312" + echo "deckanji DEC-KANJI" + echo "deckorean EUC-KR" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + echo "GBK GBK" + echo "KSC5601 CP949" + echo "sdeckanji EUC-JP" + echo "SJIS SHIFT_JIS" + echo "TACTIS TIS-620" + echo "UTF-8 UTF-8" + ;; + solaris*) + echo "646 ASCII" + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-3 ISO-8859-3" + echo "ISO8859-4 ISO-8859-4" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-6 ISO-8859-6" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-8 ISO-8859-8" + echo "ISO8859-9 ISO-8859-9" + echo "ISO8859-15 ISO-8859-15" + echo "koi8-r KOI8-R" + echo "BIG5 BIG5" + echo "Big5-HKSCS BIG5-HKSCS" + echo "gb2312 GB2312" + echo "GBK GBK" + echo "GB18030 GB18030" + echo "cns11643 EUC-TW" + echo "5601 EUC-KR" + echo "ko_KR.johap92 JOHAB" + echo "eucJP EUC-JP" + echo "PCK SHIFT_JIS" + echo "TIS620.2533 TIS-620" + #echo "sun_eu_greek ?" # what is this? + echo "UTF-8 UTF-8" + ;; + freebsd* | os2*) + # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore + # localcharset.c falls back to using the full locale name + # from the environment variables. + # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just + # reuse FreeBSD's locale data for OS/2. + echo "C ASCII" + echo "US-ASCII ASCII" + for l in la_LN lt_LN; do + echo "$l.ASCII ASCII" + done + for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ + fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \ + lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do + echo "$l.ISO_8859-1 ISO-8859-1" + echo "$l.DIS_8859-15 ISO-8859-15" + done + for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do + echo "$l.ISO_8859-2 ISO-8859-2" + done + for l in la_LN lt_LT; do + echo "$l.ISO_8859-4 ISO-8859-4" + done + for l in ru_RU ru_SU; do + echo "$l.KOI8-R KOI8-R" + echo "$l.ISO_8859-5 ISO-8859-5" + echo "$l.CP866 CP866" + done + echo "uk_UA.KOI8-U KOI8-U" + echo "zh_TW.BIG5 BIG5" + echo "zh_TW.Big5 BIG5" + echo "zh_CN.EUC GB2312" + echo "ja_JP.EUC EUC-JP" + echo "ja_JP.SJIS SHIFT_JIS" + echo "ja_JP.Shift_JIS SHIFT_JIS" + echo "ko_KR.EUC EUC-KR" + ;; + netbsd*) + echo "646 ASCII" + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-4 ISO-8859-4" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-15 ISO-8859-15" + echo "eucCN GB2312" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + echo "BIG5 BIG5" + echo "SJIS SHIFT_JIS" + ;; + beos*) + # BeOS has a single locale, and it has UTF-8 encoding. + echo "* UTF-8" + ;; + msdosdjgpp*) + # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore + # localcharset.c falls back to using the full locale name + # from the environment variables. + echo "#" + echo "# The encodings given here may not all be correct." + echo "# If you find that the encoding given for your language and" + echo "# country is not the one your DOS machine actually uses, just" + echo "# correct it in this file, and send a mail to" + echo "# Juan Manuel Guerrero " + echo "# and Bruno Haible ." + echo "#" + echo "C ASCII" + # ISO-8859-1 languages + echo "ca CP850" + echo "ca_ES CP850" + echo "da CP865" # not CP850 ?? + echo "da_DK CP865" # not CP850 ?? + echo "de CP850" + echo "de_AT CP850" + echo "de_CH CP850" + echo "de_DE CP850" + echo "en CP850" + echo "en_AU CP850" # not CP437 ?? + echo "en_CA CP850" + echo "en_GB CP850" + echo "en_NZ CP437" + echo "en_US CP437" + echo "en_ZA CP850" # not CP437 ?? + echo "es CP850" + echo "es_AR CP850" + echo "es_BO CP850" + echo "es_CL CP850" + echo "es_CO CP850" + echo "es_CR CP850" + echo "es_CU CP850" + echo "es_DO CP850" + echo "es_EC CP850" + echo "es_ES CP850" + echo "es_GT CP850" + echo "es_HN CP850" + echo "es_MX CP850" + echo "es_NI CP850" + echo "es_PA CP850" + echo "es_PY CP850" + echo "es_PE CP850" + echo "es_SV CP850" + echo "es_UY CP850" + echo "es_VE CP850" + echo "et CP850" + echo "et_EE CP850" + echo "eu CP850" + echo "eu_ES CP850" + echo "fi CP850" + echo "fi_FI CP850" + echo "fr CP850" + echo "fr_BE CP850" + echo "fr_CA CP850" + echo "fr_CH CP850" + echo "fr_FR CP850" + echo "ga CP850" + echo "ga_IE CP850" + echo "gd CP850" + echo "gd_GB CP850" + echo "gl CP850" + echo "gl_ES CP850" + echo "id CP850" # not CP437 ?? + echo "id_ID CP850" # not CP437 ?? + echo "is CP861" # not CP850 ?? + echo "is_IS CP861" # not CP850 ?? + echo "it CP850" + echo "it_CH CP850" + echo "it_IT CP850" + echo "lt CP775" + echo "lt_LT CP775" + echo "lv CP775" + echo "lv_LV CP775" + echo "nb CP865" # not CP850 ?? + echo "nb_NO CP865" # not CP850 ?? + echo "nl CP850" + echo "nl_BE CP850" + echo "nl_NL CP850" + echo "nn CP865" # not CP850 ?? + echo "nn_NO CP865" # not CP850 ?? + echo "no CP865" # not CP850 ?? + echo "no_NO CP865" # not CP850 ?? + echo "pt CP850" + echo "pt_BR CP850" + echo "pt_PT CP850" + echo "sv CP850" + echo "sv_SE CP850" + # ISO-8859-2 languages + echo "cs CP852" + echo "cs_CZ CP852" + echo "hr CP852" + echo "hr_HR CP852" + echo "hu CP852" + echo "hu_HU CP852" + echo "pl CP852" + echo "pl_PL CP852" + echo "ro CP852" + echo "ro_RO CP852" + echo "sk CP852" + echo "sk_SK CP852" + echo "sl CP852" + echo "sl_SI CP852" + echo "sq CP852" + echo "sq_AL CP852" + echo "sr CP852" # CP852 or CP866 or CP855 ?? + echo "sr_YU CP852" # CP852 or CP866 or CP855 ?? + # ISO-8859-3 languages + echo "mt CP850" + echo "mt_MT CP850" + # ISO-8859-5 languages + echo "be CP866" + echo "be_BE CP866" + echo "bg CP866" # not CP855 ?? + echo "bg_BG CP866" # not CP855 ?? + echo "mk CP866" # not CP855 ?? + echo "mk_MK CP866" # not CP855 ?? + echo "ru CP866" + echo "ru_RU CP866" + echo "uk CP1125" + echo "uk_UA CP1125" + # ISO-8859-6 languages + echo "ar CP864" + echo "ar_AE CP864" + echo "ar_DZ CP864" + echo "ar_EG CP864" + echo "ar_IQ CP864" + echo "ar_IR CP864" + echo "ar_JO CP864" + echo "ar_KW CP864" + echo "ar_MA CP864" + echo "ar_OM CP864" + echo "ar_QA CP864" + echo "ar_SA CP864" + echo "ar_SY CP864" + # ISO-8859-7 languages + echo "el CP869" + echo "el_GR CP869" + # ISO-8859-8 languages + echo "he CP862" + echo "he_IL CP862" + # ISO-8859-9 languages + echo "tr CP857" + echo "tr_TR CP857" + # Japanese + echo "ja CP932" + echo "ja_JP CP932" + # Chinese + echo "zh_CN GBK" + echo "zh_TW CP950" # not CP938 ?? + # Korean + echo "kr CP949" # not CP934 ?? + echo "kr_KR CP949" # not CP934 ?? + # Thai + echo "th CP874" + echo "th_TH CP874" + # Other + echo "eo CP850" + echo "eo_EO CP850" + ;; +esac diff --git a/intl/dcgettext.c b/intl/dcgettext.c new file mode 100644 index 0000000..ca6a1c8 --- /dev/null +++ b/intl/dcgettext.c @@ -0,0 +1,59 @@ +/* Implementation of the dcgettext(3) function. + Copyright (C) 1995-1999, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DCGETTEXT __dcgettext +# define DCIGETTEXT __dcigettext +#else +# define DCGETTEXT libintl_dcgettext +# define DCIGETTEXT libintl_dcigettext +#endif + +/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY + locale. */ +char * +DCGETTEXT (domainname, msgid, category) + const char *domainname; + const char *msgid; + int category; +{ + return DCIGETTEXT (domainname, msgid, NULL, 0, 0, category); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +INTDEF(__dcgettext) +weak_alias (__dcgettext, dcgettext); +#endif diff --git a/intl/dcigettext.c b/intl/dcigettext.c new file mode 100644 index 0000000..f2f0152 --- /dev/null +++ b/intl/dcigettext.c @@ -0,0 +1,1206 @@ +/* Implementation of the internal dcigettext function. + Copyright (C) 1995-1999, 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Tell glibc's to provide a prototype for mempcpy(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#ifdef __GNUC__ +# define alloca __builtin_alloca +# define HAVE_ALLOCA 1 +#else +# if defined HAVE_ALLOCA_H || defined _LIBC +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca +char *alloca (); +# endif +# endif +# endif +#endif + +#include +#ifndef errno +extern int errno; +#endif +#ifndef __set_errno +# define __set_errno(val) errno = (val) +#endif + +#include +#include +#include + +#if defined HAVE_UNISTD_H || defined _LIBC +# include +#endif + +#include + +#ifdef _LIBC + /* Guess whether integer division by zero raises signal SIGFPE. + Set to 1 only if you know for sure. In case of doubt, set to 0. */ +# if defined __alpha__ || defined __arm__ || defined __i386__ \ + || defined __m68k__ || defined __s390__ +# define INTDIV0_RAISES_SIGFPE 1 +# else +# define INTDIV0_RAISES_SIGFPE 0 +# endif +#endif +#if !INTDIV0_RAISES_SIGFPE +# include +#endif + +#if defined HAVE_SYS_PARAM_H || defined _LIBC +# include +#endif + +#include "gettextP.h" +#include "plural-exp.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif +#include "hash-string.h" + +/* Thread safetyness. */ +#ifdef _LIBC +# include +#else +/* Provide dummy implementation if this is outside glibc. */ +# define __libc_lock_define_initialized(CLASS, NAME) +# define __libc_lock_lock(NAME) +# define __libc_lock_unlock(NAME) +# define __libc_rwlock_define_initialized(CLASS, NAME) +# define __libc_rwlock_rdlock(NAME) +# define __libc_rwlock_unlock(NAME) +#endif + +/* Alignment of types. */ +#if defined __GNUC__ && __GNUC__ >= 2 +# define alignof(TYPE) __alignof__ (TYPE) +#else +# define alignof(TYPE) \ + ((int) &((struct { char dummy1; TYPE dummy2; } *) 0)->dummy2) +#endif + +/* The internal variables in the standalone libintl.a must have different + names than the internal variables in GNU libc, otherwise programs + using libintl.a cannot be linked statically. */ +#if !defined _LIBC +# define _nl_default_default_domain libintl_nl_default_default_domain +# define _nl_current_default_domain libintl_nl_current_default_domain +# define _nl_default_dirname libintl_nl_default_dirname +# define _nl_domain_bindings libintl_nl_domain_bindings +#endif + +/* Some compilers, like SunOS4 cc, don't have offsetof in . */ +#ifndef offsetof +# define offsetof(type,ident) ((size_t)&(((type*)0)->ident)) +#endif + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# define getcwd __getcwd +# ifndef stpcpy +# define stpcpy __stpcpy +# endif +# define tfind __tfind +#else +# if !defined HAVE_GETCWD +char *getwd (); +# define getcwd(buf, max) getwd (buf) +# else +char *getcwd (); +# endif +# ifndef HAVE_STPCPY +static char *stpcpy PARAMS ((char *dest, const char *src)); +# endif +# ifndef HAVE_MEMPCPY +static void *mempcpy PARAMS ((void *dest, const void *src, size_t n)); +# endif +#endif + +/* Amount to increase buffer size by in each try. */ +#define PATH_INCR 32 + +/* The following is from pathmax.h. */ +/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define + PATH_MAX but might cause redefinition warnings when sys/param.h is + later included (as on MORE/BSD 4.3). */ +#if defined _POSIX_VERSION || (defined HAVE_LIMITS_H && !defined __GNUC__) +# include +#endif + +#ifndef _POSIX_PATH_MAX +# define _POSIX_PATH_MAX 255 +#endif + +#if !defined PATH_MAX && defined _PC_PATH_MAX +# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX)) +#endif + +/* Don't include sys/param.h if it already has been. */ +#if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN +# include +#endif + +#if !defined PATH_MAX && defined MAXPATHLEN +# define PATH_MAX MAXPATHLEN +#endif + +#ifndef PATH_MAX +# define PATH_MAX _POSIX_PATH_MAX +#endif + +/* Pathname support. + ISSLASH(C) tests whether C is a directory separator character. + IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not, + it may be concatenated to a directory pathname. + IS_PATH_WITH_DIR(P) tests whether P contains a directory specification. + */ +#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ + /* Win32, OS/2, DOS */ +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +# define HAS_DEVICE(P) \ + ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ + && (P)[1] == ':') +# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P)) +# define IS_PATH_WITH_DIR(P) \ + (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P)) +#else + /* Unix */ +# define ISSLASH(C) ((C) == '/') +# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0]) +# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL) +#endif + +/* This is the type used for the search tree where known translations + are stored. */ +struct known_translation_t +{ + /* Domain in which to search. */ + char *domainname; + + /* The category. */ + int category; + + /* State of the catalog counter at the point the string was found. */ + int counter; + + /* Catalog where the string was found. */ + struct loaded_l10nfile *domain; + + /* And finally the translation. */ + const char *translation; + size_t translation_length; + + /* Pointer to the string in question. */ + char msgid[ZERO]; +}; + +/* Root of the search tree with known translations. We can use this + only if the system provides the `tsearch' function family. */ +#if defined HAVE_TSEARCH || defined _LIBC +# include + +static void *root; + +# ifdef _LIBC +# define tsearch __tsearch +# endif + +/* Function to compare two entries in the table of known translations. */ +static int transcmp PARAMS ((const void *p1, const void *p2)); +static int +transcmp (p1, p2) + const void *p1; + const void *p2; +{ + const struct known_translation_t *s1; + const struct known_translation_t *s2; + int result; + + s1 = (const struct known_translation_t *) p1; + s2 = (const struct known_translation_t *) p2; + + result = strcmp (s1->msgid, s2->msgid); + if (result == 0) + { + result = strcmp (s1->domainname, s2->domainname); + if (result == 0) + /* We compare the category last (though this is the cheapest + operation) since it is hopefully always the same (namely + LC_MESSAGES). */ + result = s1->category - s2->category; + } + + return result; +} +#endif + +/* Name of the default domain used for gettext(3) prior any call to + textdomain(3). The default value for this is "messages". */ +const char _nl_default_default_domain[] attribute_hidden = "messages"; + +/* Value used as the default domain for gettext(3). */ +const char *_nl_current_default_domain attribute_hidden + = _nl_default_default_domain; + +/* Contains the default location of the message catalogs. */ +#if defined __EMX__ +extern const char _nl_default_dirname[]; +#else +const char _nl_default_dirname[] = LOCALEDIR; +#endif + +/* List with bindings of specific domains created by bindtextdomain() + calls. */ +struct binding *_nl_domain_bindings; + +/* Prototypes for local functions. */ +static char *plural_lookup PARAMS ((struct loaded_l10nfile *domain, + unsigned long int n, + const char *translation, + size_t translation_len)) + internal_function; +static const char *category_to_name PARAMS ((int category)) internal_function; +static const char *guess_category_value PARAMS ((int category, + const char *categoryname)) + internal_function; + + +/* For those loosing systems which don't have `alloca' we have to add + some additional code emulating it. */ +#ifdef HAVE_ALLOCA +/* Nothing has to be done. */ +# define freea(p) /* nothing */ +# define ADD_BLOCK(list, address) /* nothing */ +# define FREE_BLOCKS(list) /* nothing */ +#else +struct block_list +{ + void *address; + struct block_list *next; +}; +# define ADD_BLOCK(list, addr) \ + do { \ + struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \ + /* If we cannot get a free block we cannot add the new element to \ + the list. */ \ + if (newp != NULL) { \ + newp->address = (addr); \ + newp->next = (list); \ + (list) = newp; \ + } \ + } while (0) +# define FREE_BLOCKS(list) \ + do { \ + while (list != NULL) { \ + struct block_list *old = list; \ + list = list->next; \ + free (old->address); \ + free (old); \ + } \ + } while (0) +# undef alloca +# define alloca(size) (malloc (size)) +# define freea(p) free (p) +#endif /* have alloca */ + + +#ifdef _LIBC +/* List of blocks allocated for translations. */ +typedef struct transmem_list +{ + struct transmem_list *next; + char data[ZERO]; +} transmem_block_t; +static struct transmem_list *transmem_list; +#else +typedef unsigned char transmem_block_t; +#endif + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DCIGETTEXT __dcigettext +#else +# define DCIGETTEXT libintl_dcigettext +#endif + +/* Lock variable to protect the global data in the gettext implementation. */ +#ifdef _LIBC +__libc_rwlock_define_initialized (, _nl_state_lock attribute_hidden) +#endif + +/* Checking whether the binaries runs SUID must be done and glibc provides + easier methods therefore we make a difference here. */ +#ifdef _LIBC +# define ENABLE_SECURE __libc_enable_secure +# define DETERMINE_SECURE +#else +# ifndef HAVE_GETUID +# define getuid() 0 +# endif +# ifndef HAVE_GETGID +# define getgid() 0 +# endif +# ifndef HAVE_GETEUID +# define geteuid() getuid() +# endif +# ifndef HAVE_GETEGID +# define getegid() getgid() +# endif +static int enable_secure; +# define ENABLE_SECURE (enable_secure == 1) +# define DETERMINE_SECURE \ + if (enable_secure == 0) \ + { \ + if (getuid () != geteuid () || getgid () != getegid ()) \ + enable_secure = 1; \ + else \ + enable_secure = -1; \ + } +#endif + +/* Get the function to evaluate the plural expression. */ +#include "eval-plural.h" + +/* Look up MSGID in the DOMAINNAME message catalog for the current + CATEGORY locale and, if PLURAL is nonzero, search over string + depending on the plural form determined by N. */ +char * +DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category) + const char *domainname; + const char *msgid1; + const char *msgid2; + int plural; + unsigned long int n; + int category; +{ +#ifndef HAVE_ALLOCA + struct block_list *block_list = NULL; +#endif + struct loaded_l10nfile *domain; + struct binding *binding; + const char *categoryname; + const char *categoryvalue; + char *dirname, *xdomainname; + char *single_locale; + char *retval; + size_t retlen; + int saved_errno; +#if defined HAVE_TSEARCH || defined _LIBC + struct known_translation_t *search; + struct known_translation_t **foundp = NULL; + size_t msgid_len; +#endif + size_t domainname_len; + + /* If no real MSGID is given return NULL. */ + if (msgid1 == NULL) + return NULL; + + __libc_rwlock_rdlock (_nl_state_lock); + + /* If DOMAINNAME is NULL, we are interested in the default domain. If + CATEGORY is not LC_MESSAGES this might not make much sense but the + definition left this undefined. */ + if (domainname == NULL) + domainname = _nl_current_default_domain; + + /* OS/2 specific: backward compatibility with older libintl versions */ +#ifdef LC_MESSAGES_COMPAT + if (category == LC_MESSAGES_COMPAT) + category = LC_MESSAGES; +#endif + +#if defined HAVE_TSEARCH || defined _LIBC + msgid_len = strlen (msgid1) + 1; + + /* Try to find the translation among those which we found at + some time. */ + search = (struct known_translation_t *) + alloca (offsetof (struct known_translation_t, msgid) + msgid_len); + memcpy (search->msgid, msgid1, msgid_len); + search->domainname = (char *) domainname; + search->category = category; + + foundp = (struct known_translation_t **) tfind (search, &root, transcmp); + freea (search); + if (foundp != NULL && (*foundp)->counter == _nl_msg_cat_cntr) + { + /* Now deal with plural. */ + if (plural) + retval = plural_lookup ((*foundp)->domain, n, (*foundp)->translation, + (*foundp)->translation_length); + else + retval = (char *) (*foundp)->translation; + + __libc_rwlock_unlock (_nl_state_lock); + return retval; + } +#endif + + /* Preserve the `errno' value. */ + saved_errno = errno; + + /* See whether this is a SUID binary or not. */ + DETERMINE_SECURE; + + /* First find matching binding. */ + for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) + { + int compare = strcmp (domainname, binding->domainname); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It is not in the list. */ + binding = NULL; + break; + } + } + + if (binding == NULL) + dirname = (char *) _nl_default_dirname; + else if (IS_ABSOLUTE_PATH (binding->dirname)) + dirname = binding->dirname; + else + { + /* We have a relative path. Make it absolute now. */ + size_t dirname_len = strlen (binding->dirname) + 1; + size_t path_max; + char *ret; + + path_max = (unsigned int) PATH_MAX; + path_max += 2; /* The getcwd docs say to do this. */ + + for (;;) + { + dirname = (char *) alloca (path_max + dirname_len); + ADD_BLOCK (block_list, dirname); + + __set_errno (0); + ret = getcwd (dirname, path_max); + if (ret != NULL || errno != ERANGE) + break; + + path_max += path_max / 2; + path_max += PATH_INCR; + } + + if (ret == NULL) + { + /* We cannot get the current working directory. Don't signal an + error but simply return the default string. */ + FREE_BLOCKS (block_list); + __libc_rwlock_unlock (_nl_state_lock); + __set_errno (saved_errno); + return (plural == 0 + ? (char *) msgid1 + /* Use the Germanic plural rule. */ + : n == 1 ? (char *) msgid1 : (char *) msgid2); + } + + stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname); + } + + /* Now determine the symbolic name of CATEGORY and its value. */ + categoryname = category_to_name (category); + categoryvalue = guess_category_value (category, categoryname); + + domainname_len = strlen (domainname); + xdomainname = (char *) alloca (strlen (categoryname) + + domainname_len + 5); + ADD_BLOCK (block_list, xdomainname); + + stpcpy (mempcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"), + domainname, domainname_len), + ".mo"); + + /* Creating working area. */ + single_locale = (char *) alloca (strlen (categoryvalue) + 1); + ADD_BLOCK (block_list, single_locale); + + + /* Search for the given string. This is a loop because we perhaps + got an ordered list of languages to consider for the translation. */ + while (1) + { + /* Make CATEGORYVALUE point to the next element of the list. */ + while (categoryvalue[0] != '\0' && categoryvalue[0] == ':') + ++categoryvalue; + if (categoryvalue[0] == '\0') + { + /* The whole contents of CATEGORYVALUE has been searched but + no valid entry has been found. We solve this situation + by implicitly appending a "C" entry, i.e. no translation + will take place. */ + single_locale[0] = 'C'; + single_locale[1] = '\0'; + } + else + { + char *cp = single_locale; + while (categoryvalue[0] != '\0' && categoryvalue[0] != ':') + *cp++ = *categoryvalue++; + *cp = '\0'; + + /* When this is a SUID binary we must not allow accessing files + outside the dedicated directories. */ + if (ENABLE_SECURE && IS_PATH_WITH_DIR (single_locale)) + /* Ingore this entry. */ + continue; + } + + /* If the current locale value is C (or POSIX) we don't load a + domain. Return the MSGID. */ + if (strcmp (single_locale, "C") == 0 + || strcmp (single_locale, "POSIX") == 0) + { + FREE_BLOCKS (block_list); + __libc_rwlock_unlock (_nl_state_lock); + __set_errno (saved_errno); + return (plural == 0 + ? (char *) msgid1 + /* Use the Germanic plural rule. */ + : n == 1 ? (char *) msgid1 : (char *) msgid2); + } + + + /* Find structure describing the message catalog matching the + DOMAINNAME and CATEGORY. */ + domain = _nl_find_domain (dirname, single_locale, xdomainname, binding); + + if (domain != NULL) + { + retval = _nl_find_msg (domain, binding, msgid1, &retlen); + + if (retval == NULL) + { + int cnt; + + for (cnt = 0; domain->successor[cnt] != NULL; ++cnt) + { + retval = _nl_find_msg (domain->successor[cnt], binding, + msgid1, &retlen); + + if (retval != NULL) + { + domain = domain->successor[cnt]; + break; + } + } + } + + if (retval != NULL) + { + /* Found the translation of MSGID1 in domain DOMAIN: + starting at RETVAL, RETLEN bytes. */ + FREE_BLOCKS (block_list); + __set_errno (saved_errno); +#if defined HAVE_TSEARCH || defined _LIBC + if (foundp == NULL) + { + /* Create a new entry and add it to the search tree. */ + struct known_translation_t *newp; + + newp = (struct known_translation_t *) + malloc (offsetof (struct known_translation_t, msgid) + + msgid_len + domainname_len + 1); + if (newp != NULL) + { + newp->domainname = + mempcpy (newp->msgid, msgid1, msgid_len); + memcpy (newp->domainname, domainname, domainname_len + 1); + newp->category = category; + newp->counter = _nl_msg_cat_cntr; + newp->domain = domain; + newp->translation = retval; + newp->translation_length = retlen; + + /* Insert the entry in the search tree. */ + foundp = (struct known_translation_t **) + tsearch (newp, &root, transcmp); + if (foundp == NULL + || __builtin_expect (*foundp != newp, 0)) + /* The insert failed. */ + free (newp); + } + } + else + { + /* We can update the existing entry. */ + (*foundp)->counter = _nl_msg_cat_cntr; + (*foundp)->domain = domain; + (*foundp)->translation = retval; + (*foundp)->translation_length = retlen; + } +#endif + /* Now deal with plural. */ + if (plural) + retval = plural_lookup (domain, n, retval, retlen); + + __libc_rwlock_unlock (_nl_state_lock); + return retval; + } + } + } + /* NOTREACHED */ +} + + +char * +internal_function +_nl_find_msg (domain_file, domainbinding, msgid, lengthp) + struct loaded_l10nfile *domain_file; + struct binding *domainbinding; + const char *msgid; + size_t *lengthp; +{ + struct loaded_domain *domain; + nls_uint32 nstrings; + size_t act; + char *result; + size_t resultlen; + + if (domain_file->decided == 0) + _nl_load_domain (domain_file, domainbinding); + + if (domain_file->data == NULL) + return NULL; + + domain = (struct loaded_domain *) domain_file->data; + + nstrings = domain->nstrings; + + /* Locate the MSGID and its translation. */ + if (domain->hash_tab != NULL) + { + /* Use the hashing table. */ + nls_uint32 len = strlen (msgid); + nls_uint32 hash_val = hash_string (msgid); + nls_uint32 idx = hash_val % domain->hash_size; + nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2)); + + while (1) + { + nls_uint32 nstr = + W (domain->must_swap_hash_tab, domain->hash_tab[idx]); + + if (nstr == 0) + /* Hash table entry is empty. */ + return NULL; + + nstr--; + + /* Compare msgid with the original string at index nstr. + We compare the lengths with >=, not ==, because plural entries + are represented by strings with an embedded NUL. */ + if (nstr < nstrings + ? W (domain->must_swap, domain->orig_tab[nstr].length) >= len + && (strcmp (msgid, + domain->data + W (domain->must_swap, + domain->orig_tab[nstr].offset)) + == 0) + : domain->orig_sysdep_tab[nstr - nstrings].length > len + && (strcmp (msgid, + domain->orig_sysdep_tab[nstr - nstrings].pointer) + == 0)) + { + act = nstr; + goto found; + } + + if (idx >= domain->hash_size - incr) + idx -= domain->hash_size - incr; + else + idx += incr; + } + /* NOTREACHED */ + } + else + { + /* Try the default method: binary search in the sorted array of + messages. */ + size_t top, bottom; + + bottom = 0; + top = nstrings; + while (bottom < top) + { + int cmp_val; + + act = (bottom + top) / 2; + cmp_val = strcmp (msgid, (domain->data + + W (domain->must_swap, + domain->orig_tab[act].offset))); + if (cmp_val < 0) + top = act; + else if (cmp_val > 0) + bottom = act + 1; + else + goto found; + } + /* No translation was found. */ + return NULL; + } + + found: + /* The translation was found at index ACT. If we have to convert the + string to use a different character set, this is the time. */ + if (act < nstrings) + { + result = (char *) + (domain->data + W (domain->must_swap, domain->trans_tab[act].offset)); + resultlen = W (domain->must_swap, domain->trans_tab[act].length) + 1; + } + else + { + result = (char *) domain->trans_sysdep_tab[act - nstrings].pointer; + resultlen = domain->trans_sysdep_tab[act - nstrings].length; + } + +#if defined _LIBC || HAVE_ICONV + if (domain->codeset_cntr + != (domainbinding != NULL ? domainbinding->codeset_cntr : 0)) + { + /* The domain's codeset has changed through bind_textdomain_codeset() + since the message catalog was initialized or last accessed. We + have to reinitialize the converter. */ + _nl_free_domain_conv (domain); + _nl_init_domain_conv (domain_file, domain, domainbinding); + } + + if ( +# ifdef _LIBC + domain->conv != (__gconv_t) -1 +# else +# if HAVE_ICONV + domain->conv != (iconv_t) -1 +# endif +# endif + ) + { + /* We are supposed to do a conversion. First allocate an + appropriate table with the same structure as the table + of translations in the file, where we can put the pointers + to the converted strings in. + There is a slight complication with plural entries. They + are represented by consecutive NUL terminated strings. We + handle this case by converting RESULTLEN bytes, including + NULs. */ + + if (domain->conv_tab == NULL + && ((domain->conv_tab = + (char **) calloc (nstrings + domain->n_sysdep_strings, + sizeof (char *))) + == NULL)) + /* Mark that we didn't succeed allocating a table. */ + domain->conv_tab = (char **) -1; + + if (__builtin_expect (domain->conv_tab == (char **) -1, 0)) + /* Nothing we can do, no more memory. */ + goto converted; + + if (domain->conv_tab[act] == NULL) + { + /* We haven't used this string so far, so it is not + translated yet. Do this now. */ + /* We use a bit more efficient memory handling. + We allocate always larger blocks which get used over + time. This is faster than many small allocations. */ + __libc_lock_define_initialized (static, lock) +# define INITIAL_BLOCK_SIZE 4080 + static unsigned char *freemem; + static size_t freemem_size; + + const unsigned char *inbuf; + unsigned char *outbuf; + int malloc_count; +# ifndef _LIBC + transmem_block_t *transmem_list = NULL; +# endif + + __libc_lock_lock (lock); + + inbuf = (const unsigned char *) result; + outbuf = freemem + sizeof (size_t); + + malloc_count = 0; + while (1) + { + transmem_block_t *newmem; +# ifdef _LIBC + size_t non_reversible; + int res; + + if (freemem_size < sizeof (size_t)) + goto resize_freemem; + + res = __gconv (domain->conv, + &inbuf, inbuf + resultlen, + &outbuf, + outbuf + freemem_size - sizeof (size_t), + &non_reversible); + + if (res == __GCONV_OK || res == __GCONV_EMPTY_INPUT) + break; + + if (res != __GCONV_FULL_OUTPUT) + { + __libc_lock_unlock (lock); + goto converted; + } + + inbuf = result; +# else +# if HAVE_ICONV + const char *inptr = (const char *) inbuf; + size_t inleft = resultlen; + char *outptr = (char *) outbuf; + size_t outleft; + + if (freemem_size < sizeof (size_t)) + goto resize_freemem; + + outleft = freemem_size - sizeof (size_t); + if (iconv (domain->conv, + (ICONV_CONST char **) &inptr, &inleft, + &outptr, &outleft) + != (size_t) (-1)) + { + outbuf = (unsigned char *) outptr; + break; + } + if (errno != E2BIG) + { + __libc_lock_unlock (lock); + goto converted; + } +# endif +# endif + + resize_freemem: + /* We must allocate a new buffer or resize the old one. */ + if (malloc_count > 0) + { + ++malloc_count; + freemem_size = malloc_count * INITIAL_BLOCK_SIZE; + newmem = (transmem_block_t *) realloc (transmem_list, + freemem_size); +# ifdef _LIBC + if (newmem != NULL) + transmem_list = transmem_list->next; + else + { + struct transmem_list *old = transmem_list; + + transmem_list = transmem_list->next; + free (old); + } +# endif + } + else + { + malloc_count = 1; + freemem_size = INITIAL_BLOCK_SIZE; + newmem = (transmem_block_t *) malloc (freemem_size); + } + if (__builtin_expect (newmem == NULL, 0)) + { + freemem = NULL; + freemem_size = 0; + __libc_lock_unlock (lock); + goto converted; + } + +# ifdef _LIBC + /* Add the block to the list of blocks we have to free + at some point. */ + newmem->next = transmem_list; + transmem_list = newmem; + + freemem = newmem->data; + freemem_size -= offsetof (struct transmem_list, data); +# else + transmem_list = newmem; + freemem = newmem; +# endif + + outbuf = freemem + sizeof (size_t); + } + + /* We have now in our buffer a converted string. Put this + into the table of conversions. */ + *(size_t *) freemem = outbuf - freemem - sizeof (size_t); + domain->conv_tab[act] = (char *) freemem; + /* Shrink freemem, but keep it aligned. */ + freemem_size -= outbuf - freemem; + freemem = outbuf; + freemem += freemem_size & (alignof (size_t) - 1); + freemem_size = freemem_size & ~ (alignof (size_t) - 1); + + __libc_lock_unlock (lock); + } + + /* Now domain->conv_tab[act] contains the translation of all + the plural variants. */ + result = domain->conv_tab[act] + sizeof (size_t); + resultlen = *(size_t *) domain->conv_tab[act]; + } + + converted: + /* The result string is converted. */ + +#endif /* _LIBC || HAVE_ICONV */ + + *lengthp = resultlen; + return result; +} + + +/* Look up a plural variant. */ +static char * +internal_function +plural_lookup (domain, n, translation, translation_len) + struct loaded_l10nfile *domain; + unsigned long int n; + const char *translation; + size_t translation_len; +{ + struct loaded_domain *domaindata = (struct loaded_domain *) domain->data; + unsigned long int index; + const char *p; + + index = plural_eval (domaindata->plural, n); + if (index >= domaindata->nplurals) + /* This should never happen. It means the plural expression and the + given maximum value do not match. */ + index = 0; + + /* Skip INDEX strings at TRANSLATION. */ + p = translation; + while (index-- > 0) + { +#ifdef _LIBC + p = __rawmemchr (p, '\0'); +#else + p = strchr (p, '\0'); +#endif + /* And skip over the NUL byte. */ + p++; + + if (p >= translation + translation_len) + /* This should never happen. It means the plural expression + evaluated to a value larger than the number of variants + available for MSGID1. */ + return (char *) translation; + } + return (char *) p; +} + + +/* Return string representation of locale CATEGORY. */ +static const char * +internal_function +category_to_name (category) + int category; +{ + const char *retval; + + switch (category) + { +#ifdef LC_COLLATE + case LC_COLLATE: + retval = "LC_COLLATE"; + break; +#endif +#ifdef LC_CTYPE + case LC_CTYPE: + retval = "LC_CTYPE"; + break; +#endif +#ifdef LC_MONETARY + case LC_MONETARY: + retval = "LC_MONETARY"; + break; +#endif +#ifdef LC_NUMERIC + case LC_NUMERIC: + retval = "LC_NUMERIC"; + break; +#endif +#ifdef LC_TIME + case LC_TIME: + retval = "LC_TIME"; + break; +#endif +#ifdef LC_MESSAGES + case LC_MESSAGES: + retval = "LC_MESSAGES"; + break; +#endif +#ifdef LC_RESPONSE + case LC_RESPONSE: + retval = "LC_RESPONSE"; + break; +#endif +#ifdef LC_ALL + case LC_ALL: + /* This might not make sense but is perhaps better than any other + value. */ + retval = "LC_ALL"; + break; +#endif + default: + /* If you have a better idea for a default value let me know. */ + retval = "LC_XXX"; + } + + return retval; +} + +/* Guess value of current locale from value of the environment variables. */ +static const char * +internal_function +guess_category_value (category, categoryname) + int category; + const char *categoryname; +{ + const char *language; + const char *retval; + + /* The highest priority value is the `LANGUAGE' environment + variable. But we don't use the value if the currently selected + locale is the C locale. This is a GNU extension. */ + language = getenv ("LANGUAGE"); + if (language != NULL && language[0] == '\0') + language = NULL; + + /* We have to proceed with the POSIX methods of looking to `LC_ALL', + `LC_xxx', and `LANG'. On some systems this can be done by the + `setlocale' function itself. */ +#ifdef _LIBC + retval = setlocale (category, NULL); +#else + retval = _nl_locale_name (category, categoryname); +#endif + + /* Ignore LANGUAGE if the locale is set to "C" because + 1. "C" locale usually uses the ASCII encoding, and most international + messages use non-ASCII characters. These characters get displayed + as question marks (if using glibc's iconv()) or as invalid 8-bit + characters (because other iconv()s refuse to convert most non-ASCII + characters to ASCII). In any case, the output is ugly. + 2. The precise output of some programs in the "C" locale is specified + by POSIX and should not depend on environment variables like + "LANGUAGE". We allow such programs to use gettext(). */ + return language != NULL && strcmp (retval, "C") != 0 ? language : retval; +} + +/* @@ begin of epilog @@ */ + +/* We don't want libintl.a to depend on any other library. So we + avoid the non-standard function stpcpy. In GNU C Library this + function is available, though. Also allow the symbol HAVE_STPCPY + to be defined. */ +#if !_LIBC && !HAVE_STPCPY +static char * +stpcpy (dest, src) + char *dest; + const char *src; +{ + while ((*dest++ = *src++) != '\0') + /* Do nothing. */ ; + return dest - 1; +} +#endif + +#if !_LIBC && !HAVE_MEMPCPY +static void * +mempcpy (dest, src, n) + void *dest; + const void *src; + size_t n; +{ + return (void *) ((char *) memcpy (dest, src, n) + n); +} +#endif + + +#ifdef _LIBC +/* If we want to free all resources we have to do some work at + program's end. */ +static void __attribute__ ((unused)) +free_mem (void) +{ + void *old; + + while (_nl_domain_bindings != NULL) + { + struct binding *oldp = _nl_domain_bindings; + _nl_domain_bindings = _nl_domain_bindings->next; + if (oldp->dirname != _nl_default_dirname) + /* Yes, this is a pointer comparison. */ + free (oldp->dirname); + free (oldp->codeset); + free (oldp); + } + + if (_nl_current_default_domain != _nl_default_default_domain) + /* Yes, again a pointer comparison. */ + free ((char *) _nl_current_default_domain); + + /* Remove the search tree with the known translations. */ + __tdestroy (root, free); + root = NULL; + + while (transmem_list != NULL) + { + old = transmem_list; + transmem_list = transmem_list->next; + free (old); + } +} + +text_set_element (__libc_subfreeres, free_mem); +#endif diff --git a/intl/dcngettext.c b/intl/dcngettext.c new file mode 100644 index 0000000..17d9ce3 --- /dev/null +++ b/intl/dcngettext.c @@ -0,0 +1,61 @@ +/* Implementation of the dcngettext(3) function. + Copyright (C) 1995-1999, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DCNGETTEXT __dcngettext +# define DCIGETTEXT __dcigettext +#else +# define DCNGETTEXT libintl_dcngettext +# define DCIGETTEXT libintl_dcigettext +#endif + +/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY + locale. */ +char * +DCNGETTEXT (domainname, msgid1, msgid2, n, category) + const char *domainname; + const char *msgid1; + const char *msgid2; + unsigned long int n; + int category; +{ + return DCIGETTEXT (domainname, msgid1, msgid2, 1, n, category); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +INTDEF(__dcngettext) +weak_alias (__dcngettext, dcngettext); +#endif diff --git a/intl/dgettext.c b/intl/dgettext.c new file mode 100644 index 0000000..cf5b403 --- /dev/null +++ b/intl/dgettext.c @@ -0,0 +1,59 @@ +/* Implementation of the dgettext(3) function. + Copyright (C) 1995-1997, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DGETTEXT __dgettext +# define DCGETTEXT INTUSE(__dcgettext) +#else +# define DGETTEXT libintl_dgettext +# define DCGETTEXT libintl_dcgettext +#endif + +/* Look up MSGID in the DOMAINNAME message catalog of the current + LC_MESSAGES locale. */ +char * +DGETTEXT (domainname, msgid) + const char *domainname; + const char *msgid; +{ + return DCGETTEXT (domainname, msgid, LC_MESSAGES); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__dgettext, dgettext); +#endif diff --git a/intl/dngettext.c b/intl/dngettext.c new file mode 100644 index 0000000..0afbd2e --- /dev/null +++ b/intl/dngettext.c @@ -0,0 +1,61 @@ +/* Implementation of the dngettext(3) function. + Copyright (C) 1995-1997, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DNGETTEXT __dngettext +# define DCNGETTEXT INTUSE(__dcngettext) +#else +# define DNGETTEXT libintl_dngettext +# define DCNGETTEXT libintl_dcngettext +#endif + +/* Look up MSGID in the DOMAINNAME message catalog of the current + LC_MESSAGES locale and skip message according to the plural form. */ +char * +DNGETTEXT (domainname, msgid1, msgid2, n) + const char *domainname; + const char *msgid1; + const char *msgid2; + unsigned long int n; +{ + return DCNGETTEXT (domainname, msgid1, msgid2, n, LC_MESSAGES); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__dngettext, dngettext); +#endif diff --git a/intl/eval-plural.h b/intl/eval-plural.h new file mode 100644 index 0000000..19c7ca6 --- /dev/null +++ b/intl/eval-plural.h @@ -0,0 +1,114 @@ +/* Plural expression evaluation. + Copyright (C) 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef STATIC +#define STATIC static +#endif + +/* Evaluate the plural expression and return an index value. */ +STATIC unsigned long int plural_eval PARAMS ((struct expression *pexp, + unsigned long int n)) + internal_function; + +STATIC +unsigned long int +internal_function +plural_eval (pexp, n) + struct expression *pexp; + unsigned long int n; +{ + switch (pexp->nargs) + { + case 0: + switch (pexp->operation) + { + case var: + return n; + case num: + return pexp->val.num; + default: + break; + } + /* NOTREACHED */ + break; + case 1: + { + /* pexp->operation must be lnot. */ + unsigned long int arg = plural_eval (pexp->val.args[0], n); + return ! arg; + } + case 2: + { + unsigned long int leftarg = plural_eval (pexp->val.args[0], n); + if (pexp->operation == lor) + return leftarg || plural_eval (pexp->val.args[1], n); + else if (pexp->operation == land) + return leftarg && plural_eval (pexp->val.args[1], n); + else + { + unsigned long int rightarg = plural_eval (pexp->val.args[1], n); + + switch (pexp->operation) + { + case mult: + return leftarg * rightarg; + case divide: +#if !INTDIV0_RAISES_SIGFPE + if (rightarg == 0) + raise (SIGFPE); +#endif + return leftarg / rightarg; + case module: +#if !INTDIV0_RAISES_SIGFPE + if (rightarg == 0) + raise (SIGFPE); +#endif + return leftarg % rightarg; + case plus: + return leftarg + rightarg; + case minus: + return leftarg - rightarg; + case less_than: + return leftarg < rightarg; + case greater_than: + return leftarg > rightarg; + case less_or_equal: + return leftarg <= rightarg; + case greater_or_equal: + return leftarg >= rightarg; + case equal: + return leftarg == rightarg; + case not_equal: + return leftarg != rightarg; + default: + break; + } + } + /* NOTREACHED */ + break; + } + case 3: + { + /* pexp->operation must be qmop. */ + unsigned long int boolarg = plural_eval (pexp->val.args[0], n); + return plural_eval (pexp->val.args[boolarg ? 1 : 2], n); + } + } + /* NOTREACHED */ + return 0; +} diff --git a/intl/explodename.c b/intl/explodename.c new file mode 100644 index 0000000..2985064 --- /dev/null +++ b/intl/explodename.c @@ -0,0 +1,192 @@ +/* Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc. + Contributed by Ulrich Drepper , 1995. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +#include "loadinfo.h" + +/* On some strange systems still no definition of NULL is found. Sigh! */ +#ifndef NULL +# if defined __STDC__ && __STDC__ +# define NULL ((void *) 0) +# else +# define NULL 0 +# endif +#endif + +/* @@ end of prolog @@ */ + +char * +_nl_find_language (name) + const char *name; +{ + while (name[0] != '\0' && name[0] != '_' && name[0] != '@' + && name[0] != '+' && name[0] != ',') + ++name; + + return (char *) name; +} + + +int +_nl_explode_name (name, language, modifier, territory, codeset, + normalized_codeset, special, sponsor, revision) + char *name; + const char **language; + const char **modifier; + const char **territory; + const char **codeset; + const char **normalized_codeset; + const char **special; + const char **sponsor; + const char **revision; +{ + enum { undecided, xpg, cen } syntax; + char *cp; + int mask; + + *modifier = NULL; + *territory = NULL; + *codeset = NULL; + *normalized_codeset = NULL; + *special = NULL; + *sponsor = NULL; + *revision = NULL; + + /* Now we determine the single parts of the locale name. First + look for the language. Termination symbols are `_' and `@' if + we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ + mask = 0; + syntax = undecided; + *language = cp = name; + cp = _nl_find_language (*language); + + if (*language == cp) + /* This does not make sense: language has to be specified. Use + this entry as it is without exploding. Perhaps it is an alias. */ + cp = strchr (*language, '\0'); + else if (cp[0] == '_') + { + /* Next is the territory. */ + cp[0] = '\0'; + *territory = ++cp; + + while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@' + && cp[0] != '+' && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= TERRITORY; + + if (cp[0] == '.') + { + /* Next is the codeset. */ + syntax = xpg; + cp[0] = '\0'; + *codeset = ++cp; + + while (cp[0] != '\0' && cp[0] != '@') + ++cp; + + mask |= XPG_CODESET; + + if (*codeset != cp && (*codeset)[0] != '\0') + { + *normalized_codeset = _nl_normalize_codeset (*codeset, + cp - *codeset); + if (strcmp (*codeset, *normalized_codeset) == 0) + free ((char *) *normalized_codeset); + else + mask |= XPG_NORM_CODESET; + } + } + } + + if (cp[0] == '@' || (syntax != xpg && cp[0] == '+')) + { + /* Next is the modifier. */ + syntax = cp[0] == '@' ? xpg : cen; + cp[0] = '\0'; + *modifier = ++cp; + + while (syntax == cen && cp[0] != '\0' && cp[0] != '+' + && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= XPG_MODIFIER | CEN_AUDIENCE; + } + + if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_')) + { + syntax = cen; + + if (cp[0] == '+') + { + /* Next is special application (CEN syntax). */ + cp[0] = '\0'; + *special = ++cp; + + while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= CEN_SPECIAL; + } + + if (cp[0] == ',') + { + /* Next is sponsor (CEN syntax). */ + cp[0] = '\0'; + *sponsor = ++cp; + + while (cp[0] != '\0' && cp[0] != '_') + ++cp; + + mask |= CEN_SPONSOR; + } + + if (cp[0] == '_') + { + /* Next is revision (CEN syntax). */ + cp[0] = '\0'; + *revision = ++cp; + + mask |= CEN_REVISION; + } + } + + /* For CEN syntax values it might be important to have the + separator character in the file name, not for XPG syntax. */ + if (syntax == xpg) + { + if (*territory != NULL && (*territory)[0] == '\0') + mask &= ~TERRITORY; + + if (*codeset != NULL && (*codeset)[0] == '\0') + mask &= ~XPG_CODESET; + + if (*modifier != NULL && (*modifier)[0] == '\0') + mask &= ~XPG_MODIFIER; + } + + return mask; +} diff --git a/intl/finddomain.c b/intl/finddomain.c new file mode 100644 index 0000000..2f103d5 --- /dev/null +++ b/intl/finddomain.c @@ -0,0 +1,198 @@ +/* Handle list of needed message catalogs + Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. + Written by Ulrich Drepper , 1995. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include + +#if defined HAVE_UNISTD_H || defined _LIBC +# include +#endif + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ +/* List of already loaded domains. */ +static struct loaded_l10nfile *_nl_loaded_domains; + + +/* Return a data structure describing the message catalog described by + the DOMAINNAME and CATEGORY parameters with respect to the currently + established bindings. */ +struct loaded_l10nfile * +internal_function +_nl_find_domain (dirname, locale, domainname, domainbinding) + const char *dirname; + char *locale; + const char *domainname; + struct binding *domainbinding; +{ + struct loaded_l10nfile *retval; + const char *language; + const char *modifier; + const char *territory; + const char *codeset; + const char *normalized_codeset; + const char *special; + const char *sponsor; + const char *revision; + const char *alias_value; + int mask; + + /* LOCALE can consist of up to four recognized parts for the XPG syntax: + + language[_territory[.codeset]][@modifier] + + and six parts for the CEN syntax: + + language[_territory][+audience][+special][,[sponsor][_revision]] + + Beside the first part all of them are allowed to be missing. If + the full specified locale is not found, the less specific one are + looked for. The various parts will be stripped off according to + the following order: + (1) revision + (2) sponsor + (3) special + (4) codeset + (5) normalized codeset + (6) territory + (7) audience/modifier + */ + + /* If we have already tested for this locale entry there has to + be one data set in the list of loaded domains. */ + retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, + strlen (dirname) + 1, 0, locale, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, domainname, 0); + if (retval != NULL) + { + /* We know something about this locale. */ + int cnt; + + if (retval->decided == 0) + _nl_load_domain (retval, domainbinding); + + if (retval->data != NULL) + return retval; + + for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) + { + if (retval->successor[cnt]->decided == 0) + _nl_load_domain (retval->successor[cnt], domainbinding); + + if (retval->successor[cnt]->data != NULL) + break; + } + return cnt >= 0 ? retval : NULL; + /* NOTREACHED */ + } + + /* See whether the locale value is an alias. If yes its value + *overwrites* the alias name. No test for the original value is + done. */ + alias_value = _nl_expand_alias (locale); + if (alias_value != NULL) + { +#if defined _LIBC || defined HAVE_STRDUP + locale = strdup (alias_value); + if (locale == NULL) + return NULL; +#else + size_t len = strlen (alias_value) + 1; + locale = (char *) malloc (len); + if (locale == NULL) + return NULL; + + memcpy (locale, alias_value, len); +#endif + } + + /* Now we determine the single parts of the locale name. First + look for the language. Termination symbols are `_' and `@' if + we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ + mask = _nl_explode_name (locale, &language, &modifier, &territory, + &codeset, &normalized_codeset, &special, + &sponsor, &revision); + + /* Create all possible locale entries which might be interested in + generalization. */ + retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, + strlen (dirname) + 1, mask, language, territory, + codeset, normalized_codeset, modifier, special, + sponsor, revision, domainname, 1); + if (retval == NULL) + /* This means we are out of core. */ + return NULL; + + if (retval->decided == 0) + _nl_load_domain (retval, domainbinding); + if (retval->data == NULL) + { + int cnt; + for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) + { + if (retval->successor[cnt]->decided == 0) + _nl_load_domain (retval->successor[cnt], domainbinding); + if (retval->successor[cnt]->data != NULL) + break; + } + } + + /* The room for an alias was dynamically allocated. Free it now. */ + if (alias_value != NULL) + free (locale); + + /* The space for normalized_codeset is dynamically allocated. Free it. */ + if (mask & XPG_NORM_CODESET) + free ((void *) normalized_codeset); + + return retval; +} + + +#ifdef _LIBC +static void __attribute__ ((unused)) +free_mem (void) +{ + struct loaded_l10nfile *runp = _nl_loaded_domains; + + while (runp != NULL) + { + struct loaded_l10nfile *here = runp; + if (runp->data != NULL) + _nl_unload_domain ((struct loaded_domain *) runp->data); + runp = runp->next; + free ((char *) here->filename); + free (here); + } +} + +text_set_element (__libc_subfreeres, free_mem); +#endif diff --git a/intl/gettext.c b/intl/gettext.c new file mode 100644 index 0000000..43d689f --- /dev/null +++ b/intl/gettext.c @@ -0,0 +1,64 @@ +/* Implementation of gettext(3) function. + Copyright (C) 1995, 1997, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#ifdef _LIBC +# define __need_NULL +# include +#else +# include /* Just for NULL. */ +#endif + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define GETTEXT __gettext +# define DCGETTEXT INTUSE(__dcgettext) +#else +# define GETTEXT libintl_gettext +# define DCGETTEXT libintl_dcgettext +#endif + +/* Look up MSGID in the current default message catalog for the current + LC_MESSAGES locale. If not found, returns MSGID itself (the default + text). */ +char * +GETTEXT (msgid) + const char *msgid; +{ + return DCGETTEXT (NULL, msgid, LC_MESSAGES); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__gettext, gettext); +#endif diff --git a/intl/gettextP.h b/intl/gettextP.h new file mode 100644 index 0000000..f085c59 --- /dev/null +++ b/intl/gettextP.h @@ -0,0 +1,242 @@ +/* Header describing internals of libintl library. + Copyright (C) 1995-1999, 2000-2002 Free Software Foundation, Inc. + Written by Ulrich Drepper , 1995. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _GETTEXTP_H +#define _GETTEXTP_H + +#include /* Get size_t. */ + +#ifdef _LIBC +# include "../iconv/gconv_int.h" +#else +# if HAVE_ICONV +# include +# endif +#endif + +#include "loadinfo.h" + +#include "gmo.h" /* Get nls_uint32. */ + +/* @@ end of prolog @@ */ + +#ifndef PARAMS +# if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif +#endif + +#ifndef internal_function +# define internal_function +#endif + +#ifndef attribute_hidden +# define attribute_hidden +#endif + +/* Tell the compiler when a conditional or integer expression is + almost always true or almost always false. */ +#ifndef HAVE_BUILTIN_EXPECT +# define __builtin_expect(expr, val) (expr) +#endif + +#ifndef W +# define W(flag, data) ((flag) ? SWAP (data) : (data)) +#endif + + +#ifdef _LIBC +# include +# define SWAP(i) bswap_32 (i) +#else +static inline nls_uint32 +SWAP (i) + nls_uint32 i; +{ + return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24); +} +#endif + + +/* In-memory representation of system dependent string. */ +struct sysdep_string_desc +{ + /* Length of addressed string, including the trailing NUL. */ + size_t length; + /* Pointer to addressed string. */ + const char *pointer; +}; + +/* The representation of an opened message catalog. */ +struct loaded_domain +{ + /* Pointer to memory containing the .mo file. */ + const char *data; + /* 1 if the memory is mmap()ed, 0 if the memory is malloc()ed. */ + int use_mmap; + /* Size of mmap()ed memory. */ + size_t mmap_size; + /* 1 if the .mo file uses a different endianness than this machine. */ + int must_swap; + /* Pointer to additional malloc()ed memory. */ + void *malloced; + + /* Number of static strings pairs. */ + nls_uint32 nstrings; + /* Pointer to descriptors of original strings in the file. */ + const struct string_desc *orig_tab; + /* Pointer to descriptors of translated strings in the file. */ + const struct string_desc *trans_tab; + + /* Number of system dependent strings pairs. */ + nls_uint32 n_sysdep_strings; + /* Pointer to descriptors of original sysdep strings. */ + const struct sysdep_string_desc *orig_sysdep_tab; + /* Pointer to descriptors of translated sysdep strings. */ + const struct sysdep_string_desc *trans_sysdep_tab; + + /* Size of hash table. */ + nls_uint32 hash_size; + /* Pointer to hash table. */ + const nls_uint32 *hash_tab; + /* 1 if the hash table uses a different endianness than this machine. */ + int must_swap_hash_tab; + + int codeset_cntr; +#ifdef _LIBC + __gconv_t conv; +#else +# if HAVE_ICONV + iconv_t conv; +# endif +#endif + char **conv_tab; + + struct expression *plural; + unsigned long int nplurals; +}; + +/* We want to allocate a string at the end of the struct. But ISO C + doesn't allow zero sized arrays. */ +#ifdef __GNUC__ +# define ZERO 0 +#else +# define ZERO 1 +#endif + +/* A set of settings bound to a message domain. Used to store settings + from bindtextdomain() and bind_textdomain_codeset(). */ +struct binding +{ + struct binding *next; + char *dirname; + int codeset_cntr; /* Incremented each time codeset changes. */ + char *codeset; + char domainname[ZERO]; +}; + +/* A counter which is incremented each time some previous translations + become invalid. + This variable is part of the external ABI of the GNU libintl. */ +extern int _nl_msg_cat_cntr; + +#ifndef _LIBC +const char *_nl_locale_name PARAMS ((int category, const char *categoryname)); +#endif + +struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname, + char *__locale, + const char *__domainname, + struct binding *__domainbinding)) + internal_function; +void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain, + struct binding *__domainbinding)) + internal_function; +void _nl_unload_domain PARAMS ((struct loaded_domain *__domain)) + internal_function; +const char *_nl_init_domain_conv PARAMS ((struct loaded_l10nfile *__domain_file, + struct loaded_domain *__domain, + struct binding *__domainbinding)) + internal_function; +void _nl_free_domain_conv PARAMS ((struct loaded_domain *__domain)) + internal_function; + +char *_nl_find_msg PARAMS ((struct loaded_l10nfile *domain_file, + struct binding *domainbinding, + const char *msgid, size_t *lengthp)) + internal_function; + +#ifdef _LIBC +extern char *__gettext PARAMS ((const char *__msgid)); +extern char *__dgettext PARAMS ((const char *__domainname, + const char *__msgid)); +extern char *__dcgettext PARAMS ((const char *__domainname, + const char *__msgid, int __category)); +extern char *__ngettext PARAMS ((const char *__msgid1, const char *__msgid2, + unsigned long int __n)); +extern char *__dngettext PARAMS ((const char *__domainname, + const char *__msgid1, const char *__msgid2, + unsigned long int n)); +extern char *__dcngettext PARAMS ((const char *__domainname, + const char *__msgid1, const char *__msgid2, + unsigned long int __n, int __category)); +extern char *__dcigettext PARAMS ((const char *__domainname, + const char *__msgid1, const char *__msgid2, + int __plural, unsigned long int __n, + int __category)); +extern char *__textdomain PARAMS ((const char *__domainname)); +extern char *__bindtextdomain PARAMS ((const char *__domainname, + const char *__dirname)); +extern char *__bind_textdomain_codeset PARAMS ((const char *__domainname, + const char *__codeset)); +#else +extern char *libintl_gettext PARAMS ((const char *__msgid)); +extern char *libintl_dgettext PARAMS ((const char *__domainname, + const char *__msgid)); +extern char *libintl_dcgettext PARAMS ((const char *__domainname, + const char *__msgid, int __category)); +extern char *libintl_ngettext PARAMS ((const char *__msgid1, + const char *__msgid2, + unsigned long int __n)); +extern char *libintl_dngettext PARAMS ((const char *__domainname, + const char *__msgid1, + const char *__msgid2, + unsigned long int __n)); +extern char *libintl_dcngettext PARAMS ((const char *__domainname, + const char *__msgid1, + const char *__msgid2, + unsigned long int __n, + int __category)); +extern char *libintl_dcigettext PARAMS ((const char *__domainname, + const char *__msgid1, + const char *__msgid2, + int __plural, unsigned long int __n, + int __category)); +extern char *libintl_textdomain PARAMS ((const char *__domainname)); +extern char *libintl_bindtextdomain PARAMS ((const char *__domainname, + const char *__dirname)); +extern char *libintl_bind_textdomain_codeset PARAMS ((const char *__domainname, + const char *__codeset)); +#endif + +/* @@ begin of epilog @@ */ + +#endif /* gettextP.h */ diff --git a/intl/gmo.h b/intl/gmo.h new file mode 100644 index 0000000..d1fe4d6 --- /dev/null +++ b/intl/gmo.h @@ -0,0 +1,148 @@ +/* Description of GNU message catalog format: general file layout. + Copyright (C) 1995, 1997, 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _GETTEXT_H +#define _GETTEXT_H 1 + +#include + +/* @@ end of prolog @@ */ + +/* The magic number of the GNU message catalog format. */ +#define _MAGIC 0x950412de +#define _MAGIC_SWAPPED 0xde120495 + +/* Revision number of the currently used .mo (binary) file format. */ +#define MO_REVISION_NUMBER 0 + +/* The following contortions are an attempt to use the C preprocessor + to determine an unsigned integral type that is 32 bits wide. An + alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but + as of version autoconf-2.13, the AC_CHECK_SIZEOF macro doesn't work + when cross-compiling. */ + +#if __STDC__ +# define UINT_MAX_32_BITS 4294967295U +#else +# define UINT_MAX_32_BITS 0xFFFFFFFF +#endif + +/* If UINT_MAX isn't defined, assume it's a 32-bit type. + This should be valid for all systems GNU cares about because + that doesn't include 16-bit systems, and only modern systems + (that certainly have ) have 64+-bit integral types. */ + +#ifndef UINT_MAX +# define UINT_MAX UINT_MAX_32_BITS +#endif + +#if UINT_MAX == UINT_MAX_32_BITS +typedef unsigned nls_uint32; +#else +# if USHRT_MAX == UINT_MAX_32_BITS +typedef unsigned short nls_uint32; +# else +# if ULONG_MAX == UINT_MAX_32_BITS +typedef unsigned long nls_uint32; +# else + /* The following line is intended to throw an error. Using #error is + not portable enough. */ + "Cannot determine unsigned 32-bit data type." +# endif +# endif +#endif + + +/* Header for binary .mo file format. */ +struct mo_file_header +{ + /* The magic number. */ + nls_uint32 magic; + /* The revision number of the file format. */ + nls_uint32 revision; + + /* The following are only used in .mo files with major revision 0. */ + + /* The number of strings pairs. */ + nls_uint32 nstrings; + /* Offset of table with start offsets of original strings. */ + nls_uint32 orig_tab_offset; + /* Offset of table with start offsets of translated strings. */ + nls_uint32 trans_tab_offset; + /* Size of hash table. */ + nls_uint32 hash_tab_size; + /* Offset of first hash table entry. */ + nls_uint32 hash_tab_offset; + + /* The following are only used in .mo files with minor revision >= 1. */ + + /* The number of system dependent segments. */ + nls_uint32 n_sysdep_segments; + /* Offset of table describing system dependent segments. */ + nls_uint32 sysdep_segments_offset; + /* The number of system dependent strings pairs. */ + nls_uint32 n_sysdep_strings; + /* Offset of table with start offsets of original sysdep strings. */ + nls_uint32 orig_sysdep_tab_offset; + /* Offset of table with start offsets of translated sysdep strings. */ + nls_uint32 trans_sysdep_tab_offset; +}; + +/* Descriptor for static string contained in the binary .mo file. */ +struct string_desc +{ + /* Length of addressed string, not including the trailing NUL. */ + nls_uint32 length; + /* Offset of string in file. */ + nls_uint32 offset; +}; + +/* The following are only used in .mo files with minor revision >= 1. */ + +/* Descriptor for system dependent string segment. */ +struct sysdep_segment +{ + /* Length of addressed string, including the trailing NUL. */ + nls_uint32 length; + /* Offset of string in file. */ + nls_uint32 offset; +}; + +/* Descriptor for system dependent string. */ +struct sysdep_string +{ + /* Offset of static string segments in file. */ + nls_uint32 offset; + /* Alternating sequence of static and system dependent segments. + The last segment is a static segment, including the trailing NUL. */ + struct segment_pair + { + /* Size of static segment. */ + nls_uint32 segsize; + /* Reference to system dependent string segment, or ~0 at the end. */ + nls_uint32 sysdepref; + } segments[1]; +}; + +/* Marker for the end of the segments[] array. This has the value 0xFFFFFFFF, + regardless whether 'int' is 16 bit, 32 bit, or 64 bit. */ +#define SEGMENTS_END ((nls_uint32) ~0) + +/* @@ begin of epilog @@ */ + +#endif /* gettext.h */ diff --git a/intl/hash-string.h b/intl/hash-string.h new file mode 100644 index 0000000..b267a87 --- /dev/null +++ b/intl/hash-string.h @@ -0,0 +1,59 @@ +/* Description of GNU message catalog format: string hashing function. + Copyright (C) 1995, 1997, 1998, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* @@ end of prolog @@ */ + +#ifndef PARAMS +# if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES +# define PARAMS(Args) Args +# else +# define PARAMS(Args) () +# endif +#endif + +/* We assume to have `unsigned long int' value with at least 32 bits. */ +#define HASHWORDBITS 32 + + +/* Defines the so called `hashpjw' function by P.J. Weinberger + [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools, + 1986, 1987 Bell Telephone Laboratories, Inc.] */ +static unsigned long int hash_string PARAMS ((const char *__str_param)); + +static inline unsigned long int +hash_string (str_param) + const char *str_param; +{ + unsigned long int hval, g; + const char *str = str_param; + + /* Compute the hash value for the given string. */ + hval = 0; + while (*str != '\0') + { + hval <<= 4; + hval += (unsigned long int) *str++; + g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4)); + if (g != 0) + { + hval ^= g >> (HASHWORDBITS - 8); + hval ^= g; + } + } + return hval; +} diff --git a/intl/intl-compat.c b/intl/intl-compat.c new file mode 100644 index 0000000..da89015 --- /dev/null +++ b/intl/intl-compat.c @@ -0,0 +1,131 @@ +/* intl-compat.c - Stub functions to call gettext functions from GNU gettext + Library. + Copyright (C) 1995, 2000-2002 Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#define _INTL_REDIRECT_MACROS +#include "libgnuintl.h" +#include "gettextP.h" + +/* @@ end of prolog @@ */ + +/* This file redirects the gettext functions (without prefix) to those + defined in the included GNU libintl library (with "libintl_" prefix). + It is compiled into libintl in order to make the AM_GNU_GETTEXT test + of gettext <= 0.11.2 work with the libintl library >= 0.11.3 which + has the redirections primarily in the include file. */ + + +#undef gettext +#undef dgettext +#undef dcgettext +#undef ngettext +#undef dngettext +#undef dcngettext +#undef textdomain +#undef bindtextdomain +#undef bind_textdomain_codeset + + +char * +gettext (msgid) + const char *msgid; +{ + return libintl_gettext (msgid); +} + + +char * +dgettext (domainname, msgid) + const char *domainname; + const char *msgid; +{ + return libintl_dgettext (domainname, msgid); +} + + +char * +dcgettext (domainname, msgid, category) + const char *domainname; + const char *msgid; + int category; +{ + return libintl_dcgettext (domainname, msgid, category); +} + + +char * +ngettext (msgid1, msgid2, n) + const char *msgid1; + const char *msgid2; + unsigned long int n; +{ + return libintl_ngettext (msgid1, msgid2, n); +} + + +char * +dngettext (domainname, msgid1, msgid2, n) + const char *domainname; + const char *msgid1; + const char *msgid2; + unsigned long int n; +{ + return libintl_dngettext (domainname, msgid1, msgid2, n); +} + + +char * +dcngettext (domainname, msgid1, msgid2, n, category) + const char *domainname; + const char *msgid1; + const char *msgid2; + unsigned long int n; + int category; +{ + return libintl_dcngettext (domainname, msgid1, msgid2, n, category); +} + + +char * +textdomain (domainname) + const char *domainname; +{ + return libintl_textdomain (domainname); +} + + +char * +bindtextdomain (domainname, dirname) + const char *domainname; + const char *dirname; +{ + return libintl_bindtextdomain (domainname, dirname); +} + + +char * +bind_textdomain_codeset (domainname, codeset) + const char *domainname; + const char *codeset; +{ + return libintl_bind_textdomain_codeset (domainname, codeset); +} diff --git a/intl/l10nflist.c b/intl/l10nflist.c new file mode 100644 index 0000000..ec8713f --- /dev/null +++ b/intl/l10nflist.c @@ -0,0 +1,453 @@ +/* Copyright (C) 1995-1999, 2000, 2001, 2002 Free Software Foundation, Inc. + Contributed by Ulrich Drepper , 1995. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Tell glibc's to provide a prototype for stpcpy(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#if defined _LIBC || defined HAVE_ARGZ_H +# include +#endif +#include +#include +#include + +#include "loadinfo.h" + +/* On some strange systems still no definition of NULL is found. Sigh! */ +#ifndef NULL +# if defined __STDC__ && __STDC__ +# define NULL ((void *) 0) +# else +# define NULL 0 +# endif +#endif + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# ifndef stpcpy +# define stpcpy(dest, src) __stpcpy(dest, src) +# endif +#else +# ifndef HAVE_STPCPY +static char *stpcpy PARAMS ((char *dest, const char *src)); +# endif +#endif + +/* Pathname support. + ISSLASH(C) tests whether C is a directory separator character. + IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not, + it may be concatenated to a directory pathname. + */ +#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ + /* Win32, OS/2, DOS */ +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +# define HAS_DEVICE(P) \ + ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ + && (P)[1] == ':') +# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P)) +#else + /* Unix */ +# define ISSLASH(C) ((C) == '/') +# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0]) +#endif + +/* Define function which are usually not available. */ + +#if !defined _LIBC && !defined HAVE___ARGZ_COUNT +/* Returns the number of strings in ARGZ. */ +static size_t argz_count__ PARAMS ((const char *argz, size_t len)); + +static size_t +argz_count__ (argz, len) + const char *argz; + size_t len; +{ + size_t count = 0; + while (len > 0) + { + size_t part_len = strlen (argz); + argz += part_len + 1; + len -= part_len + 1; + count++; + } + return count; +} +# undef __argz_count +# define __argz_count(argz, len) argz_count__ (argz, len) +#else +# ifdef _LIBC +# define __argz_count(argz, len) INTUSE(__argz_count) (argz, len) +# endif +#endif /* !_LIBC && !HAVE___ARGZ_COUNT */ + +#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY +/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's + except the last into the character SEP. */ +static void argz_stringify__ PARAMS ((char *argz, size_t len, int sep)); + +static void +argz_stringify__ (argz, len, sep) + char *argz; + size_t len; + int sep; +{ + while (len > 0) + { + size_t part_len = strlen (argz); + argz += part_len; + len -= part_len + 1; + if (len > 0) + *argz++ = sep; + } +} +# undef __argz_stringify +# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep) +#else +# ifdef _LIBC +# define __argz_stringify(argz, len, sep) \ + INTUSE(__argz_stringify) (argz, len, sep) +# endif +#endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */ + +#if !defined _LIBC && !defined HAVE___ARGZ_NEXT +static char *argz_next__ PARAMS ((char *argz, size_t argz_len, + const char *entry)); + +static char * +argz_next__ (argz, argz_len, entry) + char *argz; + size_t argz_len; + const char *entry; +{ + if (entry) + { + if (entry < argz + argz_len) + entry = strchr (entry, '\0') + 1; + + return entry >= argz + argz_len ? NULL : (char *) entry; + } + else + if (argz_len > 0) + return argz; + else + return 0; +} +# undef __argz_next +# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry) +#endif /* !_LIBC && !HAVE___ARGZ_NEXT */ + + +/* Return number of bits set in X. */ +static int pop PARAMS ((int x)); + +static inline int +pop (x) + int x; +{ + /* We assume that no more than 16 bits are used. */ + x = ((x & ~0x5555) >> 1) + (x & 0x5555); + x = ((x & ~0x3333) >> 2) + (x & 0x3333); + x = ((x >> 4) + x) & 0x0f0f; + x = ((x >> 8) + x) & 0xff; + + return x; +} + + +struct loaded_l10nfile * +_nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language, + territory, codeset, normalized_codeset, modifier, special, + sponsor, revision, filename, do_allocate) + struct loaded_l10nfile **l10nfile_list; + const char *dirlist; + size_t dirlist_len; + int mask; + const char *language; + const char *territory; + const char *codeset; + const char *normalized_codeset; + const char *modifier; + const char *special; + const char *sponsor; + const char *revision; + const char *filename; + int do_allocate; +{ + char *abs_filename; + struct loaded_l10nfile **lastp; + struct loaded_l10nfile *retval; + char *cp; + size_t dirlist_count; + size_t entries; + int cnt; + + /* If LANGUAGE contains an absolute directory specification, we ignore + DIRLIST. */ + if (IS_ABSOLUTE_PATH (language)) + dirlist_len = 0; + + /* Allocate room for the full file name. */ + abs_filename = (char *) malloc (dirlist_len + + strlen (language) + + ((mask & TERRITORY) != 0 + ? strlen (territory) + 1 : 0) + + ((mask & XPG_CODESET) != 0 + ? strlen (codeset) + 1 : 0) + + ((mask & XPG_NORM_CODESET) != 0 + ? strlen (normalized_codeset) + 1 : 0) + + (((mask & XPG_MODIFIER) != 0 + || (mask & CEN_AUDIENCE) != 0) + ? strlen (modifier) + 1 : 0) + + ((mask & CEN_SPECIAL) != 0 + ? strlen (special) + 1 : 0) + + (((mask & CEN_SPONSOR) != 0 + || (mask & CEN_REVISION) != 0) + ? (1 + ((mask & CEN_SPONSOR) != 0 + ? strlen (sponsor) : 0) + + ((mask & CEN_REVISION) != 0 + ? strlen (revision) + 1 : 0)) : 0) + + 1 + strlen (filename) + 1); + + if (abs_filename == NULL) + return NULL; + + /* Construct file name. */ + cp = abs_filename; + if (dirlist_len > 0) + { + memcpy (cp, dirlist, dirlist_len); + __argz_stringify (cp, dirlist_len, PATH_SEPARATOR); + cp += dirlist_len; + cp[-1] = '/'; + } + + cp = stpcpy (cp, language); + + if ((mask & TERRITORY) != 0) + { + *cp++ = '_'; + cp = stpcpy (cp, territory); + } + if ((mask & XPG_CODESET) != 0) + { + *cp++ = '.'; + cp = stpcpy (cp, codeset); + } + if ((mask & XPG_NORM_CODESET) != 0) + { + *cp++ = '.'; + cp = stpcpy (cp, normalized_codeset); + } + if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0) + { + /* This component can be part of both syntaces but has different + leading characters. For CEN we use `+', else `@'. */ + *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@'; + cp = stpcpy (cp, modifier); + } + if ((mask & CEN_SPECIAL) != 0) + { + *cp++ = '+'; + cp = stpcpy (cp, special); + } + if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0) + { + *cp++ = ','; + if ((mask & CEN_SPONSOR) != 0) + cp = stpcpy (cp, sponsor); + if ((mask & CEN_REVISION) != 0) + { + *cp++ = '_'; + cp = stpcpy (cp, revision); + } + } + + *cp++ = '/'; + stpcpy (cp, filename); + + /* Look in list of already loaded domains whether it is already + available. */ + lastp = l10nfile_list; + for (retval = *l10nfile_list; retval != NULL; retval = retval->next) + if (retval->filename != NULL) + { + int compare = strcmp (retval->filename, abs_filename); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It's not in the list. */ + retval = NULL; + break; + } + + lastp = &retval->next; + } + + if (retval != NULL || do_allocate == 0) + { + free (abs_filename); + return retval; + } + + dirlist_count = (dirlist_len > 0 ? __argz_count (dirlist, dirlist_len) : 1); + + /* Allocate a new loaded_l10nfile. */ + retval = + (struct loaded_l10nfile *) + malloc (sizeof (*retval) + + (((dirlist_count << pop (mask)) + (dirlist_count > 1 ? 1 : 0)) + * sizeof (struct loaded_l10nfile *))); + if (retval == NULL) + return NULL; + + retval->filename = abs_filename; + + /* We set retval->data to NULL here; it is filled in later. + Setting retval->decided to 1 here means that retval does not + correspond to a real file (dirlist_count > 1) or is not worth + looking up (if an unnormalized codeset was specified). */ + retval->decided = (dirlist_count > 1 + || ((mask & XPG_CODESET) != 0 + && (mask & XPG_NORM_CODESET) != 0)); + retval->data = NULL; + + retval->next = *lastp; + *lastp = retval; + + entries = 0; + /* Recurse to fill the inheritance list of RETVAL. + If the DIRLIST is a real list (i.e. DIRLIST_COUNT > 1), the RETVAL + entry does not correspond to a real file; retval->filename contains + colons. In this case we loop across all elements of DIRLIST and + across all bit patterns dominated by MASK. + If the DIRLIST is a single directory or entirely redundant (i.e. + DIRLIST_COUNT == 1), we loop across all bit patterns dominated by + MASK, excluding MASK itself. + In either case, we loop down from MASK to 0. This has the effect + that the extra bits in the locale name are dropped in this order: + first the modifier, then the territory, then the codeset, then the + normalized_codeset. */ + for (cnt = dirlist_count > 1 ? mask : mask - 1; cnt >= 0; --cnt) + if ((cnt & ~mask) == 0 + && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0) + && ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0)) + { + if (dirlist_count > 1) + { + /* Iterate over all elements of the DIRLIST. */ + char *dir = NULL; + + while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir)) + != NULL) + retval->successor[entries++] + = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, + cnt, language, territory, codeset, + normalized_codeset, modifier, special, + sponsor, revision, filename, 1); + } + else + retval->successor[entries++] + = _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, + cnt, language, territory, codeset, + normalized_codeset, modifier, special, + sponsor, revision, filename, 1); + } + retval->successor[entries] = NULL; + + return retval; +} + +/* Normalize codeset name. There is no standard for the codeset + names. Normalization allows the user to use any of the common + names. The return value is dynamically allocated and has to be + freed by the caller. */ +const char * +_nl_normalize_codeset (codeset, name_len) + const char *codeset; + size_t name_len; +{ + int len = 0; + int only_digit = 1; + char *retval; + char *wp; + size_t cnt; + + for (cnt = 0; cnt < name_len; ++cnt) + if (isalnum ((unsigned char) codeset[cnt])) + { + ++len; + + if (isalpha ((unsigned char) codeset[cnt])) + only_digit = 0; + } + + retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1); + + if (retval != NULL) + { + if (only_digit) + wp = stpcpy (retval, "iso"); + else + wp = retval; + + for (cnt = 0; cnt < name_len; ++cnt) + if (isalpha ((unsigned char) codeset[cnt])) + *wp++ = tolower ((unsigned char) codeset[cnt]); + else if (isdigit ((unsigned char) codeset[cnt])) + *wp++ = codeset[cnt]; + + *wp = '\0'; + } + + return (const char *) retval; +} + + +/* @@ begin of epilog @@ */ + +/* We don't want libintl.a to depend on any other library. So we + avoid the non-standard function stpcpy. In GNU C Library this + function is available, though. Also allow the symbol HAVE_STPCPY + to be defined. */ +#if !_LIBC && !HAVE_STPCPY +static char * +stpcpy (dest, src) + char *dest; + const char *src; +{ + while ((*dest++ = *src++) != '\0') + /* Do nothing. */ ; + return dest - 1; +} +#endif diff --git a/intl/libgnuintl.h b/intl/libgnuintl.h new file mode 100644 index 0000000..ed25fe9 --- /dev/null +++ b/intl/libgnuintl.h @@ -0,0 +1,296 @@ +/* Message catalogs for internationalization. + Copyright (C) 1995-1997, 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _LIBINTL_H +#define _LIBINTL_H 1 + +#include + +/* The LC_MESSAGES locale category is the category used by the functions + gettext() and dgettext(). It is specified in POSIX, but not in ANSI C. + On systems that don't define it, use an arbitrary value instead. + On Solaris, defines __LOCALE_H (or _LOCALE_H in Solaris 2.5) + then includes (i.e. this file!) and then only defines + LC_MESSAGES. To avoid a redefinition warning, don't define LC_MESSAGES + in this case. */ +#if !defined LC_MESSAGES && !(defined __LOCALE_H || (defined _LOCALE_H && defined __sun)) +# define LC_MESSAGES 1729 +#endif + +/* We define an additional symbol to signal that we use the GNU + implementation of gettext. */ +#define __USE_GNU_GETTEXT 1 + +/* Provide information about the supported file formats. Returns the + maximum minor revision number supported for a given major revision. */ +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) \ + ((major) == 0 ? 1 : -1) + +/* Resolve a platform specific conflict on DJGPP. GNU gettext takes + precedence over _conio_gettext. */ +#ifdef __DJGPP__ +# undef gettext +#endif + +/* Use _INTL_PARAMS, not PARAMS, in order to avoid clashes with identifiers + used by programs. Similarly, test __PROTOTYPES, not PROTOTYPES. */ +#ifndef _INTL_PARAMS +# if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES +# define _INTL_PARAMS(args) args +# else +# define _INTL_PARAMS(args) () +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + +/* We redirect the functions to those prefixed with "libintl_". This is + necessary, because some systems define gettext/textdomain/... in the C + library (namely, Solaris 2.4 and newer, and GNU libc 2.0 and newer). + If we used the unprefixed names, there would be cases where the + definition in the C library would override the one in the libintl.so + shared library. Recall that on ELF systems, the symbols are looked + up in the following order: + 1. in the executable, + 2. in the shared libraries specified on the link command line, in order, + 3. in the dependencies of the shared libraries specified on the link + command line, + 4. in the dlopen()ed shared libraries, in the order in which they were + dlopen()ed. + The definition in the C library would override the one in libintl.so if + either + * -lc is given on the link command line and -lintl isn't, or + * -lc is given on the link command line before -lintl, or + * libintl.so is a dependency of a dlopen()ed shared library but not + linked to the executable at link time. + Since Solaris gettext() behaves differently than GNU gettext(), this + would be unacceptable. + + The redirection happens by default through macros in C, so that &gettext + is independent of the compilation unit, but through inline functions in + C++, in order not to interfere with the name mangling of class fields or + class methods called 'gettext'. */ + +/* The user can define _INTL_REDIRECT_INLINE or _INTL_REDIRECT_MACROS. + If he doesn't, we choose the method. A third possible method is + _INTL_REDIRECT_ASM, supported only by GCC. */ +#if !(defined _INTL_REDIRECT_INLINE || defined _INTL_REDIRECT_MACROS) +# if __GNUC__ >= 2 && (defined __STDC__ || defined __cplusplus) +# define _INTL_REDIRECT_ASM +# else +# ifdef __cplusplus +# define _INTL_REDIRECT_INLINE +# else +# define _INTL_REDIRECT_MACROS +# endif +# endif +#endif +/* Auxiliary macros. */ +#ifdef _INTL_REDIRECT_ASM +# define _INTL_ASM(cname) __asm__ (_INTL_ASMNAME (__USER_LABEL_PREFIX__, #cname)) +# define _INTL_ASMNAME(prefix,cnamestring) _INTL_STRINGIFY (prefix) cnamestring +# define _INTL_STRINGIFY(prefix) #prefix +#else +# define _INTL_ASM(cname) +#endif + +/* Look up MSGID in the current default message catalog for the current + LC_MESSAGES locale. If not found, returns MSGID itself (the default + text). */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_gettext (const char *__msgid); +static inline char *gettext (const char *__msgid) +{ + return libintl_gettext (__msgid); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define gettext libintl_gettext +#endif +extern char *gettext _INTL_PARAMS ((const char *__msgid)) + _INTL_ASM (libintl_gettext); +#endif + +/* Look up MSGID in the DOMAINNAME message catalog for the current + LC_MESSAGES locale. */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_dgettext (const char *__domainname, const char *__msgid); +static inline char *dgettext (const char *__domainname, const char *__msgid) +{ + return libintl_dgettext (__domainname, __msgid); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define dgettext libintl_dgettext +#endif +extern char *dgettext _INTL_PARAMS ((const char *__domainname, + const char *__msgid)) + _INTL_ASM (libintl_dgettext); +#endif + +/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY + locale. */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_dcgettext (const char *__domainname, const char *__msgid, + int __category); +static inline char *dcgettext (const char *__domainname, const char *__msgid, + int __category) +{ + return libintl_dcgettext (__domainname, __msgid, __category); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define dcgettext libintl_dcgettext +#endif +extern char *dcgettext _INTL_PARAMS ((const char *__domainname, + const char *__msgid, + int __category)) + _INTL_ASM (libintl_dcgettext); +#endif + + +/* Similar to `gettext' but select the plural form corresponding to the + number N. */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_ngettext (const char *__msgid1, const char *__msgid2, + unsigned long int __n); +static inline char *ngettext (const char *__msgid1, const char *__msgid2, + unsigned long int __n) +{ + return libintl_ngettext (__msgid1, __msgid2, __n); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define ngettext libintl_ngettext +#endif +extern char *ngettext _INTL_PARAMS ((const char *__msgid1, + const char *__msgid2, + unsigned long int __n)) + _INTL_ASM (libintl_ngettext); +#endif + +/* Similar to `dgettext' but select the plural form corresponding to the + number N. */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_dngettext (const char *__domainname, const char *__msgid1, + const char *__msgid2, unsigned long int __n); +static inline char *dngettext (const char *__domainname, const char *__msgid1, + const char *__msgid2, unsigned long int __n) +{ + return libintl_dngettext (__domainname, __msgid1, __msgid2, __n); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define dngettext libintl_dngettext +#endif +extern char *dngettext _INTL_PARAMS ((const char *__domainname, + const char *__msgid1, + const char *__msgid2, + unsigned long int __n)) + _INTL_ASM (libintl_dngettext); +#endif + +/* Similar to `dcgettext' but select the plural form corresponding to the + number N. */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_dcngettext (const char *__domainname, + const char *__msgid1, const char *__msgid2, + unsigned long int __n, int __category); +static inline char *dcngettext (const char *__domainname, + const char *__msgid1, const char *__msgid2, + unsigned long int __n, int __category) +{ + return libintl_dcngettext (__domainname, __msgid1, __msgid2, __n, __category); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define dcngettext libintl_dcngettext +#endif +extern char *dcngettext _INTL_PARAMS ((const char *__domainname, + const char *__msgid1, + const char *__msgid2, + unsigned long int __n, + int __category)) + _INTL_ASM (libintl_dcngettext); +#endif + + +/* Set the current default message catalog to DOMAINNAME. + If DOMAINNAME is null, return the current default. + If DOMAINNAME is "", reset to the default of "messages". */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_textdomain (const char *__domainname); +static inline char *textdomain (const char *__domainname) +{ + return libintl_textdomain (__domainname); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define textdomain libintl_textdomain +#endif +extern char *textdomain _INTL_PARAMS ((const char *__domainname)) + _INTL_ASM (libintl_textdomain); +#endif + +/* Specify that the DOMAINNAME message catalog will be found + in DIRNAME rather than in the system locale data base. */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_bindtextdomain (const char *__domainname, + const char *__dirname); +static inline char *bindtextdomain (const char *__domainname, + const char *__dirname) +{ + return libintl_bindtextdomain (__domainname, __dirname); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define bindtextdomain libintl_bindtextdomain +#endif +extern char *bindtextdomain _INTL_PARAMS ((const char *__domainname, + const char *__dirname)) + _INTL_ASM (libintl_bindtextdomain); +#endif + +/* Specify the character encoding in which the messages from the + DOMAINNAME message catalog will be returned. */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_bind_textdomain_codeset (const char *__domainname, + const char *__codeset); +static inline char *bind_textdomain_codeset (const char *__domainname, + const char *__codeset) +{ + return libintl_bind_textdomain_codeset (__domainname, __codeset); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define bind_textdomain_codeset libintl_bind_textdomain_codeset +#endif +extern char *bind_textdomain_codeset _INTL_PARAMS ((const char *__domainname, + const char *__codeset)) + _INTL_ASM (libintl_bind_textdomain_codeset); +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* libintl.h */ diff --git a/intl/loadinfo.h b/intl/loadinfo.h new file mode 100644 index 0000000..1d3ba61 --- /dev/null +++ b/intl/loadinfo.h @@ -0,0 +1,156 @@ +/* Copyright (C) 1996-1999, 2000-2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1996. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _LOADINFO_H +#define _LOADINFO_H 1 + +/* Declarations of locale dependent catalog lookup functions. + Implemented in + + localealias.c Possibly replace a locale name by another. + explodename.c Split a locale name into its various fields. + l10nflist.c Generate a list of filenames of possible message catalogs. + finddomain.c Find and open the relevant message catalogs. + + The main function _nl_find_domain() in finddomain.c is declared + in gettextP.h. + */ + +#ifndef PARAMS +# if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif +#endif + +#ifndef internal_function +# define internal_function +#endif + +/* Tell the compiler when a conditional or integer expression is + almost always true or almost always false. */ +#ifndef HAVE_BUILTIN_EXPECT +# define __builtin_expect(expr, val) (expr) +#endif + +/* Separator in PATH like lists of pathnames. */ +#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ + /* Win32, OS/2, DOS */ +# define PATH_SEPARATOR ';' +#else + /* Unix */ +# define PATH_SEPARATOR ':' +#endif + +/* Encoding of locale name parts. */ +#define CEN_REVISION 1 +#define CEN_SPONSOR 2 +#define CEN_SPECIAL 4 +#define XPG_NORM_CODESET 8 +#define XPG_CODESET 16 +#define TERRITORY 32 +#define CEN_AUDIENCE 64 +#define XPG_MODIFIER 128 + +#define CEN_SPECIFIC (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE) +#define XPG_SPECIFIC (XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER) + + +struct loaded_l10nfile +{ + const char *filename; + int decided; + + const void *data; + + struct loaded_l10nfile *next; + struct loaded_l10nfile *successor[1]; +}; + + +/* Normalize codeset name. There is no standard for the codeset + names. Normalization allows the user to use any of the common + names. The return value is dynamically allocated and has to be + freed by the caller. */ +extern const char *_nl_normalize_codeset PARAMS ((const char *codeset, + size_t name_len)); + +/* Lookup a locale dependent file. + *L10NFILE_LIST denotes a pool of lookup results of locale dependent + files of the same kind, sorted in decreasing order of ->filename. + DIRLIST and DIRLIST_LEN are an argz list of directories in which to + look, containing at least one directory (i.e. DIRLIST_LEN > 0). + MASK, LANGUAGE, TERRITORY, CODESET, NORMALIZED_CODESET, MODIFIER, + SPECIAL, SPONSOR, REVISION are the pieces of the locale name, as + produced by _nl_explode_name(). FILENAME is the filename suffix. + The return value is the lookup result, either found in *L10NFILE_LIST, + or - if DO_ALLOCATE is nonzero - freshly allocated, or possibly NULL. + If the return value is non-NULL, it is added to *L10NFILE_LIST, and + its ->next field denotes the chaining inside *L10NFILE_LIST, and + furthermore its ->successor[] field contains a list of other lookup + results from which this lookup result inherits. */ +extern struct loaded_l10nfile * +_nl_make_l10nflist PARAMS ((struct loaded_l10nfile **l10nfile_list, + const char *dirlist, size_t dirlist_len, int mask, + const char *language, const char *territory, + const char *codeset, + const char *normalized_codeset, + const char *modifier, const char *special, + const char *sponsor, const char *revision, + const char *filename, int do_allocate)); + +/* Lookup the real locale name for a locale alias NAME, or NULL if + NAME is not a locale alias (but possibly a real locale name). + The return value is statically allocated and must not be freed. */ +extern const char *_nl_expand_alias PARAMS ((const char *name)); + +/* Split a locale name NAME into its pieces: language, modifier, + territory, codeset, special, sponsor, revision. + NAME gets destructively modified: NUL bytes are inserted here and + there. *LANGUAGE gets assigned NAME. Each of *MODIFIER, *TERRITORY, + *CODESET, *SPECIAL, *SPONSOR, *REVISION gets assigned either a + pointer into the old NAME string, or NULL. *NORMALIZED_CODESET + gets assigned the expanded *CODESET, if it is different from *CODESET; + this one is dynamically allocated and has to be freed by the caller. + The return value is a bitmask, where each bit corresponds to one + filled-in value: + XPG_MODIFIER, CEN_AUDIENCE for *MODIFIER, + TERRITORY for *TERRITORY, + XPG_CODESET for *CODESET, + XPG_NORM_CODESET for *NORMALIZED_CODESET, + CEN_SPECIAL for *SPECIAL, + CEN_SPONSOR for *SPONSOR, + CEN_REVISION for *REVISION. + */ +extern int _nl_explode_name PARAMS ((char *name, const char **language, + const char **modifier, + const char **territory, + const char **codeset, + const char **normalized_codeset, + const char **special, + const char **sponsor, + const char **revision)); + +/* Split a locale name NAME into a leading language part and all the + rest. Return a pointer to the first character after the language, + i.e. to the first byte of the rest. */ +extern char *_nl_find_language PARAMS ((const char *name)); + +#endif /* loadinfo.h */ diff --git a/intl/loadmsgcat.c b/intl/loadmsgcat.c new file mode 100644 index 0000000..516f521 --- /dev/null +++ b/intl/loadmsgcat.c @@ -0,0 +1,1316 @@ +/* Load needed message catalogs. + Copyright (C) 1995-1999, 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Tell glibc's to provide a prototype for mempcpy(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include + +#ifdef __GNUC__ +# define alloca __builtin_alloca +# define HAVE_ALLOCA 1 +#else +# if defined HAVE_ALLOCA_H || defined _LIBC +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca +char *alloca (); +# endif +# endif +# endif +#endif + +#include +#include + +#if defined HAVE_UNISTD_H || defined _LIBC +# include +#endif + +#ifdef _LIBC +# include +# include +#endif + +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || (defined _LIBC && defined _POSIX_MAPPED_FILES) +# include +# undef HAVE_MMAP +# define HAVE_MMAP 1 +#else +# undef HAVE_MMAP +#endif + +#if defined HAVE_STDINT_H_WITH_UINTMAX || defined _LIBC +# include +#endif +#if defined HAVE_INTTYPES_H || defined _LIBC +# include +#endif + +#include "gmo.h" +#include "gettextP.h" +#include "hash-string.h" +#include "plural-exp.h" + +#ifdef _LIBC +# include "../locale/localeinfo.h" +#endif + +/* Provide fallback values for macros that ought to be defined in . + Note that our fallback values need not be literal strings, because we don't + use them with preprocessor string concatenation. */ +#if !defined PRId8 || PRI_MACROS_BROKEN +# undef PRId8 +# define PRId8 "d" +#endif +#if !defined PRIi8 || PRI_MACROS_BROKEN +# undef PRIi8 +# define PRIi8 "i" +#endif +#if !defined PRIo8 || PRI_MACROS_BROKEN +# undef PRIo8 +# define PRIo8 "o" +#endif +#if !defined PRIu8 || PRI_MACROS_BROKEN +# undef PRIu8 +# define PRIu8 "u" +#endif +#if !defined PRIx8 || PRI_MACROS_BROKEN +# undef PRIx8 +# define PRIx8 "x" +#endif +#if !defined PRIX8 || PRI_MACROS_BROKEN +# undef PRIX8 +# define PRIX8 "X" +#endif +#if !defined PRId16 || PRI_MACROS_BROKEN +# undef PRId16 +# define PRId16 "d" +#endif +#if !defined PRIi16 || PRI_MACROS_BROKEN +# undef PRIi16 +# define PRIi16 "i" +#endif +#if !defined PRIo16 || PRI_MACROS_BROKEN +# undef PRIo16 +# define PRIo16 "o" +#endif +#if !defined PRIu16 || PRI_MACROS_BROKEN +# undef PRIu16 +# define PRIu16 "u" +#endif +#if !defined PRIx16 || PRI_MACROS_BROKEN +# undef PRIx16 +# define PRIx16 "x" +#endif +#if !defined PRIX16 || PRI_MACROS_BROKEN +# undef PRIX16 +# define PRIX16 "X" +#endif +#if !defined PRId32 || PRI_MACROS_BROKEN +# undef PRId32 +# define PRId32 "d" +#endif +#if !defined PRIi32 || PRI_MACROS_BROKEN +# undef PRIi32 +# define PRIi32 "i" +#endif +#if !defined PRIo32 || PRI_MACROS_BROKEN +# undef PRIo32 +# define PRIo32 "o" +#endif +#if !defined PRIu32 || PRI_MACROS_BROKEN +# undef PRIu32 +# define PRIu32 "u" +#endif +#if !defined PRIx32 || PRI_MACROS_BROKEN +# undef PRIx32 +# define PRIx32 "x" +#endif +#if !defined PRIX32 || PRI_MACROS_BROKEN +# undef PRIX32 +# define PRIX32 "X" +#endif +#if !defined PRId64 || PRI_MACROS_BROKEN +# undef PRId64 +# define PRId64 (sizeof (long) == 8 ? "ld" : "lld") +#endif +#if !defined PRIi64 || PRI_MACROS_BROKEN +# undef PRIi64 +# define PRIi64 (sizeof (long) == 8 ? "li" : "lli") +#endif +#if !defined PRIo64 || PRI_MACROS_BROKEN +# undef PRIo64 +# define PRIo64 (sizeof (long) == 8 ? "lo" : "llo") +#endif +#if !defined PRIu64 || PRI_MACROS_BROKEN +# undef PRIu64 +# define PRIu64 (sizeof (long) == 8 ? "lu" : "llu") +#endif +#if !defined PRIx64 || PRI_MACROS_BROKEN +# undef PRIx64 +# define PRIx64 (sizeof (long) == 8 ? "lx" : "llx") +#endif +#if !defined PRIX64 || PRI_MACROS_BROKEN +# undef PRIX64 +# define PRIX64 (sizeof (long) == 8 ? "lX" : "llX") +#endif +#if !defined PRIdLEAST8 || PRI_MACROS_BROKEN +# undef PRIdLEAST8 +# define PRIdLEAST8 "d" +#endif +#if !defined PRIiLEAST8 || PRI_MACROS_BROKEN +# undef PRIiLEAST8 +# define PRIiLEAST8 "i" +#endif +#if !defined PRIoLEAST8 || PRI_MACROS_BROKEN +# undef PRIoLEAST8 +# define PRIoLEAST8 "o" +#endif +#if !defined PRIuLEAST8 || PRI_MACROS_BROKEN +# undef PRIuLEAST8 +# define PRIuLEAST8 "u" +#endif +#if !defined PRIxLEAST8 || PRI_MACROS_BROKEN +# undef PRIxLEAST8 +# define PRIxLEAST8 "x" +#endif +#if !defined PRIXLEAST8 || PRI_MACROS_BROKEN +# undef PRIXLEAST8 +# define PRIXLEAST8 "X" +#endif +#if !defined PRIdLEAST16 || PRI_MACROS_BROKEN +# undef PRIdLEAST16 +# define PRIdLEAST16 "d" +#endif +#if !defined PRIiLEAST16 || PRI_MACROS_BROKEN +# undef PRIiLEAST16 +# define PRIiLEAST16 "i" +#endif +#if !defined PRIoLEAST16 || PRI_MACROS_BROKEN +# undef PRIoLEAST16 +# define PRIoLEAST16 "o" +#endif +#if !defined PRIuLEAST16 || PRI_MACROS_BROKEN +# undef PRIuLEAST16 +# define PRIuLEAST16 "u" +#endif +#if !defined PRIxLEAST16 || PRI_MACROS_BROKEN +# undef PRIxLEAST16 +# define PRIxLEAST16 "x" +#endif +#if !defined PRIXLEAST16 || PRI_MACROS_BROKEN +# undef PRIXLEAST16 +# define PRIXLEAST16 "X" +#endif +#if !defined PRIdLEAST32 || PRI_MACROS_BROKEN +# undef PRIdLEAST32 +# define PRIdLEAST32 "d" +#endif +#if !defined PRIiLEAST32 || PRI_MACROS_BROKEN +# undef PRIiLEAST32 +# define PRIiLEAST32 "i" +#endif +#if !defined PRIoLEAST32 || PRI_MACROS_BROKEN +# undef PRIoLEAST32 +# define PRIoLEAST32 "o" +#endif +#if !defined PRIuLEAST32 || PRI_MACROS_BROKEN +# undef PRIuLEAST32 +# define PRIuLEAST32 "u" +#endif +#if !defined PRIxLEAST32 || PRI_MACROS_BROKEN +# undef PRIxLEAST32 +# define PRIxLEAST32 "x" +#endif +#if !defined PRIXLEAST32 || PRI_MACROS_BROKEN +# undef PRIXLEAST32 +# define PRIXLEAST32 "X" +#endif +#if !defined PRIdLEAST64 || PRI_MACROS_BROKEN +# undef PRIdLEAST64 +# define PRIdLEAST64 PRId64 +#endif +#if !defined PRIiLEAST64 || PRI_MACROS_BROKEN +# undef PRIiLEAST64 +# define PRIiLEAST64 PRIi64 +#endif +#if !defined PRIoLEAST64 || PRI_MACROS_BROKEN +# undef PRIoLEAST64 +# define PRIoLEAST64 PRIo64 +#endif +#if !defined PRIuLEAST64 || PRI_MACROS_BROKEN +# undef PRIuLEAST64 +# define PRIuLEAST64 PRIu64 +#endif +#if !defined PRIxLEAST64 || PRI_MACROS_BROKEN +# undef PRIxLEAST64 +# define PRIxLEAST64 PRIx64 +#endif +#if !defined PRIXLEAST64 || PRI_MACROS_BROKEN +# undef PRIXLEAST64 +# define PRIXLEAST64 PRIX64 +#endif +#if !defined PRIdFAST8 || PRI_MACROS_BROKEN +# undef PRIdFAST8 +# define PRIdFAST8 "d" +#endif +#if !defined PRIiFAST8 || PRI_MACROS_BROKEN +# undef PRIiFAST8 +# define PRIiFAST8 "i" +#endif +#if !defined PRIoFAST8 || PRI_MACROS_BROKEN +# undef PRIoFAST8 +# define PRIoFAST8 "o" +#endif +#if !defined PRIuFAST8 || PRI_MACROS_BROKEN +# undef PRIuFAST8 +# define PRIuFAST8 "u" +#endif +#if !defined PRIxFAST8 || PRI_MACROS_BROKEN +# undef PRIxFAST8 +# define PRIxFAST8 "x" +#endif +#if !defined PRIXFAST8 || PRI_MACROS_BROKEN +# undef PRIXFAST8 +# define PRIXFAST8 "X" +#endif +#if !defined PRIdFAST16 || PRI_MACROS_BROKEN +# undef PRIdFAST16 +# define PRIdFAST16 "d" +#endif +#if !defined PRIiFAST16 || PRI_MACROS_BROKEN +# undef PRIiFAST16 +# define PRIiFAST16 "i" +#endif +#if !defined PRIoFAST16 || PRI_MACROS_BROKEN +# undef PRIoFAST16 +# define PRIoFAST16 "o" +#endif +#if !defined PRIuFAST16 || PRI_MACROS_BROKEN +# undef PRIuFAST16 +# define PRIuFAST16 "u" +#endif +#if !defined PRIxFAST16 || PRI_MACROS_BROKEN +# undef PRIxFAST16 +# define PRIxFAST16 "x" +#endif +#if !defined PRIXFAST16 || PRI_MACROS_BROKEN +# undef PRIXFAST16 +# define PRIXFAST16 "X" +#endif +#if !defined PRIdFAST32 || PRI_MACROS_BROKEN +# undef PRIdFAST32 +# define PRIdFAST32 "d" +#endif +#if !defined PRIiFAST32 || PRI_MACROS_BROKEN +# undef PRIiFAST32 +# define PRIiFAST32 "i" +#endif +#if !defined PRIoFAST32 || PRI_MACROS_BROKEN +# undef PRIoFAST32 +# define PRIoFAST32 "o" +#endif +#if !defined PRIuFAST32 || PRI_MACROS_BROKEN +# undef PRIuFAST32 +# define PRIuFAST32 "u" +#endif +#if !defined PRIxFAST32 || PRI_MACROS_BROKEN +# undef PRIxFAST32 +# define PRIxFAST32 "x" +#endif +#if !defined PRIXFAST32 || PRI_MACROS_BROKEN +# undef PRIXFAST32 +# define PRIXFAST32 "X" +#endif +#if !defined PRIdFAST64 || PRI_MACROS_BROKEN +# undef PRIdFAST64 +# define PRIdFAST64 PRId64 +#endif +#if !defined PRIiFAST64 || PRI_MACROS_BROKEN +# undef PRIiFAST64 +# define PRIiFAST64 PRIi64 +#endif +#if !defined PRIoFAST64 || PRI_MACROS_BROKEN +# undef PRIoFAST64 +# define PRIoFAST64 PRIo64 +#endif +#if !defined PRIuFAST64 || PRI_MACROS_BROKEN +# undef PRIuFAST64 +# define PRIuFAST64 PRIu64 +#endif +#if !defined PRIxFAST64 || PRI_MACROS_BROKEN +# undef PRIxFAST64 +# define PRIxFAST64 PRIx64 +#endif +#if !defined PRIXFAST64 || PRI_MACROS_BROKEN +# undef PRIXFAST64 +# define PRIXFAST64 PRIX64 +#endif +#if !defined PRIdMAX || PRI_MACROS_BROKEN +# undef PRIdMAX +# define PRIdMAX (sizeof (uintmax_t) == sizeof (long) ? "ld" : "lld") +#endif +#if !defined PRIiMAX || PRI_MACROS_BROKEN +# undef PRIiMAX +# define PRIiMAX (sizeof (uintmax_t) == sizeof (long) ? "li" : "lli") +#endif +#if !defined PRIoMAX || PRI_MACROS_BROKEN +# undef PRIoMAX +# define PRIoMAX (sizeof (uintmax_t) == sizeof (long) ? "lo" : "llo") +#endif +#if !defined PRIuMAX || PRI_MACROS_BROKEN +# undef PRIuMAX +# define PRIuMAX (sizeof (uintmax_t) == sizeof (long) ? "lu" : "llu") +#endif +#if !defined PRIxMAX || PRI_MACROS_BROKEN +# undef PRIxMAX +# define PRIxMAX (sizeof (uintmax_t) == sizeof (long) ? "lx" : "llx") +#endif +#if !defined PRIXMAX || PRI_MACROS_BROKEN +# undef PRIXMAX +# define PRIXMAX (sizeof (uintmax_t) == sizeof (long) ? "lX" : "llX") +#endif +#if !defined PRIdPTR || PRI_MACROS_BROKEN +# undef PRIdPTR +# define PRIdPTR \ + (sizeof (void *) == sizeof (long) ? "ld" : \ + sizeof (void *) == sizeof (int) ? "d" : \ + "lld") +#endif +#if !defined PRIiPTR || PRI_MACROS_BROKEN +# undef PRIiPTR +# define PRIiPTR \ + (sizeof (void *) == sizeof (long) ? "li" : \ + sizeof (void *) == sizeof (int) ? "i" : \ + "lli") +#endif +#if !defined PRIoPTR || PRI_MACROS_BROKEN +# undef PRIoPTR +# define PRIoPTR \ + (sizeof (void *) == sizeof (long) ? "lo" : \ + sizeof (void *) == sizeof (int) ? "o" : \ + "llo") +#endif +#if !defined PRIuPTR || PRI_MACROS_BROKEN +# undef PRIuPTR +# define PRIuPTR \ + (sizeof (void *) == sizeof (long) ? "lu" : \ + sizeof (void *) == sizeof (int) ? "u" : \ + "llu") +#endif +#if !defined PRIxPTR || PRI_MACROS_BROKEN +# undef PRIxPTR +# define PRIxPTR \ + (sizeof (void *) == sizeof (long) ? "lx" : \ + sizeof (void *) == sizeof (int) ? "x" : \ + "llx") +#endif +#if !defined PRIXPTR || PRI_MACROS_BROKEN +# undef PRIXPTR +# define PRIXPTR \ + (sizeof (void *) == sizeof (long) ? "lX" : \ + sizeof (void *) == sizeof (int) ? "X" : \ + "llX") +#endif + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ISO C functions. This is required by the standard + because some ISO C functions will require linking with this object + file and the name space must not be polluted. */ +# define open __open +# define close __close +# define read __read +# define mmap __mmap +# define munmap __munmap +#endif + +/* For those losing systems which don't have `alloca' we have to add + some additional code emulating it. */ +#ifdef HAVE_ALLOCA +# define freea(p) /* nothing */ +#else +# define alloca(n) malloc (n) +# define freea(p) free (p) +#endif + +/* For systems that distinguish between text and binary I/O. + O_BINARY is usually declared in . */ +#if !defined O_BINARY && defined _O_BINARY + /* For MSC-compatible compilers. */ +# define O_BINARY _O_BINARY +# define O_TEXT _O_TEXT +#endif +#ifdef __BEOS__ + /* BeOS 5 has O_BINARY and O_TEXT, but they have no effect. */ +# undef O_BINARY +# undef O_TEXT +#endif +/* On reasonable systems, binary I/O is the default. */ +#ifndef O_BINARY +# define O_BINARY 0 +#endif + + +/* Prototypes for local functions. Needed to ensure compiler checking of + function argument counts despite of K&R C function definition syntax. */ +static const char *get_sysdep_segment_value PARAMS ((const char *name)); + + +/* We need a sign, whether a new catalog was loaded, which can be associated + with all translations. This is important if the translations are + cached by one of GCC's features. */ +int _nl_msg_cat_cntr; + + +/* Expand a system dependent string segment. Return NULL if unsupported. */ +static const char * +get_sysdep_segment_value (name) + const char *name; +{ + /* Test for an ISO C 99 section 7.8.1 format string directive. + Syntax: + P R I { d | i | o | u | x | X } + { { | LEAST | FAST } { 8 | 16 | 32 | 64 } | MAX | PTR } */ + /* We don't use a table of 14 times 6 'const char *' strings here, because + data relocations cost startup time. */ + if (name[0] == 'P' && name[1] == 'R' && name[2] == 'I') + { + if (name[3] == 'd' || name[3] == 'i' || name[3] == 'o' || name[3] == 'u' + || name[3] == 'x' || name[3] == 'X') + { + if (name[4] == '8' && name[5] == '\0') + { + if (name[3] == 'd') + return PRId8; + if (name[3] == 'i') + return PRIi8; + if (name[3] == 'o') + return PRIo8; + if (name[3] == 'u') + return PRIu8; + if (name[3] == 'x') + return PRIx8; + if (name[3] == 'X') + return PRIX8; + abort (); + } + if (name[4] == '1' && name[5] == '6' && name[6] == '\0') + { + if (name[3] == 'd') + return PRId16; + if (name[3] == 'i') + return PRIi16; + if (name[3] == 'o') + return PRIo16; + if (name[3] == 'u') + return PRIu16; + if (name[3] == 'x') + return PRIx16; + if (name[3] == 'X') + return PRIX16; + abort (); + } + if (name[4] == '3' && name[5] == '2' && name[6] == '\0') + { + if (name[3] == 'd') + return PRId32; + if (name[3] == 'i') + return PRIi32; + if (name[3] == 'o') + return PRIo32; + if (name[3] == 'u') + return PRIu32; + if (name[3] == 'x') + return PRIx32; + if (name[3] == 'X') + return PRIX32; + abort (); + } + if (name[4] == '6' && name[5] == '4' && name[6] == '\0') + { + if (name[3] == 'd') + return PRId64; + if (name[3] == 'i') + return PRIi64; + if (name[3] == 'o') + return PRIo64; + if (name[3] == 'u') + return PRIu64; + if (name[3] == 'x') + return PRIx64; + if (name[3] == 'X') + return PRIX64; + abort (); + } + if (name[4] == 'L' && name[5] == 'E' && name[6] == 'A' + && name[7] == 'S' && name[8] == 'T') + { + if (name[9] == '8' && name[10] == '\0') + { + if (name[3] == 'd') + return PRIdLEAST8; + if (name[3] == 'i') + return PRIiLEAST8; + if (name[3] == 'o') + return PRIoLEAST8; + if (name[3] == 'u') + return PRIuLEAST8; + if (name[3] == 'x') + return PRIxLEAST8; + if (name[3] == 'X') + return PRIXLEAST8; + abort (); + } + if (name[9] == '1' && name[10] == '6' && name[11] == '\0') + { + if (name[3] == 'd') + return PRIdLEAST16; + if (name[3] == 'i') + return PRIiLEAST16; + if (name[3] == 'o') + return PRIoLEAST16; + if (name[3] == 'u') + return PRIuLEAST16; + if (name[3] == 'x') + return PRIxLEAST16; + if (name[3] == 'X') + return PRIXLEAST16; + abort (); + } + if (name[9] == '3' && name[10] == '2' && name[11] == '\0') + { + if (name[3] == 'd') + return PRIdLEAST32; + if (name[3] == 'i') + return PRIiLEAST32; + if (name[3] == 'o') + return PRIoLEAST32; + if (name[3] == 'u') + return PRIuLEAST32; + if (name[3] == 'x') + return PRIxLEAST32; + if (name[3] == 'X') + return PRIXLEAST32; + abort (); + } + if (name[9] == '6' && name[10] == '4' && name[11] == '\0') + { + if (name[3] == 'd') + return PRIdLEAST64; + if (name[3] == 'i') + return PRIiLEAST64; + if (name[3] == 'o') + return PRIoLEAST64; + if (name[3] == 'u') + return PRIuLEAST64; + if (name[3] == 'x') + return PRIxLEAST64; + if (name[3] == 'X') + return PRIXLEAST64; + abort (); + } + } + if (name[4] == 'F' && name[5] == 'A' && name[6] == 'S' + && name[7] == 'T') + { + if (name[8] == '8' && name[9] == '\0') + { + if (name[3] == 'd') + return PRIdFAST8; + if (name[3] == 'i') + return PRIiFAST8; + if (name[3] == 'o') + return PRIoFAST8; + if (name[3] == 'u') + return PRIuFAST8; + if (name[3] == 'x') + return PRIxFAST8; + if (name[3] == 'X') + return PRIXFAST8; + abort (); + } + if (name[8] == '1' && name[9] == '6' && name[10] == '\0') + { + if (name[3] == 'd') + return PRIdFAST16; + if (name[3] == 'i') + return PRIiFAST16; + if (name[3] == 'o') + return PRIoFAST16; + if (name[3] == 'u') + return PRIuFAST16; + if (name[3] == 'x') + return PRIxFAST16; + if (name[3] == 'X') + return PRIXFAST16; + abort (); + } + if (name[8] == '3' && name[9] == '2' && name[10] == '\0') + { + if (name[3] == 'd') + return PRIdFAST32; + if (name[3] == 'i') + return PRIiFAST32; + if (name[3] == 'o') + return PRIoFAST32; + if (name[3] == 'u') + return PRIuFAST32; + if (name[3] == 'x') + return PRIxFAST32; + if (name[3] == 'X') + return PRIXFAST32; + abort (); + } + if (name[8] == '6' && name[9] == '4' && name[10] == '\0') + { + if (name[3] == 'd') + return PRIdFAST64; + if (name[3] == 'i') + return PRIiFAST64; + if (name[3] == 'o') + return PRIoFAST64; + if (name[3] == 'u') + return PRIuFAST64; + if (name[3] == 'x') + return PRIxFAST64; + if (name[3] == 'X') + return PRIXFAST64; + abort (); + } + } + if (name[4] == 'M' && name[5] == 'A' && name[6] == 'X' + && name[7] == '\0') + { + if (name[3] == 'd') + return PRIdMAX; + if (name[3] == 'i') + return PRIiMAX; + if (name[3] == 'o') + return PRIoMAX; + if (name[3] == 'u') + return PRIuMAX; + if (name[3] == 'x') + return PRIxMAX; + if (name[3] == 'X') + return PRIXMAX; + abort (); + } + if (name[4] == 'P' && name[5] == 'T' && name[6] == 'R' + && name[7] == '\0') + { + if (name[3] == 'd') + return PRIdPTR; + if (name[3] == 'i') + return PRIiPTR; + if (name[3] == 'o') + return PRIoPTR; + if (name[3] == 'u') + return PRIuPTR; + if (name[3] == 'x') + return PRIxPTR; + if (name[3] == 'X') + return PRIXPTR; + abort (); + } + } + } + /* Other system dependent strings are not valid. */ + return NULL; +} + +/* Initialize the codeset dependent parts of an opened message catalog. + Return the header entry. */ +const char * +internal_function +_nl_init_domain_conv (domain_file, domain, domainbinding) + struct loaded_l10nfile *domain_file; + struct loaded_domain *domain; + struct binding *domainbinding; +{ + /* Find out about the character set the file is encoded with. + This can be found (in textual form) in the entry "". If this + entry does not exist or if this does not contain the `charset=' + information, we will assume the charset matches the one the + current locale and we don't have to perform any conversion. */ + char *nullentry; + size_t nullentrylen; + + /* Preinitialize fields, to avoid recursion during _nl_find_msg. */ + domain->codeset_cntr = + (domainbinding != NULL ? domainbinding->codeset_cntr : 0); +#ifdef _LIBC + domain->conv = (__gconv_t) -1; +#else +# if HAVE_ICONV + domain->conv = (iconv_t) -1; +# endif +#endif + domain->conv_tab = NULL; + + /* Get the header entry. */ + nullentry = _nl_find_msg (domain_file, domainbinding, "", &nullentrylen); + + if (nullentry != NULL) + { +#if defined _LIBC || HAVE_ICONV + const char *charsetstr; + + charsetstr = strstr (nullentry, "charset="); + if (charsetstr != NULL) + { + size_t len; + char *charset; + const char *outcharset; + + charsetstr += strlen ("charset="); + len = strcspn (charsetstr, " \t\n"); + + charset = (char *) alloca (len + 1); +# if defined _LIBC || HAVE_MEMPCPY + *((char *) mempcpy (charset, charsetstr, len)) = '\0'; +# else + memcpy (charset, charsetstr, len); + charset[len] = '\0'; +# endif + + /* The output charset should normally be determined by the + locale. But sometimes the locale is not used or not correctly + set up, so we provide a possibility for the user to override + this. Moreover, the value specified through + bind_textdomain_codeset overrides both. */ + if (domainbinding != NULL && domainbinding->codeset != NULL) + outcharset = domainbinding->codeset; + else + { + outcharset = getenv ("OUTPUT_CHARSET"); + if (outcharset == NULL || outcharset[0] == '\0') + { +# ifdef _LIBC + outcharset = (*_nl_current[LC_CTYPE])->values[_NL_ITEM_INDEX (CODESET)].string; +# else +# if HAVE_ICONV + extern const char *locale_charset PARAMS ((void)); + outcharset = locale_charset (); +# endif +# endif + } + } + +# ifdef _LIBC + /* We always want to use transliteration. */ + outcharset = norm_add_slashes (outcharset, "TRANSLIT"); + charset = norm_add_slashes (charset, NULL); + if (__gconv_open (outcharset, charset, &domain->conv, + GCONV_AVOID_NOCONV) + != __GCONV_OK) + domain->conv = (__gconv_t) -1; +# else +# if HAVE_ICONV + /* When using GNU libc >= 2.2 or GNU libiconv >= 1.5, + we want to use transliteration. */ +# if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 \ + || _LIBICONV_VERSION >= 0x0105 + if (strchr (outcharset, '/') == NULL) + { + char *tmp; + + len = strlen (outcharset); + tmp = (char *) alloca (len + 10 + 1); + memcpy (tmp, outcharset, len); + memcpy (tmp + len, "//TRANSLIT", 10 + 1); + outcharset = tmp; + + domain->conv = iconv_open (outcharset, charset); + + freea (outcharset); + } + else +# endif + domain->conv = iconv_open (outcharset, charset); +# endif +# endif + + freea (charset); + } +#endif /* _LIBC || HAVE_ICONV */ + } + + return nullentry; +} + +/* Frees the codeset dependent parts of an opened message catalog. */ +void +internal_function +_nl_free_domain_conv (domain) + struct loaded_domain *domain; +{ + if (domain->conv_tab != NULL && domain->conv_tab != (char **) -1) + free (domain->conv_tab); + +#ifdef _LIBC + if (domain->conv != (__gconv_t) -1) + __gconv_close (domain->conv); +#else +# if HAVE_ICONV + if (domain->conv != (iconv_t) -1) + iconv_close (domain->conv); +# endif +#endif +} + +/* Load the message catalogs specified by FILENAME. If it is no valid + message catalog do nothing. */ +void +internal_function +_nl_load_domain (domain_file, domainbinding) + struct loaded_l10nfile *domain_file; + struct binding *domainbinding; +{ + int fd; + size_t size; +#ifdef _LIBC + struct stat64 st; +#else + struct stat st; +#endif + struct mo_file_header *data = (struct mo_file_header *) -1; + int use_mmap = 0; + struct loaded_domain *domain; + int revision; + const char *nullentry; + + domain_file->decided = 1; + domain_file->data = NULL; + + /* Note that it would be useless to store domainbinding in domain_file + because domainbinding might be == NULL now but != NULL later (after + a call to bind_textdomain_codeset). */ + + /* If the record does not represent a valid locale the FILENAME + might be NULL. This can happen when according to the given + specification the locale file name is different for XPG and CEN + syntax. */ + if (domain_file->filename == NULL) + return; + + /* Try to open the addressed file. */ + fd = open (domain_file->filename, O_RDONLY | O_BINARY); + if (fd == -1) + return; + + /* We must know about the size of the file. */ + if ( +#ifdef _LIBC + __builtin_expect (fstat64 (fd, &st) != 0, 0) +#else + __builtin_expect (fstat (fd, &st) != 0, 0) +#endif + || __builtin_expect ((size = (size_t) st.st_size) != st.st_size, 0) + || __builtin_expect (size < sizeof (struct mo_file_header), 0)) + { + /* Something went wrong. */ + close (fd); + return; + } + +#ifdef HAVE_MMAP + /* Now we are ready to load the file. If mmap() is available we try + this first. If not available or it failed we try to load it. */ + data = (struct mo_file_header *) mmap (NULL, size, PROT_READ, + MAP_PRIVATE, fd, 0); + + if (__builtin_expect (data != (struct mo_file_header *) -1, 1)) + { + /* mmap() call was successful. */ + close (fd); + use_mmap = 1; + } +#endif + + /* If the data is not yet available (i.e. mmap'ed) we try to load + it manually. */ + if (data == (struct mo_file_header *) -1) + { + size_t to_read; + char *read_ptr; + + data = (struct mo_file_header *) malloc (size); + if (data == NULL) + return; + + to_read = size; + read_ptr = (char *) data; + do + { + long int nb = (long int) read (fd, read_ptr, to_read); + if (nb <= 0) + { +#ifdef EINTR + if (nb == -1 && errno == EINTR) + continue; +#endif + close (fd); + return; + } + read_ptr += nb; + to_read -= nb; + } + while (to_read > 0); + + close (fd); + } + + /* Using the magic number we can test whether it really is a message + catalog file. */ + if (__builtin_expect (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED, + 0)) + { + /* The magic number is wrong: not a message catalog file. */ +#ifdef HAVE_MMAP + if (use_mmap) + munmap ((caddr_t) data, size); + else +#endif + free (data); + return; + } + + domain = (struct loaded_domain *) malloc (sizeof (struct loaded_domain)); + if (domain == NULL) + return; + domain_file->data = domain; + + domain->data = (char *) data; + domain->use_mmap = use_mmap; + domain->mmap_size = size; + domain->must_swap = data->magic != _MAGIC; + domain->malloced = NULL; + + /* Fill in the information about the available tables. */ + revision = W (domain->must_swap, data->revision); + /* We support only the major revision 0. */ + switch (revision >> 16) + { + case 0: + domain->nstrings = W (domain->must_swap, data->nstrings); + domain->orig_tab = (const struct string_desc *) + ((char *) data + W (domain->must_swap, data->orig_tab_offset)); + domain->trans_tab = (const struct string_desc *) + ((char *) data + W (domain->must_swap, data->trans_tab_offset)); + domain->hash_size = W (domain->must_swap, data->hash_tab_size); + domain->hash_tab = + (domain->hash_size > 2 + ? (const nls_uint32 *) + ((char *) data + W (domain->must_swap, data->hash_tab_offset)) + : NULL); + domain->must_swap_hash_tab = domain->must_swap; + + /* Now dispatch on the minor revision. */ + switch (revision & 0xffff) + { + case 0: + domain->n_sysdep_strings = 0; + domain->orig_sysdep_tab = NULL; + domain->trans_sysdep_tab = NULL; + break; + case 1: + default: + { + nls_uint32 n_sysdep_strings; + + if (domain->hash_tab == NULL) + /* This is invalid. These minor revisions need a hash table. */ + goto invalid; + + n_sysdep_strings = + W (domain->must_swap, data->n_sysdep_strings); + if (n_sysdep_strings > 0) + { + nls_uint32 n_sysdep_segments; + const struct sysdep_segment *sysdep_segments; + const char **sysdep_segment_values; + const nls_uint32 *orig_sysdep_tab; + const nls_uint32 *trans_sysdep_tab; + size_t memneed; + char *mem; + struct sysdep_string_desc *inmem_orig_sysdep_tab; + struct sysdep_string_desc *inmem_trans_sysdep_tab; + nls_uint32 *inmem_hash_tab; + unsigned int i; + + /* Get the values of the system dependent segments. */ + n_sysdep_segments = + W (domain->must_swap, data->n_sysdep_segments); + sysdep_segments = (const struct sysdep_segment *) + ((char *) data + + W (domain->must_swap, data->sysdep_segments_offset)); + sysdep_segment_values = + alloca (n_sysdep_segments * sizeof (const char *)); + for (i = 0; i < n_sysdep_segments; i++) + { + const char *name = + (char *) data + + W (domain->must_swap, sysdep_segments[i].offset); + nls_uint32 namelen = + W (domain->must_swap, sysdep_segments[i].length); + + if (!(namelen > 0 && name[namelen - 1] == '\0')) + { + freea (sysdep_segment_values); + goto invalid; + } + + sysdep_segment_values[i] = get_sysdep_segment_value (name); + } + + orig_sysdep_tab = (const nls_uint32 *) + ((char *) data + + W (domain->must_swap, data->orig_sysdep_tab_offset)); + trans_sysdep_tab = (const nls_uint32 *) + ((char *) data + + W (domain->must_swap, data->trans_sysdep_tab_offset)); + + /* Compute the amount of additional memory needed for the + system dependent strings and the augmented hash table. */ + memneed = 2 * n_sysdep_strings + * sizeof (struct sysdep_string_desc) + + domain->hash_size * sizeof (nls_uint32); + for (i = 0; i < 2 * n_sysdep_strings; i++) + { + const struct sysdep_string *sysdep_string = + (const struct sysdep_string *) + ((char *) data + + W (domain->must_swap, + i < n_sysdep_strings + ? orig_sysdep_tab[i] + : trans_sysdep_tab[i - n_sysdep_strings])); + size_t need = 0; + const struct segment_pair *p = sysdep_string->segments; + + if (W (domain->must_swap, p->sysdepref) != SEGMENTS_END) + for (p = sysdep_string->segments;; p++) + { + nls_uint32 sysdepref; + + need += W (domain->must_swap, p->segsize); + + sysdepref = W (domain->must_swap, p->sysdepref); + if (sysdepref == SEGMENTS_END) + break; + + if (sysdepref >= n_sysdep_segments) + { + /* Invalid. */ + freea (sysdep_segment_values); + goto invalid; + } + + need += strlen (sysdep_segment_values[sysdepref]); + } + + memneed += need; + } + + /* Allocate additional memory. */ + mem = (char *) malloc (memneed); + if (mem == NULL) + goto invalid; + + domain->malloced = mem; + inmem_orig_sysdep_tab = (struct sysdep_string_desc *) mem; + mem += n_sysdep_strings * sizeof (struct sysdep_string_desc); + inmem_trans_sysdep_tab = (struct sysdep_string_desc *) mem; + mem += n_sysdep_strings * sizeof (struct sysdep_string_desc); + inmem_hash_tab = (nls_uint32 *) mem; + mem += domain->hash_size * sizeof (nls_uint32); + + /* Compute the system dependent strings. */ + for (i = 0; i < 2 * n_sysdep_strings; i++) + { + const struct sysdep_string *sysdep_string = + (const struct sysdep_string *) + ((char *) data + + W (domain->must_swap, + i < n_sysdep_strings + ? orig_sysdep_tab[i] + : trans_sysdep_tab[i - n_sysdep_strings])); + const char *static_segments = + (char *) data + + W (domain->must_swap, sysdep_string->offset); + const struct segment_pair *p = sysdep_string->segments; + + /* Concatenate the segments, and fill + inmem_orig_sysdep_tab[i] (for i < n_sysdep_strings) and + inmem_trans_sysdep_tab[i-n_sysdep_strings] (for + i >= n_sysdep_strings). */ + + if (W (domain->must_swap, p->sysdepref) == SEGMENTS_END) + { + /* Only one static segment. */ + inmem_orig_sysdep_tab[i].length = + W (domain->must_swap, p->segsize); + inmem_orig_sysdep_tab[i].pointer = static_segments; + } + else + { + inmem_orig_sysdep_tab[i].pointer = mem; + + for (p = sysdep_string->segments;; p++) + { + nls_uint32 segsize = + W (domain->must_swap, p->segsize); + nls_uint32 sysdepref = + W (domain->must_swap, p->sysdepref); + size_t n; + + if (segsize > 0) + { + memcpy (mem, static_segments, segsize); + mem += segsize; + static_segments += segsize; + } + + if (sysdepref == SEGMENTS_END) + break; + + n = strlen (sysdep_segment_values[sysdepref]); + memcpy (mem, sysdep_segment_values[sysdepref], n); + mem += n; + } + + inmem_orig_sysdep_tab[i].length = + mem - inmem_orig_sysdep_tab[i].pointer; + } + } + + /* Compute the augmented hash table. */ + for (i = 0; i < domain->hash_size; i++) + inmem_hash_tab[i] = + W (domain->must_swap_hash_tab, domain->hash_tab[i]); + for (i = 0; i < n_sysdep_strings; i++) + { + const char *msgid = inmem_orig_sysdep_tab[i].pointer; + nls_uint32 hash_val = hash_string (msgid); + nls_uint32 idx = hash_val % domain->hash_size; + nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2)); + + for (;;) + { + if (inmem_hash_tab[idx] == 0) + { + /* Hash table entry is empty. Use it. */ + inmem_hash_tab[idx] = 1 + domain->nstrings + i; + break; + } + + if (idx >= domain->hash_size - incr) + idx -= domain->hash_size - incr; + else + idx += incr; + } + } + + freea (sysdep_segment_values); + + domain->n_sysdep_strings = n_sysdep_strings; + domain->orig_sysdep_tab = inmem_orig_sysdep_tab; + domain->trans_sysdep_tab = inmem_trans_sysdep_tab; + + domain->hash_tab = inmem_hash_tab; + domain->must_swap_hash_tab = 0; + } + else + { + domain->n_sysdep_strings = 0; + domain->orig_sysdep_tab = NULL; + domain->trans_sysdep_tab = NULL; + } + } + break; + } + break; + default: + /* This is an invalid revision. */ + invalid: + /* This is an invalid .mo file. */ + if (domain->malloced) + free (domain->malloced); +#ifdef HAVE_MMAP + if (use_mmap) + munmap ((caddr_t) data, size); + else +#endif + free (data); + free (domain); + domain_file->data = NULL; + return; + } + + /* Now initialize the character set converter from the character set + the file is encoded with (found in the header entry) to the domain's + specified character set or the locale's character set. */ + nullentry = _nl_init_domain_conv (domain_file, domain, domainbinding); + + /* Also look for a plural specification. */ + EXTRACT_PLURAL_EXPRESSION (nullentry, &domain->plural, &domain->nplurals); +} + + +#ifdef _LIBC +void +internal_function +_nl_unload_domain (domain) + struct loaded_domain *domain; +{ + if (domain->plural != &__gettext_germanic_plural) + __gettext_free_exp (domain->plural); + + _nl_free_domain_conv (domain); + + if (domain->malloced) + free (domain->malloced); + +# ifdef _POSIX_MAPPED_FILES + if (domain->use_mmap) + munmap ((caddr_t) domain->data, domain->mmap_size); + else +# endif /* _POSIX_MAPPED_FILES */ + free ((void *) domain->data); + + free (domain); +} +#endif diff --git a/intl/localcharset.c b/intl/localcharset.c new file mode 100644 index 0000000..2b1564e --- /dev/null +++ b/intl/localcharset.c @@ -0,0 +1,369 @@ +/* Determine a canonical name for the current locale's character encoding. + + Copyright (C) 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Written by Bruno Haible . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#if HAVE_STDDEF_H +# include +#endif + +#include +#if HAVE_STRING_H +# include +#else +# include +#endif +#if HAVE_STDLIB_H +# include +#endif + +#if defined _WIN32 || defined __WIN32__ +# undef WIN32 /* avoid warning on mingw32 */ +# define WIN32 +#endif + +#if defined __EMX__ +/* Assume EMX program runs on OS/2, even if compiled under DOS. */ +# define OS2 +#endif + +#if !defined WIN32 +# if HAVE_LANGINFO_CODESET +# include +# else +# if HAVE_SETLOCALE +# include +# endif +# endif +#elif defined WIN32 +# define WIN32_LEAN_AND_MEAN +# include +#endif +#if defined OS2 +# define INCL_DOS +# include +#endif + +#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ + /* Win32, OS/2, DOS */ +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +#endif + +#ifndef DIRECTORY_SEPARATOR +# define DIRECTORY_SEPARATOR '/' +#endif + +#ifndef ISSLASH +# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) +#endif + +#ifdef HAVE_GETC_UNLOCKED +# undef getc +# define getc getc_unlocked +#endif + +#ifdef __cplusplus +/* When compiling with "gcc -x c++", produce a function with C linkage. */ +extern "C" const char * locale_charset (void); +#endif + +/* The following static variable is declared 'volatile' to avoid a + possible multithread problem in the function get_charset_aliases. If we + are running in a threaded environment, and if two threads initialize + 'charset_aliases' simultaneously, both will produce the same value, + and everything will be ok if the two assignments to 'charset_aliases' + are atomic. But I don't know what will happen if the two assignments mix. */ +#if __STDC__ != 1 +# define volatile /* empty */ +#endif +/* Pointer to the contents of the charset.alias file, if it has already been + read, else NULL. Its format is: + ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */ +static const char * volatile charset_aliases; + +/* Return a pointer to the contents of the charset.alias file. */ +static const char * +get_charset_aliases () +{ + const char *cp; + + cp = charset_aliases; + if (cp == NULL) + { +#if !defined WIN32 + FILE *fp; + const char *dir = LIBDIR; + const char *base = "charset.alias"; + char *file_name; + + /* Concatenate dir and base into freshly allocated file_name. */ + { + size_t dir_len = strlen (dir); + size_t base_len = strlen (base); + int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1])); + file_name = (char *) malloc (dir_len + add_slash + base_len + 1); + if (file_name != NULL) + { + memcpy (file_name, dir, dir_len); + if (add_slash) + file_name[dir_len] = DIRECTORY_SEPARATOR; + memcpy (file_name + dir_len + add_slash, base, base_len + 1); + } + } + + if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL) + /* Out of memory or file not found, treat it as empty. */ + cp = ""; + else + { + /* Parse the file's contents. */ + int c; + char buf1[50+1]; + char buf2[50+1]; + char *res_ptr = NULL; + size_t res_size = 0; + size_t l1, l2; + + for (;;) + { + c = getc (fp); + if (c == EOF) + break; + if (c == '\n' || c == ' ' || c == '\t') + continue; + if (c == '#') + { + /* Skip comment, to end of line. */ + do + c = getc (fp); + while (!(c == EOF || c == '\n')); + if (c == EOF) + break; + continue; + } + ungetc (c, fp); + if (fscanf (fp, "%50s %50s", buf1, buf2) < 2) + break; + l1 = strlen (buf1); + l2 = strlen (buf2); + if (res_size == 0) + { + res_size = l1 + 1 + l2 + 1; + res_ptr = (char *) malloc (res_size + 1); + } + else + { + res_size += l1 + 1 + l2 + 1; + res_ptr = (char *) realloc (res_ptr, res_size + 1); + } + if (res_ptr == NULL) + { + /* Out of memory. */ + res_size = 0; + break; + } + strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1); + strcpy (res_ptr + res_size - (l2 + 1), buf2); + } + fclose (fp); + if (res_size == 0) + cp = ""; + else + { + *(res_ptr + res_size) = '\0'; + cp = res_ptr; + } + } + + if (file_name != NULL) + free (file_name); + +#else + + /* To avoid the troubles of installing a separate file in the same + directory as the DLL and of retrieving the DLL's directory at + runtime, simply inline the aliases here. */ + +# if defined WIN32 + cp = "CP936" "\0" "GBK" "\0" + "CP1361" "\0" "JOHAB" "\0" + "CP20127" "\0" "ASCII" "\0" + "CP20866" "\0" "KOI8-R" "\0" + "CP21866" "\0" "KOI8-RU" "\0" + "CP28591" "\0" "ISO-8859-1" "\0" + "CP28592" "\0" "ISO-8859-2" "\0" + "CP28593" "\0" "ISO-8859-3" "\0" + "CP28594" "\0" "ISO-8859-4" "\0" + "CP28595" "\0" "ISO-8859-5" "\0" + "CP28596" "\0" "ISO-8859-6" "\0" + "CP28597" "\0" "ISO-8859-7" "\0" + "CP28598" "\0" "ISO-8859-8" "\0" + "CP28599" "\0" "ISO-8859-9" "\0" + "CP28605" "\0" "ISO-8859-15" "\0"; +# endif +#endif + + charset_aliases = cp; + } + + return cp; +} + +/* Determine the current locale's character encoding, and canonicalize it + into one of the canonical names listed in config.charset. + The result must not be freed; it is statically allocated. + If the canonical name cannot be determined, the result is a non-canonical + name. */ + +#ifdef STATIC +STATIC +#endif +const char * +locale_charset () +{ + const char *codeset; + const char *aliases; + +#if !(defined WIN32 || defined OS2) + +# if HAVE_LANGINFO_CODESET + + /* Most systems support nl_langinfo (CODESET) nowadays. */ + codeset = nl_langinfo (CODESET); + +# else + + /* On old systems which lack it, use setlocale or getenv. */ + const char *locale = NULL; + + /* But most old systems don't have a complete set of locales. Some + (like SunOS 4 or DJGPP) have only the C locale. Therefore we don't + use setlocale here; it would return "C" when it doesn't support the + locale name the user has set. */ +# if HAVE_SETLOCALE && 0 + locale = setlocale (LC_CTYPE, NULL); +# endif + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_ALL"); + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_CTYPE"); + if (locale == NULL || locale[0] == '\0') + locale = getenv ("LANG"); + } + } + + /* On some old systems, one used to set locale = "iso8859_1". On others, + you set it to "language_COUNTRY.charset". In any case, we resolve it + through the charset.alias file. */ + codeset = locale; + +# endif + +#elif defined WIN32 + + static char buf[2 + 10 + 1]; + + /* Woe32 has a function returning the locale's codepage as a number. */ + sprintf (buf, "CP%u", GetACP ()); + codeset = buf; + +#elif defined OS2 + + const char *locale; + static char buf[2 + 10 + 1]; + ULONG cp[3]; + ULONG cplen; + + /* Allow user to override the codeset, as set in the operating system, + with standard language environment variables. */ + locale = getenv ("LC_ALL"); + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_CTYPE"); + if (locale == NULL || locale[0] == '\0') + locale = getenv ("LANG"); + } + if (locale != NULL && locale[0] != '\0') + { + /* If the locale name contains an encoding after the dot, return it. */ + const char *dot = strchr (locale, '.'); + + if (dot != NULL) + { + const char *modifier; + + dot++; + /* Look for the possible @... trailer and remove it, if any. */ + modifier = strchr (dot, '@'); + if (modifier == NULL) + return dot; + if (modifier - dot < sizeof (buf)) + { + memcpy (buf, dot, modifier - dot); + buf [modifier - dot] = '\0'; + return buf; + } + } + + /* Resolve through the charset.alias file. */ + codeset = locale; + } + else + { + /* OS/2 has a function returning the locale's codepage as a number. */ + if (DosQueryCp (sizeof (cp), cp, &cplen)) + codeset = ""; + else + { + sprintf (buf, "CP%u", cp[0]); + codeset = buf; + } + } + +#endif + + if (codeset == NULL) + /* The canonical name cannot be determined. */ + codeset = ""; + + /* Resolve alias. */ + for (aliases = get_charset_aliases (); + *aliases != '\0'; + aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) + if (strcmp (codeset, aliases) == 0 + || (aliases[0] == '*' && aliases[1] == '\0')) + { + codeset = aliases + strlen (aliases) + 1; + break; + } + + /* Don't return an empty string. GNU libc and GNU libiconv interpret + the empty string as denoting "the locale's character encoding", + thus GNU libiconv would call this function a second time. */ + if (codeset[0] == '\0') + codeset = "ASCII"; + + return codeset; +} diff --git a/intl/locale.alias b/intl/locale.alias new file mode 100644 index 0000000..bd7b9b3 --- /dev/null +++ b/intl/locale.alias @@ -0,0 +1,78 @@ +# Locale name alias data base. +# Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. + +# The format of this file is the same as for the corresponding file of +# the X Window System, which normally can be found in +# /usr/lib/X11/locale/locale.alias +# A single line contains two fields: an alias and a substitution value. +# All entries are case independent. + +# Note: This file is far from being complete. If you have a value for +# your own site which you think might be useful for others too, share +# it with the rest of us. Send it using the `glibcbug' script to +# bugs@gnu.org. + +# Packages using this file: + +bokmal no_NO.ISO-8859-1 +bokmål no_NO.ISO-8859-1 +catalan ca_ES.ISO-8859-1 +croatian hr_HR.ISO-8859-2 +czech cs_CZ.ISO-8859-2 +danish da_DK.ISO-8859-1 +dansk da_DK.ISO-8859-1 +deutsch de_DE.ISO-8859-1 +dutch nl_NL.ISO-8859-1 +eesti et_EE.ISO-8859-1 +estonian et_EE.ISO-8859-1 +finnish fi_FI.ISO-8859-1 +français fr_FR.ISO-8859-1 +french fr_FR.ISO-8859-1 +galego gl_ES.ISO-8859-1 +galician gl_ES.ISO-8859-1 +german de_DE.ISO-8859-1 +greek el_GR.ISO-8859-7 +hebrew he_IL.ISO-8859-8 +hrvatski hr_HR.ISO-8859-2 +hungarian hu_HU.ISO-8859-2 +icelandic is_IS.ISO-8859-1 +italian it_IT.ISO-8859-1 +japanese ja_JP.eucJP +japanese.euc ja_JP.eucJP +ja_JP ja_JP.eucJP +ja_JP.ujis ja_JP.eucJP +japanese.sjis ja_JP.SJIS +korean ko_KR.eucKR +korean.euc ko_KR.eucKR +ko_KR ko_KR.eucKR +lithuanian lt_LT.ISO-8859-13 +nb_NO no_NO.ISO-8859-1 +nb_NO.ISO-8859-1 no_NO.ISO-8859-1 +norwegian no_NO.ISO-8859-1 +nynorsk nn_NO.ISO-8859-1 +polish pl_PL.ISO-8859-2 +portuguese pt_PT.ISO-8859-1 +romanian ro_RO.ISO-8859-2 +russian ru_RU.ISO-8859-5 +slovak sk_SK.ISO-8859-2 +slovene sl_SI.ISO-8859-2 +slovenian sl_SI.ISO-8859-2 +spanish es_ES.ISO-8859-1 +swedish sv_SE.ISO-8859-1 +thai th_TH.TIS-620 +turkish tr_TR.ISO-8859-9 diff --git a/intl/localealias.c b/intl/localealias.c new file mode 100644 index 0000000..456e41e --- /dev/null +++ b/intl/localealias.c @@ -0,0 +1,419 @@ +/* Handle aliases for locale names. + Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Tell glibc's to provide a prototype for mempcpy(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#if defined _LIBC || defined HAVE___FSETLOCKING +# include +#endif +#include + +#ifdef __GNUC__ +# define alloca __builtin_alloca +# define HAVE_ALLOCA 1 +#else +# if defined HAVE_ALLOCA_H || defined _LIBC +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca +char *alloca (); +# endif +# endif +# endif +#endif + +#include +#include + +#include "gettextP.h" + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# define strcasecmp __strcasecmp + +# ifndef mempcpy +# define mempcpy __mempcpy +# endif +# define HAVE_MEMPCPY 1 +# define HAVE___FSETLOCKING 1 + +/* We need locking here since we can be called from different places. */ +# include + +__libc_lock_define_initialized (static, lock); +#endif + +#ifndef internal_function +# define internal_function +#endif + +/* Some optimizations for glibc. */ +#ifdef _LIBC +# define FEOF(fp) feof_unlocked (fp) +# define FGETS(buf, n, fp) fgets_unlocked (buf, n, fp) +#else +# define FEOF(fp) feof (fp) +# define FGETS(buf, n, fp) fgets (buf, n, fp) +#endif + +/* For those losing systems which don't have `alloca' we have to add + some additional code emulating it. */ +#ifdef HAVE_ALLOCA +# define freea(p) /* nothing */ +#else +# define alloca(n) malloc (n) +# define freea(p) free (p) +#endif + +#if defined _LIBC_REENTRANT || defined HAVE_FGETS_UNLOCKED +# undef fgets +# define fgets(buf, len, s) fgets_unlocked (buf, len, s) +#endif +#if defined _LIBC_REENTRANT || defined HAVE_FEOF_UNLOCKED +# undef feof +# define feof(s) feof_unlocked (s) +#endif + + +struct alias_map +{ + const char *alias; + const char *value; +}; + + +static char *string_space; +static size_t string_space_act; +static size_t string_space_max; +static struct alias_map *map; +static size_t nmap; +static size_t maxmap; + + +/* Prototypes for local functions. */ +static size_t read_alias_file PARAMS ((const char *fname, int fname_len)) + internal_function; +static int extend_alias_table PARAMS ((void)); +static int alias_compare PARAMS ((const struct alias_map *map1, + const struct alias_map *map2)); + + +const char * +_nl_expand_alias (name) + const char *name; +{ + static const char *locale_alias_path; + struct alias_map *retval; + const char *result = NULL; + size_t added; + +#ifdef _LIBC + __libc_lock_lock (lock); +#endif + + if (locale_alias_path == NULL) + locale_alias_path = LOCALE_ALIAS_PATH; + + do + { + struct alias_map item; + + item.alias = name; + + if (nmap > 0) + retval = (struct alias_map *) bsearch (&item, map, nmap, + sizeof (struct alias_map), + (int (*) PARAMS ((const void *, + const void *)) + ) alias_compare); + else + retval = NULL; + + /* We really found an alias. Return the value. */ + if (retval != NULL) + { + result = retval->value; + break; + } + + /* Perhaps we can find another alias file. */ + added = 0; + while (added == 0 && locale_alias_path[0] != '\0') + { + const char *start; + + while (locale_alias_path[0] == PATH_SEPARATOR) + ++locale_alias_path; + start = locale_alias_path; + + while (locale_alias_path[0] != '\0' + && locale_alias_path[0] != PATH_SEPARATOR) + ++locale_alias_path; + + if (start < locale_alias_path) + added = read_alias_file (start, locale_alias_path - start); + } + } + while (added != 0); + +#ifdef _LIBC + __libc_lock_unlock (lock); +#endif + + return result; +} + + +static size_t +internal_function +read_alias_file (fname, fname_len) + const char *fname; + int fname_len; +{ + FILE *fp; + char *full_fname; + size_t added; + static const char aliasfile[] = "/locale.alias"; + + full_fname = (char *) alloca (fname_len + sizeof aliasfile); +#ifdef HAVE_MEMPCPY + mempcpy (mempcpy (full_fname, fname, fname_len), + aliasfile, sizeof aliasfile); +#else + memcpy (full_fname, fname, fname_len); + memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile); +#endif + + fp = fopen (full_fname, "r"); + freea (full_fname); + if (fp == NULL) + return 0; + +#ifdef HAVE___FSETLOCKING + /* No threads present. */ + __fsetlocking (fp, FSETLOCKING_BYCALLER); +#endif + + added = 0; + while (!FEOF (fp)) + { + /* It is a reasonable approach to use a fix buffer here because + a) we are only interested in the first two fields + b) these fields must be usable as file names and so must not + be that long + */ + char buf[BUFSIZ]; + char *alias; + char *value; + char *cp; + + if (FGETS (buf, sizeof buf, fp) == NULL) + /* EOF reached. */ + break; + + /* Possibly not the whole line fits into the buffer. Ignore + the rest of the line. */ + if (strchr (buf, '\n') == NULL) + { + char altbuf[BUFSIZ]; + do + if (FGETS (altbuf, sizeof altbuf, fp) == NULL) + /* Make sure the inner loop will be left. The outer loop + will exit at the `feof' test. */ + break; + while (strchr (altbuf, '\n') == NULL); + } + + cp = buf; + /* Ignore leading white space. */ + while (isspace ((unsigned char) cp[0])) + ++cp; + + /* A leading '#' signals a comment line. */ + if (cp[0] != '\0' && cp[0] != '#') + { + alias = cp++; + while (cp[0] != '\0' && !isspace ((unsigned char) cp[0])) + ++cp; + /* Terminate alias name. */ + if (cp[0] != '\0') + *cp++ = '\0'; + + /* Now look for the beginning of the value. */ + while (isspace ((unsigned char) cp[0])) + ++cp; + + if (cp[0] != '\0') + { + size_t alias_len; + size_t value_len; + + value = cp++; + while (cp[0] != '\0' && !isspace ((unsigned char) cp[0])) + ++cp; + /* Terminate value. */ + if (cp[0] == '\n') + { + /* This has to be done to make the following test + for the end of line possible. We are looking for + the terminating '\n' which do not overwrite here. */ + *cp++ = '\0'; + *cp = '\n'; + } + else if (cp[0] != '\0') + *cp++ = '\0'; + + if (nmap >= maxmap) + if (__builtin_expect (extend_alias_table (), 0)) + return added; + + alias_len = strlen (alias) + 1; + value_len = strlen (value) + 1; + + if (string_space_act + alias_len + value_len > string_space_max) + { + /* Increase size of memory pool. */ + size_t new_size = (string_space_max + + (alias_len + value_len > 1024 + ? alias_len + value_len : 1024)); + char *new_pool = (char *) realloc (string_space, new_size); + if (new_pool == NULL) + return added; + + if (__builtin_expect (string_space != new_pool, 0)) + { + size_t i; + + for (i = 0; i < nmap; i++) + { + map[i].alias += new_pool - string_space; + map[i].value += new_pool - string_space; + } + } + + string_space = new_pool; + string_space_max = new_size; + } + + map[nmap].alias = memcpy (&string_space[string_space_act], + alias, alias_len); + string_space_act += alias_len; + + map[nmap].value = memcpy (&string_space[string_space_act], + value, value_len); + string_space_act += value_len; + + ++nmap; + ++added; + } + } + } + + /* Should we test for ferror()? I think we have to silently ignore + errors. --drepper */ + fclose (fp); + + if (added > 0) + qsort (map, nmap, sizeof (struct alias_map), + (int (*) PARAMS ((const void *, const void *))) alias_compare); + + return added; +} + + +static int +extend_alias_table () +{ + size_t new_size; + struct alias_map *new_map; + + new_size = maxmap == 0 ? 100 : 2 * maxmap; + new_map = (struct alias_map *) realloc (map, (new_size + * sizeof (struct alias_map))); + if (new_map == NULL) + /* Simply don't extend: we don't have any more core. */ + return -1; + + map = new_map; + maxmap = new_size; + return 0; +} + + +#ifdef _LIBC +static void __attribute__ ((unused)) +free_mem (void) +{ + if (string_space != NULL) + free (string_space); + if (map != NULL) + free (map); +} +text_set_element (__libc_subfreeres, free_mem); +#endif + + +static int +alias_compare (map1, map2) + const struct alias_map *map1; + const struct alias_map *map2; +{ +#if defined _LIBC || defined HAVE_STRCASECMP + return strcasecmp (map1->alias, map2->alias); +#else + const unsigned char *p1 = (const unsigned char *) map1->alias; + const unsigned char *p2 = (const unsigned char *) map2->alias; + unsigned char c1, c2; + + if (p1 == p2) + return 0; + + do + { + /* I know this seems to be odd but the tolower() function in + some systems libc cannot handle nonalpha characters. */ + c1 = isupper (*p1) ? tolower (*p1) : *p1; + c2 = isupper (*p2) ? tolower (*p2) : *p2; + if (c1 == '\0') + break; + ++p1; + ++p2; + } + while (c1 == c2); + + return c1 - c2; +#endif +} diff --git a/intl/localename.c b/intl/localename.c new file mode 100644 index 0000000..faacecd --- /dev/null +++ b/intl/localename.c @@ -0,0 +1,772 @@ +/* Determine the current selected locale. + Copyright (C) 1995-1999, 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Written by Ulrich Drepper , 1995. */ +/* Win32 code written by Tor Lillqvist . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#if defined _WIN32 || defined __WIN32__ +# undef WIN32 /* avoid warning on mingw32 */ +# define WIN32 +#endif + +#ifdef WIN32 +# define WIN32_LEAN_AND_MEAN +# include +/* Mingw headers don't have latest language and sublanguage codes. */ +# ifndef LANG_AFRIKAANS +# define LANG_AFRIKAANS 0x36 +# endif +# ifndef LANG_ALBANIAN +# define LANG_ALBANIAN 0x1c +# endif +# ifndef LANG_ARABIC +# define LANG_ARABIC 0x01 +# endif +# ifndef LANG_ARMENIAN +# define LANG_ARMENIAN 0x2b +# endif +# ifndef LANG_ASSAMESE +# define LANG_ASSAMESE 0x4d +# endif +# ifndef LANG_AZERI +# define LANG_AZERI 0x2c +# endif +# ifndef LANG_BASQUE +# define LANG_BASQUE 0x2d +# endif +# ifndef LANG_BELARUSIAN +# define LANG_BELARUSIAN 0x23 +# endif +# ifndef LANG_BENGALI +# define LANG_BENGALI 0x45 +# endif +# ifndef LANG_CATALAN +# define LANG_CATALAN 0x03 +# endif +# ifndef LANG_DIVEHI +# define LANG_DIVEHI 0x65 +# endif +# ifndef LANG_ESTONIAN +# define LANG_ESTONIAN 0x25 +# endif +# ifndef LANG_FAEROESE +# define LANG_FAEROESE 0x38 +# endif +# ifndef LANG_FARSI +# define LANG_FARSI 0x29 +# endif +# ifndef LANG_GALICIAN +# define LANG_GALICIAN 0x56 +# endif +# ifndef LANG_GEORGIAN +# define LANG_GEORGIAN 0x37 +# endif +# ifndef LANG_GUJARATI +# define LANG_GUJARATI 0x47 +# endif +# ifndef LANG_HEBREW +# define LANG_HEBREW 0x0d +# endif +# ifndef LANG_HINDI +# define LANG_HINDI 0x39 +# endif +# ifndef LANG_INDONESIAN +# define LANG_INDONESIAN 0x21 +# endif +# ifndef LANG_KANNADA +# define LANG_KANNADA 0x4b +# endif +# ifndef LANG_KASHMIRI +# define LANG_KASHMIRI 0x60 +# endif +# ifndef LANG_KAZAK +# define LANG_KAZAK 0x3f +# endif +# ifndef LANG_KONKANI +# define LANG_KONKANI 0x57 +# endif +# ifndef LANG_KYRGYZ +# define LANG_KYRGYZ 0x40 +# endif +# ifndef LANG_LATVIAN +# define LANG_LATVIAN 0x26 +# endif +# ifndef LANG_LITHUANIAN +# define LANG_LITHUANIAN 0x27 +# endif +# ifndef LANG_MACEDONIAN +# define LANG_MACEDONIAN 0x2f +# endif +# ifndef LANG_MALAY +# define LANG_MALAY 0x3e +# endif +# ifndef LANG_MALAYALAM +# define LANG_MALAYALAM 0x4c +# endif +# ifndef LANG_MANIPURI +# define LANG_MANIPURI 0x58 +# endif +# ifndef LANG_MARATHI +# define LANG_MARATHI 0x4e +# endif +# ifndef LANG_MONGOLIAN +# define LANG_MONGOLIAN 0x50 +# endif +# ifndef LANG_NEPALI +# define LANG_NEPALI 0x61 +# endif +# ifndef LANG_ORIYA +# define LANG_ORIYA 0x48 +# endif +# ifndef LANG_PUNJABI +# define LANG_PUNJABI 0x46 +# endif +# ifndef LANG_SANSKRIT +# define LANG_SANSKRIT 0x4f +# endif +# ifndef LANG_SERBIAN +# define LANG_SERBIAN 0x1a +# endif +# ifndef LANG_SINDHI +# define LANG_SINDHI 0x59 +# endif +# ifndef LANG_SLOVAK +# define LANG_SLOVAK 0x1b +# endif +# ifndef LANG_SORBIAN +# define LANG_SORBIAN 0x2e +# endif +# ifndef LANG_SWAHILI +# define LANG_SWAHILI 0x41 +# endif +# ifndef LANG_SYRIAC +# define LANG_SYRIAC 0x5a +# endif +# ifndef LANG_TAMIL +# define LANG_TAMIL 0x49 +# endif +# ifndef LANG_TATAR +# define LANG_TATAR 0x44 +# endif +# ifndef LANG_TELUGU +# define LANG_TELUGU 0x4a +# endif +# ifndef LANG_THAI +# define LANG_THAI 0x1e +# endif +# ifndef LANG_UKRAINIAN +# define LANG_UKRAINIAN 0x22 +# endif +# ifndef LANG_URDU +# define LANG_URDU 0x20 +# endif +# ifndef LANG_UZBEK +# define LANG_UZBEK 0x43 +# endif +# ifndef LANG_VIETNAMESE +# define LANG_VIETNAMESE 0x2a +# endif +# ifndef SUBLANG_ARABIC_SAUDI_ARABIA +# define SUBLANG_ARABIC_SAUDI_ARABIA 0x01 +# endif +# ifndef SUBLANG_ARABIC_IRAQ +# define SUBLANG_ARABIC_IRAQ 0x02 +# endif +# ifndef SUBLANG_ARABIC_EGYPT +# define SUBLANG_ARABIC_EGYPT 0x03 +# endif +# ifndef SUBLANG_ARABIC_LIBYA +# define SUBLANG_ARABIC_LIBYA 0x04 +# endif +# ifndef SUBLANG_ARABIC_ALGERIA +# define SUBLANG_ARABIC_ALGERIA 0x05 +# endif +# ifndef SUBLANG_ARABIC_MOROCCO +# define SUBLANG_ARABIC_MOROCCO 0x06 +# endif +# ifndef SUBLANG_ARABIC_TUNISIA +# define SUBLANG_ARABIC_TUNISIA 0x07 +# endif +# ifndef SUBLANG_ARABIC_OMAN +# define SUBLANG_ARABIC_OMAN 0x08 +# endif +# ifndef SUBLANG_ARABIC_YEMEN +# define SUBLANG_ARABIC_YEMEN 0x09 +# endif +# ifndef SUBLANG_ARABIC_SYRIA +# define SUBLANG_ARABIC_SYRIA 0x0a +# endif +# ifndef SUBLANG_ARABIC_JORDAN +# define SUBLANG_ARABIC_JORDAN 0x0b +# endif +# ifndef SUBLANG_ARABIC_LEBANON +# define SUBLANG_ARABIC_LEBANON 0x0c +# endif +# ifndef SUBLANG_ARABIC_KUWAIT +# define SUBLANG_ARABIC_KUWAIT 0x0d +# endif +# ifndef SUBLANG_ARABIC_UAE +# define SUBLANG_ARABIC_UAE 0x0e +# endif +# ifndef SUBLANG_ARABIC_BAHRAIN +# define SUBLANG_ARABIC_BAHRAIN 0x0f +# endif +# ifndef SUBLANG_ARABIC_QATAR +# define SUBLANG_ARABIC_QATAR 0x10 +# endif +# ifndef SUBLANG_AZERI_LATIN +# define SUBLANG_AZERI_LATIN 0x01 +# endif +# ifndef SUBLANG_AZERI_CYRILLIC +# define SUBLANG_AZERI_CYRILLIC 0x02 +# endif +# ifndef SUBLANG_CHINESE_MACAU +# define SUBLANG_CHINESE_MACAU 0x05 +# endif +# ifndef SUBLANG_ENGLISH_SOUTH_AFRICA +# define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07 +# endif +# ifndef SUBLANG_ENGLISH_JAMAICA +# define SUBLANG_ENGLISH_JAMAICA 0x08 +# endif +# ifndef SUBLANG_ENGLISH_CARIBBEAN +# define SUBLANG_ENGLISH_CARIBBEAN 0x09 +# endif +# ifndef SUBLANG_ENGLISH_BELIZE +# define SUBLANG_ENGLISH_BELIZE 0x0a +# endif +# ifndef SUBLANG_ENGLISH_TRINIDAD +# define SUBLANG_ENGLISH_TRINIDAD 0x0b +# endif +# ifndef SUBLANG_ENGLISH_ZIMBABWE +# define SUBLANG_ENGLISH_ZIMBABWE 0x0c +# endif +# ifndef SUBLANG_ENGLISH_PHILIPPINES +# define SUBLANG_ENGLISH_PHILIPPINES 0x0d +# endif +# ifndef SUBLANG_FRENCH_LUXEMBOURG +# define SUBLANG_FRENCH_LUXEMBOURG 0x05 +# endif +# ifndef SUBLANG_FRENCH_MONACO +# define SUBLANG_FRENCH_MONACO 0x06 +# endif +# ifndef SUBLANG_GERMAN_LUXEMBOURG +# define SUBLANG_GERMAN_LUXEMBOURG 0x04 +# endif +# ifndef SUBLANG_GERMAN_LIECHTENSTEIN +# define SUBLANG_GERMAN_LIECHTENSTEIN 0x05 +# endif +# ifndef SUBLANG_KASHMIRI_INDIA +# define SUBLANG_KASHMIRI_INDIA 0x02 +# endif +# ifndef SUBLANG_MALAY_MALAYSIA +# define SUBLANG_MALAY_MALAYSIA 0x01 +# endif +# ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM +# define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02 +# endif +# ifndef SUBLANG_NEPALI_INDIA +# define SUBLANG_NEPALI_INDIA 0x02 +# endif +# ifndef SUBLANG_SERBIAN_LATIN +# define SUBLANG_SERBIAN_LATIN 0x02 +# endif +# ifndef SUBLANG_SERBIAN_CYRILLIC +# define SUBLANG_SERBIAN_CYRILLIC 0x03 +# endif +# ifndef SUBLANG_SPANISH_GUATEMALA +# define SUBLANG_SPANISH_GUATEMALA 0x04 +# endif +# ifndef SUBLANG_SPANISH_COSTA_RICA +# define SUBLANG_SPANISH_COSTA_RICA 0x05 +# endif +# ifndef SUBLANG_SPANISH_PANAMA +# define SUBLANG_SPANISH_PANAMA 0x06 +# endif +# ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC +# define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07 +# endif +# ifndef SUBLANG_SPANISH_VENEZUELA +# define SUBLANG_SPANISH_VENEZUELA 0x08 +# endif +# ifndef SUBLANG_SPANISH_COLOMBIA +# define SUBLANG_SPANISH_COLOMBIA 0x09 +# endif +# ifndef SUBLANG_SPANISH_PERU +# define SUBLANG_SPANISH_PERU 0x0a +# endif +# ifndef SUBLANG_SPANISH_ARGENTINA +# define SUBLANG_SPANISH_ARGENTINA 0x0b +# endif +# ifndef SUBLANG_SPANISH_ECUADOR +# define SUBLANG_SPANISH_ECUADOR 0x0c +# endif +# ifndef SUBLANG_SPANISH_CHILE +# define SUBLANG_SPANISH_CHILE 0x0d +# endif +# ifndef SUBLANG_SPANISH_URUGUAY +# define SUBLANG_SPANISH_URUGUAY 0x0e +# endif +# ifndef SUBLANG_SPANISH_PARAGUAY +# define SUBLANG_SPANISH_PARAGUAY 0x0f +# endif +# ifndef SUBLANG_SPANISH_BOLIVIA +# define SUBLANG_SPANISH_BOLIVIA 0x10 +# endif +# ifndef SUBLANG_SPANISH_EL_SALVADOR +# define SUBLANG_SPANISH_EL_SALVADOR 0x11 +# endif +# ifndef SUBLANG_SPANISH_HONDURAS +# define SUBLANG_SPANISH_HONDURAS 0x12 +# endif +# ifndef SUBLANG_SPANISH_NICARAGUA +# define SUBLANG_SPANISH_NICARAGUA 0x13 +# endif +# ifndef SUBLANG_SPANISH_PUERTO_RICO +# define SUBLANG_SPANISH_PUERTO_RICO 0x14 +# endif +# ifndef SUBLANG_SWEDISH_FINLAND +# define SUBLANG_SWEDISH_FINLAND 0x02 +# endif +# ifndef SUBLANG_URDU_PAKISTAN +# define SUBLANG_URDU_PAKISTAN 0x01 +# endif +# ifndef SUBLANG_URDU_INDIA +# define SUBLANG_URDU_INDIA 0x02 +# endif +# ifndef SUBLANG_UZBEK_LATIN +# define SUBLANG_UZBEK_LATIN 0x01 +# endif +# ifndef SUBLANG_UZBEK_CYRILLIC +# define SUBLANG_UZBEK_CYRILLIC 0x02 +# endif +#endif + +/* XPG3 defines the result of 'setlocale (category, NULL)' as: + "Directs 'setlocale()' to query 'category' and return the current + setting of 'local'." + However it does not specify the exact format. Neither do SUSV2 and + ISO C 99. So we can use this feature only on selected systems (e.g. + those using GNU C Library). */ +#if defined _LIBC || (defined __GNU_LIBRARY__ && __GNU_LIBRARY__ >= 2) +# define HAVE_LOCALE_NULL +#endif + +/* Determine the current locale's name, and canonicalize it into XPG syntax + language[_territory[.codeset]][@modifier] + The codeset part in the result is not reliable; the locale_charset() + should be used for codeset information instead. + The result must not be freed; it is statically allocated. */ + +const char * +_nl_locale_name (category, categoryname) + int category; + const char *categoryname; +{ + const char *retval; + +#ifndef WIN32 + + /* Use the POSIX methods of looking to 'LC_ALL', 'LC_xxx', and 'LANG'. + On some systems this can be done by the 'setlocale' function itself. */ +# if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL + retval = setlocale (category, NULL); +# else + /* Setting of LC_ALL overwrites all other. */ + retval = getenv ("LC_ALL"); + if (retval == NULL || retval[0] == '\0') + { + /* Next comes the name of the desired category. */ + retval = getenv (categoryname); + if (retval == NULL || retval[0] == '\0') + { + /* Last possibility is the LANG environment variable. */ + retval = getenv ("LANG"); + if (retval == NULL || retval[0] == '\0') + /* We use C as the default domain. POSIX says this is + implementation defined. */ + retval = "C"; + } + } +# endif + + return retval; + +#else /* WIN32 */ + + /* Return an XPG style locale name language[_territory][@modifier]. + Don't even bother determining the codeset; it's not useful in this + context, because message catalogs are not specific to a single + codeset. */ + + LCID lcid; + LANGID langid; + int primary, sub; + + /* Let the user override the system settings through environment + variables, as on POSIX systems. */ + retval = getenv ("LC_ALL"); + if (retval != NULL && retval[0] != '\0') + return retval; + retval = getenv (categoryname); + if (retval != NULL && retval[0] != '\0') + return retval; + retval = getenv ("LANG"); + if (retval != NULL && retval[0] != '\0') + return retval; + + /* Use native Win32 API locale ID. */ + lcid = GetThreadLocale (); + + /* Strip off the sorting rules, keep only the language part. */ + langid = LANGIDFROMLCID (lcid); + + /* Split into language and territory part. */ + primary = PRIMARYLANGID (langid); + sub = SUBLANGID (langid); + + /* Dispatch on language. + See also http://www.unicode.org/unicode/onlinedat/languages.html . + For details about languages, see http://www.ethnologue.com/ . */ + switch (primary) + { + case LANG_AFRIKAANS: return "af_ZA"; + case LANG_ALBANIAN: return "sq_AL"; + case 0x5e: /* AMHARIC */ return "am_ET"; + case LANG_ARABIC: + switch (sub) + { + case SUBLANG_ARABIC_SAUDI_ARABIA: return "ar_SA"; + case SUBLANG_ARABIC_IRAQ: return "ar_IQ"; + case SUBLANG_ARABIC_EGYPT: return "ar_EG"; + case SUBLANG_ARABIC_LIBYA: return "ar_LY"; + case SUBLANG_ARABIC_ALGERIA: return "ar_DZ"; + case SUBLANG_ARABIC_MOROCCO: return "ar_MA"; + case SUBLANG_ARABIC_TUNISIA: return "ar_TN"; + case SUBLANG_ARABIC_OMAN: return "ar_OM"; + case SUBLANG_ARABIC_YEMEN: return "ar_YE"; + case SUBLANG_ARABIC_SYRIA: return "ar_SY"; + case SUBLANG_ARABIC_JORDAN: return "ar_JO"; + case SUBLANG_ARABIC_LEBANON: return "ar_LB"; + case SUBLANG_ARABIC_KUWAIT: return "ar_KW"; + case SUBLANG_ARABIC_UAE: return "ar_AE"; + case SUBLANG_ARABIC_BAHRAIN: return "ar_BH"; + case SUBLANG_ARABIC_QATAR: return "ar_QA"; + } + return "ar"; + case LANG_ARMENIAN: return "hy_AM"; + case LANG_ASSAMESE: return "as_IN"; + case LANG_AZERI: + switch (sub) + { + /* FIXME: Adjust this when Azerbaijani locales appear on Unix. */ + case SUBLANG_AZERI_LATIN: return "az_AZ@latin"; + case SUBLANG_AZERI_CYRILLIC: return "az_AZ@cyrillic"; + } + return "az"; + case LANG_BASQUE: + return "eu"; /* Ambiguous: could be "eu_ES" or "eu_FR". */ + case LANG_BELARUSIAN: return "be_BY"; + case LANG_BENGALI: return "bn_IN"; + case LANG_BULGARIAN: return "bg_BG"; + case 0x55: /* BURMESE */ return "my_MM"; + case 0x53: /* CAMBODIAN */ return "km_KH"; + case LANG_CATALAN: return "ca_ES"; + case 0x5c: /* CHEROKEE */ return "chr_US"; + case LANG_CHINESE: + switch (sub) + { + case SUBLANG_CHINESE_TRADITIONAL: return "zh_TW"; + case SUBLANG_CHINESE_SIMPLIFIED: return "zh_CN"; + case SUBLANG_CHINESE_HONGKONG: return "zh_HK"; + case SUBLANG_CHINESE_SINGAPORE: return "zh_SG"; + case SUBLANG_CHINESE_MACAU: return "zh_MO"; + } + return "zh"; + case LANG_CROATIAN: /* LANG_CROATIAN == LANG_SERBIAN + * What used to be called Serbo-Croatian + * should really now be two separate + * languages because of political reasons. + * (Says tml, who knows nothing about Serbian + * or Croatian.) + * (I can feel those flames coming already.) + */ + switch (sub) + { + case SUBLANG_DEFAULT: return "hr_HR"; + case SUBLANG_SERBIAN_LATIN: return "sr_YU"; + case SUBLANG_SERBIAN_CYRILLIC: return "sr_YU@cyrillic"; + } + return "hr"; + case LANG_CZECH: return "cs_CZ"; + case LANG_DANISH: return "da_DK"; + case LANG_DIVEHI: return "div_MV"; + case LANG_DUTCH: + switch (sub) + { + case SUBLANG_DUTCH: return "nl_NL"; + case SUBLANG_DUTCH_BELGIAN: /* FLEMISH, VLAAMS */ return "nl_BE"; + } + return "nl"; + case 0x66: /* EDO */ return "bin_NG"; + case LANG_ENGLISH: + switch (sub) + { + /* SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. Heh. I thought + * English was the language spoken in England. + * Oh well. + */ + case SUBLANG_ENGLISH_US: return "en_US"; + case SUBLANG_ENGLISH_UK: return "en_GB"; + case SUBLANG_ENGLISH_AUS: return "en_AU"; + case SUBLANG_ENGLISH_CAN: return "en_CA"; + case SUBLANG_ENGLISH_NZ: return "en_NZ"; + case SUBLANG_ENGLISH_EIRE: return "en_IE"; + case SUBLANG_ENGLISH_SOUTH_AFRICA: return "en_ZA"; + case SUBLANG_ENGLISH_JAMAICA: return "en_JM"; + case SUBLANG_ENGLISH_CARIBBEAN: return "en_GD"; /* Grenada? */ + case SUBLANG_ENGLISH_BELIZE: return "en_BZ"; + case SUBLANG_ENGLISH_TRINIDAD: return "en_TT"; + case SUBLANG_ENGLISH_ZIMBABWE: return "en_ZW"; + case SUBLANG_ENGLISH_PHILIPPINES: return "en_PH"; + } + return "en"; + case LANG_ESTONIAN: return "et_EE"; + case LANG_FAEROESE: return "fo_FO"; + case LANG_FARSI: return "fa_IR"; + case LANG_FINNISH: return "fi_FI"; + case LANG_FRENCH: + switch (sub) + { + case SUBLANG_FRENCH: return "fr_FR"; + case SUBLANG_FRENCH_BELGIAN: /* WALLOON */ return "fr_BE"; + case SUBLANG_FRENCH_CANADIAN: return "fr_CA"; + case SUBLANG_FRENCH_SWISS: return "fr_CH"; + case SUBLANG_FRENCH_LUXEMBOURG: return "fr_LU"; + case SUBLANG_FRENCH_MONACO: return "fr_MC"; + } + return "fr"; + case 0x62: /* FRISIAN */ return "fy_NL"; + case 0x67: /* FULFULDE */ return "ful_NG"; + case 0x3c: /* GAELIC */ + switch (sub) + { + case 0x01: /* SCOTTISH */ return "gd_GB"; + case 0x02: /* IRISH */ return "ga_IE"; + } + return "C"; + case LANG_GALICIAN: return "gl_ES"; + case LANG_GEORGIAN: return "ka_GE"; + case LANG_GERMAN: + switch (sub) + { + case SUBLANG_GERMAN: return "de_DE"; + case SUBLANG_GERMAN_SWISS: return "de_CH"; + case SUBLANG_GERMAN_AUSTRIAN: return "de_AT"; + case SUBLANG_GERMAN_LUXEMBOURG: return "de_LU"; + case SUBLANG_GERMAN_LIECHTENSTEIN: return "de_LI"; + } + return "de"; + case LANG_GREEK: return "el_GR"; + case 0x74: /* GUARANI */ return "gn_PY"; + case LANG_GUJARATI: return "gu_IN"; + case 0x68: /* HAUSA */ return "ha_NG"; + case 0x75: /* HAWAIIAN */ + /* FIXME: Do they mean Hawaiian ("haw_US", 1000 speakers) + or Hawaii Creole English ("cpe_US", 600000 speakers)? */ + return "cpe_US"; + case LANG_HEBREW: return "he_IL"; + case LANG_HINDI: return "hi_IN"; + case LANG_HUNGARIAN: return "hu_HU"; + case 0x69: /* IBIBIO */ return "nic_NG"; + case LANG_ICELANDIC: return "is_IS"; + case 0x70: /* IGBO */ return "ibo_NG"; + case LANG_INDONESIAN: return "id_ID"; + case 0x5d: /* INUKTITUT */ return "iu_CA"; + case LANG_ITALIAN: + switch (sub) + { + case SUBLANG_ITALIAN: return "it_IT"; + case SUBLANG_ITALIAN_SWISS: return "it_CH"; + } + return "it"; + case LANG_JAPANESE: return "ja_JP"; + case LANG_KANNADA: return "kn_IN"; + case 0x71: /* KANURI */ return "kau_NG"; + case LANG_KASHMIRI: + switch (sub) + { + case SUBLANG_DEFAULT: return "ks_PK"; + case SUBLANG_KASHMIRI_INDIA: return "ks_IN"; + } + return "ks"; + case LANG_KAZAK: return "kk_KZ"; + case LANG_KONKANI: + /* FIXME: Adjust this when such locales appear on Unix. */ + return "kok_IN"; + case LANG_KOREAN: return "ko_KR"; + case LANG_KYRGYZ: return "ky_KG"; + case 0x54: /* LAO */ return "lo_LA"; + case 0x76: /* LATIN */ return "la_VA"; + case LANG_LATVIAN: return "lv_LV"; + case LANG_LITHUANIAN: return "lt_LT"; + case LANG_MACEDONIAN: return "mk_MK"; + case LANG_MALAY: + switch (sub) + { + case SUBLANG_MALAY_MALAYSIA: return "ms_MY"; + case SUBLANG_MALAY_BRUNEI_DARUSSALAM: return "ms_BN"; + } + return "ms"; + case LANG_MALAYALAM: return "ml_IN"; + case 0x3a: /* MALTESE */ return "mt_MT"; + case LANG_MANIPURI: + /* FIXME: Adjust this when such locales appear on Unix. */ + return "mni_IN"; + case LANG_MARATHI: return "mr_IN"; + case LANG_MONGOLIAN: + return "mn"; /* Ambiguous: could be "mn_CN" or "mn_MN". */ + case LANG_NEPALI: + switch (sub) + { + case SUBLANG_DEFAULT: return "ne_NP"; + case SUBLANG_NEPALI_INDIA: return "ne_IN"; + } + return "ne"; + case LANG_NORWEGIAN: + switch (sub) + { + case SUBLANG_NORWEGIAN_BOKMAL: return "no_NO"; + case SUBLANG_NORWEGIAN_NYNORSK: return "nn_NO"; + } + return "no"; + case LANG_ORIYA: return "or_IN"; + case 0x72: /* OROMO */ return "om_ET"; + case 0x79: /* PAPIAMENTU */ return "pap_AN"; + case 0x63: /* PASHTO */ + return "ps"; /* Ambiguous: could be "ps_PK" or "ps_AF". */ + case LANG_POLISH: return "pl_PL"; + case LANG_PORTUGUESE: + switch (sub) + { + case SUBLANG_PORTUGUESE: return "pt_PT"; + /* Hmm. SUBLANG_PORTUGUESE_BRAZILIAN == SUBLANG_DEFAULT. + Same phenomenon as SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. */ + case SUBLANG_PORTUGUESE_BRAZILIAN: return "pt_BR"; + } + return "pt"; + case LANG_PUNJABI: return "pa_IN"; + case 0x17: /* RHAETO-ROMANCE */ return "rm_CH"; + case LANG_ROMANIAN: return "ro_RO"; + case LANG_RUSSIAN: + return "ru"; /* Ambiguous: could be "ru_RU" or "ru_UA". */ + case 0x3b: /* SAMI */ return "se_NO"; + case LANG_SANSKRIT: return "sa_IN"; + case LANG_SINDHI: return "sd"; + case 0x5b: /* SINHALESE */ return "si_LK"; + case LANG_SLOVAK: return "sk_SK"; + case LANG_SLOVENIAN: return "sl_SI"; + case 0x77: /* SOMALI */ return "so_SO"; + case LANG_SORBIAN: + /* FIXME: Adjust this when such locales appear on Unix. */ + return "wen_DE"; + case LANG_SPANISH: + switch (sub) + { + case SUBLANG_SPANISH: return "es_ES"; + case SUBLANG_SPANISH_MEXICAN: return "es_MX"; + case SUBLANG_SPANISH_MODERN: + return "es_ES@modern"; /* not seen on Unix */ + case SUBLANG_SPANISH_GUATEMALA: return "es_GT"; + case SUBLANG_SPANISH_COSTA_RICA: return "es_CR"; + case SUBLANG_SPANISH_PANAMA: return "es_PA"; + case SUBLANG_SPANISH_DOMINICAN_REPUBLIC: return "es_DO"; + case SUBLANG_SPANISH_VENEZUELA: return "es_VE"; + case SUBLANG_SPANISH_COLOMBIA: return "es_CO"; + case SUBLANG_SPANISH_PERU: return "es_PE"; + case SUBLANG_SPANISH_ARGENTINA: return "es_AR"; + case SUBLANG_SPANISH_ECUADOR: return "es_EC"; + case SUBLANG_SPANISH_CHILE: return "es_CL"; + case SUBLANG_SPANISH_URUGUAY: return "es_UY"; + case SUBLANG_SPANISH_PARAGUAY: return "es_PY"; + case SUBLANG_SPANISH_BOLIVIA: return "es_BO"; + case SUBLANG_SPANISH_EL_SALVADOR: return "es_SV"; + case SUBLANG_SPANISH_HONDURAS: return "es_HN"; + case SUBLANG_SPANISH_NICARAGUA: return "es_NI"; + case SUBLANG_SPANISH_PUERTO_RICO: return "es_PR"; + } + return "es"; + case 0x30: /* SUTU */ return "bnt_TZ"; + case LANG_SWAHILI: return "sw_KE"; + case LANG_SWEDISH: + switch (sub) + { + case SUBLANG_DEFAULT: return "sv_SE"; + case SUBLANG_SWEDISH_FINLAND: return "sv_FI"; + } + return "sv"; + case LANG_SYRIAC: return "syr_TR"; /* An extinct language. */ + case 0x64: /* TAGALOG */ return "tl_PH"; + case 0x28: /* TAJIK */ return "tg_TJ"; + case 0x5f: /* TAMAZIGHT */ return "ber_MA"; + case LANG_TAMIL: + return "ta"; /* Ambiguous: could be "ta_IN" or "ta_LK" or "ta_SG". */ + case LANG_TATAR: return "tt_RU"; + case LANG_TELUGU: return "te_IN"; + case LANG_THAI: return "th_TH"; + case 0x51: /* TIBETAN */ return "bo_CN"; + case 0x73: /* TIGRINYA */ return "ti_ET"; + case 0x31: /* TSONGA */ return "ts_ZA"; + case LANG_TURKISH: return "tr_TR"; + case 0x42: /* TURKMEN */ return "tk_TM"; + case LANG_UKRAINIAN: return "uk_UA"; + case LANG_URDU: + switch (sub) + { + case SUBLANG_URDU_PAKISTAN: return "ur_PK"; + case SUBLANG_URDU_INDIA: return "ur_IN"; + } + return "ur"; + case LANG_UZBEK: + switch (sub) + { + /* FIXME: Adjust this when Uzbek locales appear on Unix. */ + case SUBLANG_UZBEK_LATIN: return "uz_UZ@latin"; + case SUBLANG_UZBEK_CYRILLIC: return "uz_UZ@cyrillic"; + } + return "uz"; + case 0x33: /* VENDA */ return "ven_ZA"; + case LANG_VIETNAMESE: return "vi_VN"; + case 0x52: /* WELSH */ return "cy_GB"; + case 0x34: /* XHOSA */ return "xh_ZA"; + case 0x78: /* YI */ return "sit_CN"; + case 0x3d: /* YIDDISH */ return "yi_IL"; + case 0x6a: /* YORUBA */ return "yo_NG"; + case 0x35: /* ZULU */ return "zu_ZA"; + default: return "C"; + } + +#endif +} diff --git a/intl/ngettext.c b/intl/ngettext.c new file mode 100644 index 0000000..69fe1f7 --- /dev/null +++ b/intl/ngettext.c @@ -0,0 +1,68 @@ +/* Implementation of ngettext(3) function. + Copyright (C) 1995, 1997, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#ifdef _LIBC +# define __need_NULL +# include +#else +# include /* Just for NULL. */ +#endif + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +#include + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define NGETTEXT __ngettext +# define DCNGETTEXT INTUSE(__dcngettext) +#else +# define NGETTEXT libintl_ngettext +# define DCNGETTEXT libintl_dcngettext +#endif + +/* Look up MSGID in the current default message catalog for the current + LC_MESSAGES locale. If not found, returns MSGID itself (the default + text). */ +char * +NGETTEXT (msgid1, msgid2, n) + const char *msgid1; + const char *msgid2; + unsigned long int n; +{ + return DCNGETTEXT (NULL, msgid1, msgid2, n, LC_MESSAGES); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__ngettext, ngettext); +#endif diff --git a/intl/os2compat.c b/intl/os2compat.c new file mode 100644 index 0000000..c8dc33e --- /dev/null +++ b/intl/os2compat.c @@ -0,0 +1,98 @@ +/* OS/2 compatibility functions. + Copyright (C) 2001-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#define OS2_AWARE +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +/* A version of getenv() that works from DLLs */ +extern unsigned long DosScanEnv (const unsigned char *pszName, unsigned char **ppszValue); + +char * +_nl_getenv (const char *name) +{ + unsigned char *value; + if (DosScanEnv (name, &value)) + return NULL; + else + return value; +} + +/* A fixed size buffer. */ +char libintl_nl_default_dirname[MAXPATHLEN+1]; + +char *_nlos2_libdir = NULL; +char *_nlos2_localealiaspath = NULL; +char *_nlos2_localedir = NULL; + +static __attribute__((constructor)) void +nlos2_initialize () +{ + char *root = getenv ("UNIXROOT"); + char *gnulocaledir = getenv ("GNULOCALEDIR"); + + _nlos2_libdir = gnulocaledir; + if (!_nlos2_libdir) + { + if (root) + { + size_t sl = strlen (root); + _nlos2_libdir = (char *) malloc (sl + strlen (LIBDIR) + 1); + memcpy (_nlos2_libdir, root, sl); + memcpy (_nlos2_libdir + sl, LIBDIR, strlen (LIBDIR) + 1); + } + else + _nlos2_libdir = LIBDIR; + } + + _nlos2_localealiaspath = gnulocaledir; + if (!_nlos2_localealiaspath) + { + if (root) + { + size_t sl = strlen (root); + _nlos2_localealiaspath = (char *) malloc (sl + strlen (LOCALE_ALIAS_PATH) + 1); + memcpy (_nlos2_localealiaspath, root, sl); + memcpy (_nlos2_localealiaspath + sl, LOCALE_ALIAS_PATH, strlen (LOCALE_ALIAS_PATH) + 1); + } + else + _nlos2_localealiaspath = LOCALE_ALIAS_PATH; + } + + _nlos2_localedir = gnulocaledir; + if (!_nlos2_localedir) + { + if (root) + { + size_t sl = strlen (root); + _nlos2_localedir = (char *) malloc (sl + strlen (LOCALEDIR) + 1); + memcpy (_nlos2_localedir, root, sl); + memcpy (_nlos2_localedir + sl, LOCALEDIR, strlen (LOCALEDIR) + 1); + } + else + _nlos2_localedir = LOCALEDIR; + } + + if (strlen (_nlos2_localedir) <= MAXPATHLEN) + strcpy (libintl_nl_default_dirname, _nlos2_localedir); +} diff --git a/intl/os2compat.h b/intl/os2compat.h new file mode 100644 index 0000000..4f74e8c --- /dev/null +++ b/intl/os2compat.h @@ -0,0 +1,46 @@ +/* OS/2 compatibility defines. + This file is intended to be included from config.h + Copyright (C) 2001-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* When included from os2compat.h we need all the original definitions */ +#ifndef OS2_AWARE + +#undef LIBDIR +#define LIBDIR _nlos2_libdir +extern char *_nlos2_libdir; + +#undef LOCALEDIR +#define LOCALEDIR _nlos2_localedir +extern char *_nlos2_localedir; + +#undef LOCALE_ALIAS_PATH +#define LOCALE_ALIAS_PATH _nlos2_localealiaspath +extern char *_nlos2_localealiaspath; + +#endif + +#undef HAVE_STRCASECMP +#define HAVE_STRCASECMP 1 +#define strcasecmp stricmp +#define strncasecmp strnicmp + +/* We have our own getenv() which works even if library is compiled as DLL */ +#define getenv _nl_getenv + +/* Older versions of gettext used -1 as the value of LC_MESSAGES */ +#define LC_MESSAGES_COMPAT (-1) diff --git a/intl/osdep.c b/intl/osdep.c new file mode 100644 index 0000000..b372598 --- /dev/null +++ b/intl/osdep.c @@ -0,0 +1,24 @@ +/* OS dependent parts of libintl. + Copyright (C) 2001-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#if defined __EMX__ +# include "os2compat.c" +#else +/* Avoid AIX compiler warning. */ +typedef int dummy; +#endif diff --git a/intl/plural-exp.c b/intl/plural-exp.c new file mode 100644 index 0000000..c937c01 --- /dev/null +++ b/intl/plural-exp.c @@ -0,0 +1,156 @@ +/* Expression parsing for plural form selection. + Copyright (C) 2000, 2001 Free Software Foundation, Inc. + Written by Ulrich Drepper , 2000. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +#include "plural-exp.h" + +#if (defined __GNUC__ && !defined __APPLE_CC__) \ + || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) + +/* These structs are the constant expression for the germanic plural + form determination. It represents the expression "n != 1". */ +static const struct expression plvar = +{ + .nargs = 0, + .operation = var, +}; +static const struct expression plone = +{ + .nargs = 0, + .operation = num, + .val = + { + .num = 1 + } +}; +struct expression GERMANIC_PLURAL = +{ + .nargs = 2, + .operation = not_equal, + .val = + { + .args = + { + [0] = (struct expression *) &plvar, + [1] = (struct expression *) &plone + } + } +}; + +# define INIT_GERMANIC_PLURAL() + +#else + +/* For compilers without support for ISO C 99 struct/union initializers: + Initialization at run-time. */ + +static struct expression plvar; +static struct expression plone; +struct expression GERMANIC_PLURAL; + +static void +init_germanic_plural () +{ + if (plone.val.num == 0) + { + plvar.nargs = 0; + plvar.operation = var; + + plone.nargs = 0; + plone.operation = num; + plone.val.num = 1; + + GERMANIC_PLURAL.nargs = 2; + GERMANIC_PLURAL.operation = not_equal; + GERMANIC_PLURAL.val.args[0] = &plvar; + GERMANIC_PLURAL.val.args[1] = &plone; + } +} + +# define INIT_GERMANIC_PLURAL() init_germanic_plural () + +#endif + +void +internal_function +EXTRACT_PLURAL_EXPRESSION (nullentry, pluralp, npluralsp) + const char *nullentry; + struct expression **pluralp; + unsigned long int *npluralsp; +{ + if (nullentry != NULL) + { + const char *plural; + const char *nplurals; + + plural = strstr (nullentry, "plural="); + nplurals = strstr (nullentry, "nplurals="); + if (plural == NULL || nplurals == NULL) + goto no_plural; + else + { + char *endp; + unsigned long int n; + struct parse_args args; + + /* First get the number. */ + nplurals += 9; + while (*nplurals != '\0' && isspace ((unsigned char) *nplurals)) + ++nplurals; + if (!(*nplurals >= '0' && *nplurals <= '9')) + goto no_plural; +#if defined HAVE_STRTOUL || defined _LIBC + n = strtoul (nplurals, &endp, 10); +#else + for (endp = nplurals, n = 0; *endp >= '0' && *endp <= '9'; endp++) + n = n * 10 + (*endp - '0'); +#endif + if (nplurals == endp) + goto no_plural; + *npluralsp = n; + + /* Due to the restrictions bison imposes onto the interface of the + scanner function we have to put the input string and the result + passed up from the parser into the same structure which address + is passed down to the parser. */ + plural += 7; + args.cp = plural; + if (PLURAL_PARSE (&args) != 0) + goto no_plural; + *pluralp = args.res; + } + } + else + { + /* By default we are using the Germanic form: singular form only + for `one', the plural form otherwise. Yes, this is also what + English is using since English is a Germanic language. */ + no_plural: + INIT_GERMANIC_PLURAL (); + *pluralp = &GERMANIC_PLURAL; + *npluralsp = 2; + } +} diff --git a/intl/plural-exp.h b/intl/plural-exp.h new file mode 100644 index 0000000..9e5d165 --- /dev/null +++ b/intl/plural-exp.h @@ -0,0 +1,126 @@ +/* Expression parsing and evaluation for plural form selection. + Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. + Written by Ulrich Drepper , 2000. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _PLURAL_EXP_H +#define _PLURAL_EXP_H + +#ifndef PARAMS +# if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif +#endif + +#ifndef internal_function +# define internal_function +#endif + +#ifndef attribute_hidden +# define attribute_hidden +#endif + + +/* This is the representation of the expressions to determine the + plural form. */ +struct expression +{ + int nargs; /* Number of arguments. */ + enum operator + { + /* Without arguments: */ + var, /* The variable "n". */ + num, /* Decimal number. */ + /* Unary operators: */ + lnot, /* Logical NOT. */ + /* Binary operators: */ + mult, /* Multiplication. */ + divide, /* Division. */ + module, /* Modulo operation. */ + plus, /* Addition. */ + minus, /* Subtraction. */ + less_than, /* Comparison. */ + greater_than, /* Comparison. */ + less_or_equal, /* Comparison. */ + greater_or_equal, /* Comparison. */ + equal, /* Comparison for equality. */ + not_equal, /* Comparison for inequality. */ + land, /* Logical AND. */ + lor, /* Logical OR. */ + /* Ternary operators: */ + qmop /* Question mark operator. */ + } operation; + union + { + unsigned long int num; /* Number value for `num'. */ + struct expression *args[3]; /* Up to three arguments. */ + } val; +}; + +/* This is the data structure to pass information to the parser and get + the result in a thread-safe way. */ +struct parse_args +{ + const char *cp; + struct expression *res; +}; + + +/* Names for the libintl functions are a problem. This source code is used + 1. in the GNU C Library library, + 2. in the GNU libintl library, + 3. in the GNU gettext tools. + The function names in each situation must be different, to allow for + binary incompatible changes in 'struct expression'. Furthermore, + 1. in the GNU C Library library, the names have a __ prefix, + 2.+3. in the GNU libintl library and in the GNU gettext tools, the names + must follow ANSI C and not start with __. + So we have to distinguish the three cases. */ +#ifdef _LIBC +# define FREE_EXPRESSION __gettext_free_exp +# define PLURAL_PARSE __gettextparse +# define GERMANIC_PLURAL __gettext_germanic_plural +# define EXTRACT_PLURAL_EXPRESSION __gettext_extract_plural +#elif defined (IN_LIBINTL) +# define FREE_EXPRESSION libintl_gettext_free_exp +# define PLURAL_PARSE libintl_gettextparse +# define GERMANIC_PLURAL libintl_gettext_germanic_plural +# define EXTRACT_PLURAL_EXPRESSION libintl_gettext_extract_plural +#else +# define FREE_EXPRESSION free_plural_expression +# define PLURAL_PARSE parse_plural_expression +# define GERMANIC_PLURAL germanic_plural +# define EXTRACT_PLURAL_EXPRESSION extract_plural_expression +#endif + +extern void FREE_EXPRESSION PARAMS ((struct expression *exp)) + internal_function; +extern int PLURAL_PARSE PARAMS ((void *arg)); +extern struct expression GERMANIC_PLURAL attribute_hidden; +extern void EXTRACT_PLURAL_EXPRESSION PARAMS ((const char *nullentry, + struct expression **pluralp, + unsigned long int *npluralsp)) + internal_function; + +#if !defined (_LIBC) && !defined (IN_LIBINTL) +extern unsigned long int plural_eval PARAMS ((struct expression *pexp, + unsigned long int n)); +#endif + +#endif /* _PLURAL_EXP_H */ diff --git a/intl/plural.y b/intl/plural.y new file mode 100644 index 0000000..616b7c1 --- /dev/null +++ b/intl/plural.y @@ -0,0 +1,409 @@ +%{ +/* Expression parsing for plural form selection. + Copyright (C) 2000, 2001 Free Software Foundation, Inc. + Written by Ulrich Drepper , 2000. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* The bison generated parser uses alloca. AIX 3 forces us to put this + declaration at the beginning of the file. The declaration in bison's + skeleton file comes too late. This must come before + because may include arbitrary system headers. */ +#if defined _AIX && !defined __GNUC__ + #pragma alloca +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include "plural-exp.h" + +/* The main function generated by the parser is called __gettextparse, + but we want it to be called PLURAL_PARSE. */ +#ifndef _LIBC +# define __gettextparse PLURAL_PARSE +#endif + +#define YYLEX_PARAM &((struct parse_args *) arg)->cp +#define YYPARSE_PARAM arg +%} +%pure_parser +%expect 7 + +%union { + unsigned long int num; + enum operator op; + struct expression *exp; +} + +%{ +/* Prototypes for local functions. */ +static struct expression *new_exp PARAMS ((int nargs, enum operator op, + struct expression * const *args)); +static inline struct expression *new_exp_0 PARAMS ((enum operator op)); +static inline struct expression *new_exp_1 PARAMS ((enum operator op, + struct expression *right)); +static struct expression *new_exp_2 PARAMS ((enum operator op, + struct expression *left, + struct expression *right)); +static inline struct expression *new_exp_3 PARAMS ((enum operator op, + struct expression *bexp, + struct expression *tbranch, + struct expression *fbranch)); +static int yylex PARAMS ((YYSTYPE *lval, const char **pexp)); +static void yyerror PARAMS ((const char *str)); + +/* Allocation of expressions. */ + +static struct expression * +new_exp (nargs, op, args) + int nargs; + enum operator op; + struct expression * const *args; +{ + int i; + struct expression *newp; + + /* If any of the argument could not be malloc'ed, just return NULL. */ + for (i = nargs - 1; i >= 0; i--) + if (args[i] == NULL) + goto fail; + + /* Allocate a new expression. */ + newp = (struct expression *) malloc (sizeof (*newp)); + if (newp != NULL) + { + newp->nargs = nargs; + newp->operation = op; + for (i = nargs - 1; i >= 0; i--) + newp->val.args[i] = args[i]; + return newp; + } + + fail: + for (i = nargs - 1; i >= 0; i--) + FREE_EXPRESSION (args[i]); + + return NULL; +} + +static inline struct expression * +new_exp_0 (op) + enum operator op; +{ + return new_exp (0, op, NULL); +} + +static inline struct expression * +new_exp_1 (op, right) + enum operator op; + struct expression *right; +{ + struct expression *args[1]; + + args[0] = right; + return new_exp (1, op, args); +} + +static struct expression * +new_exp_2 (op, left, right) + enum operator op; + struct expression *left; + struct expression *right; +{ + struct expression *args[2]; + + args[0] = left; + args[1] = right; + return new_exp (2, op, args); +} + +static inline struct expression * +new_exp_3 (op, bexp, tbranch, fbranch) + enum operator op; + struct expression *bexp; + struct expression *tbranch; + struct expression *fbranch; +{ + struct expression *args[3]; + + args[0] = bexp; + args[1] = tbranch; + args[2] = fbranch; + return new_exp (3, op, args); +} + +%} + +/* This declares that all operators have the same associativity and the + precedence order as in C. See [Harbison, Steele: C, A Reference Manual]. + There is no unary minus and no bitwise operators. + Operators with the same syntactic behaviour have been merged into a single + token, to save space in the array generated by bison. */ +%right '?' /* ? */ +%left '|' /* || */ +%left '&' /* && */ +%left EQUOP2 /* == != */ +%left CMPOP2 /* < > <= >= */ +%left ADDOP2 /* + - */ +%left MULOP2 /* * / % */ +%right '!' /* ! */ + +%token EQUOP2 CMPOP2 ADDOP2 MULOP2 +%token NUMBER +%type exp + +%% + +start: exp + { + if ($1 == NULL) + YYABORT; + ((struct parse_args *) arg)->res = $1; + } + ; + +exp: exp '?' exp ':' exp + { + $$ = new_exp_3 (qmop, $1, $3, $5); + } + | exp '|' exp + { + $$ = new_exp_2 (lor, $1, $3); + } + | exp '&' exp + { + $$ = new_exp_2 (land, $1, $3); + } + | exp EQUOP2 exp + { + $$ = new_exp_2 ($2, $1, $3); + } + | exp CMPOP2 exp + { + $$ = new_exp_2 ($2, $1, $3); + } + | exp ADDOP2 exp + { + $$ = new_exp_2 ($2, $1, $3); + } + | exp MULOP2 exp + { + $$ = new_exp_2 ($2, $1, $3); + } + | '!' exp + { + $$ = new_exp_1 (lnot, $2); + } + | 'n' + { + $$ = new_exp_0 (var); + } + | NUMBER + { + if (($$ = new_exp_0 (num)) != NULL) + $$->val.num = $1; + } + | '(' exp ')' + { + $$ = $2; + } + ; + +%% + +void +internal_function +FREE_EXPRESSION (exp) + struct expression *exp; +{ + if (exp == NULL) + return; + + /* Handle the recursive case. */ + switch (exp->nargs) + { + case 3: + FREE_EXPRESSION (exp->val.args[2]); + /* FALLTHROUGH */ + case 2: + FREE_EXPRESSION (exp->val.args[1]); + /* FALLTHROUGH */ + case 1: + FREE_EXPRESSION (exp->val.args[0]); + /* FALLTHROUGH */ + default: + break; + } + + free (exp); +} + + +static int +yylex (lval, pexp) + YYSTYPE *lval; + const char **pexp; +{ + const char *exp = *pexp; + int result; + + while (1) + { + if (exp[0] == '\0') + { + *pexp = exp; + return YYEOF; + } + + if (exp[0] != ' ' && exp[0] != '\t') + break; + + ++exp; + } + + result = *exp++; + switch (result) + { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + { + unsigned long int n = result - '0'; + while (exp[0] >= '0' && exp[0] <= '9') + { + n *= 10; + n += exp[0] - '0'; + ++exp; + } + lval->num = n; + result = NUMBER; + } + break; + + case '=': + if (exp[0] == '=') + { + ++exp; + lval->op = equal; + result = EQUOP2; + } + else + result = YYERRCODE; + break; + + case '!': + if (exp[0] == '=') + { + ++exp; + lval->op = not_equal; + result = EQUOP2; + } + break; + + case '&': + case '|': + if (exp[0] == result) + ++exp; + else + result = YYERRCODE; + break; + + case '<': + if (exp[0] == '=') + { + ++exp; + lval->op = less_or_equal; + } + else + lval->op = less_than; + result = CMPOP2; + break; + + case '>': + if (exp[0] == '=') + { + ++exp; + lval->op = greater_or_equal; + } + else + lval->op = greater_than; + result = CMPOP2; + break; + + case '*': + lval->op = mult; + result = MULOP2; + break; + + case '/': + lval->op = divide; + result = MULOP2; + break; + + case '%': + lval->op = module; + result = MULOP2; + break; + + case '+': + lval->op = plus; + result = ADDOP2; + break; + + case '-': + lval->op = minus; + result = ADDOP2; + break; + + case 'n': + case '?': + case ':': + case '(': + case ')': + /* Nothing, just return the character. */ + break; + + case ';': + case '\n': + case '\0': + /* Be safe and let the user call this function again. */ + --exp; + result = YYEOF; + break; + + default: + result = YYERRCODE; +#if YYDEBUG != 0 + --exp; +#endif + break; + } + + *pexp = exp; + + return result; +} + + +static void +yyerror (str) + const char *str; +{ + /* Do nothing. We don't print error messages here. */ +} diff --git a/intl/ref-add.sin b/intl/ref-add.sin new file mode 100644 index 0000000..167374e --- /dev/null +++ b/intl/ref-add.sin @@ -0,0 +1,31 @@ +# Add this package to a list of references stored in a text file. +# +# Copyright (C) 2000 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. +# +# Written by Bruno Haible . +# +/^# Packages using this file: / { + s/# Packages using this file:// + ta + :a + s/ @PACKAGE@ / @PACKAGE@ / + tb + s/ $/ @PACKAGE@ / + :b + s/^/# Packages using this file:/ +} diff --git a/intl/ref-del.sin b/intl/ref-del.sin new file mode 100644 index 0000000..613cf37 --- /dev/null +++ b/intl/ref-del.sin @@ -0,0 +1,26 @@ +# Remove this package from a list of references stored in a text file. +# +# Copyright (C) 2000 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. +# +# Written by Bruno Haible . +# +/^# Packages using this file: / { + s/# Packages using this file:// + s/ @PACKAGE@ / / + s/^/# Packages using this file:/ +} diff --git a/intl/textdomain.c b/intl/textdomain.c new file mode 100644 index 0000000..f259c69 --- /dev/null +++ b/intl/textdomain.c @@ -0,0 +1,142 @@ +/* Implementation of the textdomain(3) function. + Copyright (C) 1995-1998, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif +#include "gettextP.h" + +#ifdef _LIBC +/* We have to handle multi-threaded applications. */ +# include +#else +/* Provide dummy implementation if this is outside glibc. */ +# define __libc_rwlock_define(CLASS, NAME) +# define __libc_rwlock_wrlock(NAME) +# define __libc_rwlock_unlock(NAME) +#endif + +/* The internal variables in the standalone libintl.a must have different + names than the internal variables in GNU libc, otherwise programs + using libintl.a cannot be linked statically. */ +#if !defined _LIBC +# define _nl_default_default_domain libintl_nl_default_default_domain +# define _nl_current_default_domain libintl_nl_current_default_domain +#endif + +/* @@ end of prolog @@ */ + +/* Name of the default text domain. */ +extern const char _nl_default_default_domain[] attribute_hidden; + +/* Default text domain in which entries for gettext(3) are to be found. */ +extern const char *_nl_current_default_domain attribute_hidden; + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define TEXTDOMAIN __textdomain +# ifndef strdup +# define strdup(str) __strdup (str) +# endif +#else +# define TEXTDOMAIN libintl_textdomain +#endif + +/* Lock variable to protect the global data in the gettext implementation. */ +__libc_rwlock_define (extern, _nl_state_lock attribute_hidden) + +/* Set the current default message catalog to DOMAINNAME. + If DOMAINNAME is null, return the current default. + If DOMAINNAME is "", reset to the default of "messages". */ +char * +TEXTDOMAIN (domainname) + const char *domainname; +{ + char *new_domain; + char *old_domain; + + /* A NULL pointer requests the current setting. */ + if (domainname == NULL) + return (char *) _nl_current_default_domain; + + __libc_rwlock_wrlock (_nl_state_lock); + + old_domain = (char *) _nl_current_default_domain; + + /* If domain name is the null string set to default domain "messages". */ + if (domainname[0] == '\0' + || strcmp (domainname, _nl_default_default_domain) == 0) + { + _nl_current_default_domain = _nl_default_default_domain; + new_domain = (char *) _nl_current_default_domain; + } + else if (strcmp (domainname, old_domain) == 0) + /* This can happen and people will use it to signal that some + environment variable changed. */ + new_domain = old_domain; + else + { + /* If the following malloc fails `_nl_current_default_domain' + will be NULL. This value will be returned and so signals we + are out of core. */ +#if defined _LIBC || defined HAVE_STRDUP + new_domain = strdup (domainname); +#else + size_t len = strlen (domainname) + 1; + new_domain = (char *) malloc (len); + if (new_domain != NULL) + memcpy (new_domain, domainname, len); +#endif + + if (new_domain != NULL) + _nl_current_default_domain = new_domain; + } + + /* We use this possibility to signal a change of the loaded catalogs + since this is most likely the case and there is no other easy we + to do it. Do it only when the call was successful. */ + if (new_domain != NULL) + { + ++_nl_msg_cat_cntr; + + if (old_domain != new_domain && old_domain != _nl_default_default_domain) + free (old_domain); + } + + __libc_rwlock_unlock (_nl_state_lock); + + return new_domain; +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__textdomain, textdomain); +#endif diff --git a/lib/CaseFolding-3.2.0.txt b/lib/CaseFolding-3.2.0.txt new file mode 100644 index 0000000..104a823 --- /dev/null +++ b/lib/CaseFolding-3.2.0.txt @@ -0,0 +1,912 @@ +# CaseFolding-3.2.0.txt +# Date: 2002-03-22,20:54:33 GMT [MD] +# +# Case Folding Properties +# +# This file is a supplement to the UnicodeData file. +# It provides a case folding mapping generated from the Unicode Character Database. +# If all characters are mapped according to the full mapping below, then +# case differences (according to UnicodeData.txt and SpecialCasing.txt) +# are eliminated. +# +# The data supports both implementations that require simple case foldings +# (where string lengths don't change), and implementations that allow full case folding +# (where string lengths may grow). Note that where they can be supported, the +# full case foldings are superior: for example, they allow "MASSE" and "Maße" to match. +# +# NOTE: case folding does not preserve normalization formats! +# +# For information on case folding, see +# UTR #21 Case Mappings, at http://www.unicode.org/unicode/reports/tr21/ +# +# ================================================================================ +# Format +# ================================================================================ +# The entries in this file are in the following machine-readable format: +# +# ; ; ; # +# +# The status field is: +# C: common case folding, common mappings shared by both simple and full mappings. +# F: full case folding, mappings that cause strings to grow in length. Multiple characters are separated by spaces. +# S: simple case folding, mappings to single characters where different from F. +# T: special case for uppercase I and dotted uppercase I +# - For non-Turkic languages, this mapping is normally not used. +# - For Turkic languages (tr, az), this mapping can be used instead of the normal mapping for these characters. +# +# Usage: +# A. To do a simple case folding, use the mappings with status C + S. +# B. To do a full case folding, use the mappings with status C + F. +# +# The mappings with status T can be used or omitted depending on the desired case-folding +# behavior. (The default option is to exclude them.) +# +# ================================================================= + +0041; C; 0061; # LATIN CAPITAL LETTER A +0042; C; 0062; # LATIN CAPITAL LETTER B +0043; C; 0063; # LATIN CAPITAL LETTER C +0044; C; 0064; # LATIN CAPITAL LETTER D +0045; C; 0065; # LATIN CAPITAL LETTER E +0046; C; 0066; # LATIN CAPITAL LETTER F +0047; C; 0067; # LATIN CAPITAL LETTER G +0048; C; 0068; # LATIN CAPITAL LETTER H +0049; C; 0069; # LATIN CAPITAL LETTER I +0049; T; 0131; # LATIN CAPITAL LETTER I +004A; C; 006A; # LATIN CAPITAL LETTER J +004B; C; 006B; # LATIN CAPITAL LETTER K +004C; C; 006C; # LATIN CAPITAL LETTER L +004D; C; 006D; # LATIN CAPITAL LETTER M +004E; C; 006E; # LATIN CAPITAL LETTER N +004F; C; 006F; # LATIN CAPITAL LETTER O +0050; C; 0070; # LATIN CAPITAL LETTER P +0051; C; 0071; # LATIN CAPITAL LETTER Q +0052; C; 0072; # LATIN CAPITAL LETTER R +0053; C; 0073; # LATIN CAPITAL LETTER S +0054; C; 0074; # LATIN CAPITAL LETTER T +0055; C; 0075; # LATIN CAPITAL LETTER U +0056; C; 0076; # LATIN CAPITAL LETTER V +0057; C; 0077; # LATIN CAPITAL LETTER W +0058; C; 0078; # LATIN CAPITAL LETTER X +0059; C; 0079; # LATIN CAPITAL LETTER Y +005A; C; 007A; # LATIN CAPITAL LETTER Z +00B5; C; 03BC; # MICRO SIGN +00C0; C; 00E0; # LATIN CAPITAL LETTER A WITH GRAVE +00C1; C; 00E1; # LATIN CAPITAL LETTER A WITH ACUTE +00C2; C; 00E2; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +00C3; C; 00E3; # LATIN CAPITAL LETTER A WITH TILDE +00C4; C; 00E4; # LATIN CAPITAL LETTER A WITH DIAERESIS +00C5; C; 00E5; # LATIN CAPITAL LETTER A WITH RING ABOVE +00C6; C; 00E6; # LATIN CAPITAL LETTER AE +00C7; C; 00E7; # LATIN CAPITAL LETTER C WITH CEDILLA +00C8; C; 00E8; # LATIN CAPITAL LETTER E WITH GRAVE +00C9; C; 00E9; # LATIN CAPITAL LETTER E WITH ACUTE +00CA; C; 00EA; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +00CB; C; 00EB; # LATIN CAPITAL LETTER E WITH DIAERESIS +00CC; C; 00EC; # LATIN CAPITAL LETTER I WITH GRAVE +00CD; C; 00ED; # LATIN CAPITAL LETTER I WITH ACUTE +00CE; C; 00EE; # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +00CF; C; 00EF; # LATIN CAPITAL LETTER I WITH DIAERESIS +00D0; C; 00F0; # LATIN CAPITAL LETTER ETH +00D1; C; 00F1; # LATIN CAPITAL LETTER N WITH TILDE +00D2; C; 00F2; # LATIN CAPITAL LETTER O WITH GRAVE +00D3; C; 00F3; # LATIN CAPITAL LETTER O WITH ACUTE +00D4; C; 00F4; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +00D5; C; 00F5; # LATIN CAPITAL LETTER O WITH TILDE +00D6; C; 00F6; # LATIN CAPITAL LETTER O WITH DIAERESIS +00D8; C; 00F8; # LATIN CAPITAL LETTER O WITH STROKE +00D9; C; 00F9; # LATIN CAPITAL LETTER U WITH GRAVE +00DA; C; 00FA; # LATIN CAPITAL LETTER U WITH ACUTE +00DB; C; 00FB; # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +00DC; C; 00FC; # LATIN CAPITAL LETTER U WITH DIAERESIS +00DD; C; 00FD; # LATIN CAPITAL LETTER Y WITH ACUTE +00DE; C; 00FE; # LATIN CAPITAL LETTER THORN +00DF; F; 0073 0073; # LATIN SMALL LETTER SHARP S +0100; C; 0101; # LATIN CAPITAL LETTER A WITH MACRON +0102; C; 0103; # LATIN CAPITAL LETTER A WITH BREVE +0104; C; 0105; # LATIN CAPITAL LETTER A WITH OGONEK +0106; C; 0107; # LATIN CAPITAL LETTER C WITH ACUTE +0108; C; 0109; # LATIN CAPITAL LETTER C WITH CIRCUMFLEX +010A; C; 010B; # LATIN CAPITAL LETTER C WITH DOT ABOVE +010C; C; 010D; # LATIN CAPITAL LETTER C WITH CARON +010E; C; 010F; # LATIN CAPITAL LETTER D WITH CARON +0110; C; 0111; # LATIN CAPITAL LETTER D WITH STROKE +0112; C; 0113; # LATIN CAPITAL LETTER E WITH MACRON +0114; C; 0115; # LATIN CAPITAL LETTER E WITH BREVE +0116; C; 0117; # LATIN CAPITAL LETTER E WITH DOT ABOVE +0118; C; 0119; # LATIN CAPITAL LETTER E WITH OGONEK +011A; C; 011B; # LATIN CAPITAL LETTER E WITH CARON +011C; C; 011D; # LATIN CAPITAL LETTER G WITH CIRCUMFLEX +011E; C; 011F; # LATIN CAPITAL LETTER G WITH BREVE +0120; C; 0121; # LATIN CAPITAL LETTER G WITH DOT ABOVE +0122; C; 0123; # LATIN CAPITAL LETTER G WITH CEDILLA +0124; C; 0125; # LATIN CAPITAL LETTER H WITH CIRCUMFLEX +0126; C; 0127; # LATIN CAPITAL LETTER H WITH STROKE +0128; C; 0129; # LATIN CAPITAL LETTER I WITH TILDE +012A; C; 012B; # LATIN CAPITAL LETTER I WITH MACRON +012C; C; 012D; # LATIN CAPITAL LETTER I WITH BREVE +012E; C; 012F; # LATIN CAPITAL LETTER I WITH OGONEK +0130; F; 0069 0307; # LATIN CAPITAL LETTER I WITH DOT ABOVE +0130; T; 0069; # LATIN CAPITAL LETTER I WITH DOT ABOVE +0132; C; 0133; # LATIN CAPITAL LIGATURE IJ +0134; C; 0135; # LATIN CAPITAL LETTER J WITH CIRCUMFLEX +0136; C; 0137; # LATIN CAPITAL LETTER K WITH CEDILLA +0139; C; 013A; # LATIN CAPITAL LETTER L WITH ACUTE +013B; C; 013C; # LATIN CAPITAL LETTER L WITH CEDILLA +013D; C; 013E; # LATIN CAPITAL LETTER L WITH CARON +013F; C; 0140; # LATIN CAPITAL LETTER L WITH MIDDLE DOT +0141; C; 0142; # LATIN CAPITAL LETTER L WITH STROKE +0143; C; 0144; # LATIN CAPITAL LETTER N WITH ACUTE +0145; C; 0146; # LATIN CAPITAL LETTER N WITH CEDILLA +0147; C; 0148; # LATIN CAPITAL LETTER N WITH CARON +0149; F; 02BC 006E; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +014A; C; 014B; # LATIN CAPITAL LETTER ENG +014C; C; 014D; # LATIN CAPITAL LETTER O WITH MACRON +014E; C; 014F; # LATIN CAPITAL LETTER O WITH BREVE +0150; C; 0151; # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0152; C; 0153; # LATIN CAPITAL LIGATURE OE +0154; C; 0155; # LATIN CAPITAL LETTER R WITH ACUTE +0156; C; 0157; # LATIN CAPITAL LETTER R WITH CEDILLA +0158; C; 0159; # LATIN CAPITAL LETTER R WITH CARON +015A; C; 015B; # LATIN CAPITAL LETTER S WITH ACUTE +015C; C; 015D; # LATIN CAPITAL LETTER S WITH CIRCUMFLEX +015E; C; 015F; # LATIN CAPITAL LETTER S WITH CEDILLA +0160; C; 0161; # LATIN CAPITAL LETTER S WITH CARON +0162; C; 0163; # LATIN CAPITAL LETTER T WITH CEDILLA +0164; C; 0165; # LATIN CAPITAL LETTER T WITH CARON +0166; C; 0167; # LATIN CAPITAL LETTER T WITH STROKE +0168; C; 0169; # LATIN CAPITAL LETTER U WITH TILDE +016A; C; 016B; # LATIN CAPITAL LETTER U WITH MACRON +016C; C; 016D; # LATIN CAPITAL LETTER U WITH BREVE +016E; C; 016F; # LATIN CAPITAL LETTER U WITH RING ABOVE +0170; C; 0171; # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0172; C; 0173; # LATIN CAPITAL LETTER U WITH OGONEK +0174; C; 0175; # LATIN CAPITAL LETTER W WITH CIRCUMFLEX +0176; C; 0177; # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +0178; C; 00FF; # LATIN CAPITAL LETTER Y WITH DIAERESIS +0179; C; 017A; # LATIN CAPITAL LETTER Z WITH ACUTE +017B; C; 017C; # LATIN CAPITAL LETTER Z WITH DOT ABOVE +017D; C; 017E; # LATIN CAPITAL LETTER Z WITH CARON +017F; C; 0073; # LATIN SMALL LETTER LONG S +0181; C; 0253; # LATIN CAPITAL LETTER B WITH HOOK +0182; C; 0183; # LATIN CAPITAL LETTER B WITH TOPBAR +0184; C; 0185; # LATIN CAPITAL LETTER TONE SIX +0186; C; 0254; # LATIN CAPITAL LETTER OPEN O +0187; C; 0188; # LATIN CAPITAL LETTER C WITH HOOK +0189; C; 0256; # LATIN CAPITAL LETTER AFRICAN D +018A; C; 0257; # LATIN CAPITAL LETTER D WITH HOOK +018B; C; 018C; # LATIN CAPITAL LETTER D WITH TOPBAR +018E; C; 01DD; # LATIN CAPITAL LETTER REVERSED E +018F; C; 0259; # LATIN CAPITAL LETTER SCHWA +0190; C; 025B; # LATIN CAPITAL LETTER OPEN E +0191; C; 0192; # LATIN CAPITAL LETTER F WITH HOOK +0193; C; 0260; # LATIN CAPITAL LETTER G WITH HOOK +0194; C; 0263; # LATIN CAPITAL LETTER GAMMA +0196; C; 0269; # LATIN CAPITAL LETTER IOTA +0197; C; 0268; # LATIN CAPITAL LETTER I WITH STROKE +0198; C; 0199; # LATIN CAPITAL LETTER K WITH HOOK +019C; C; 026F; # LATIN CAPITAL LETTER TURNED M +019D; C; 0272; # LATIN CAPITAL LETTER N WITH LEFT HOOK +019F; C; 0275; # LATIN CAPITAL LETTER O WITH MIDDLE TILDE +01A0; C; 01A1; # LATIN CAPITAL LETTER O WITH HORN +01A2; C; 01A3; # LATIN CAPITAL LETTER OI +01A4; C; 01A5; # LATIN CAPITAL LETTER P WITH HOOK +01A6; C; 0280; # LATIN LETTER YR +01A7; C; 01A8; # LATIN CAPITAL LETTER TONE TWO +01A9; C; 0283; # LATIN CAPITAL LETTER ESH +01AC; C; 01AD; # LATIN CAPITAL LETTER T WITH HOOK +01AE; C; 0288; # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK +01AF; C; 01B0; # LATIN CAPITAL LETTER U WITH HORN +01B1; C; 028A; # LATIN CAPITAL LETTER UPSILON +01B2; C; 028B; # LATIN CAPITAL LETTER V WITH HOOK +01B3; C; 01B4; # LATIN CAPITAL LETTER Y WITH HOOK +01B5; C; 01B6; # LATIN CAPITAL LETTER Z WITH STROKE +01B7; C; 0292; # LATIN CAPITAL LETTER EZH +01B8; C; 01B9; # LATIN CAPITAL LETTER EZH REVERSED +01BC; C; 01BD; # LATIN CAPITAL LETTER TONE FIVE +01C4; C; 01C6; # LATIN CAPITAL LETTER DZ WITH CARON +01C5; C; 01C6; # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON +01C7; C; 01C9; # LATIN CAPITAL LETTER LJ +01C8; C; 01C9; # LATIN CAPITAL LETTER L WITH SMALL LETTER J +01CA; C; 01CC; # LATIN CAPITAL LETTER NJ +01CB; C; 01CC; # LATIN CAPITAL LETTER N WITH SMALL LETTER J +01CD; C; 01CE; # LATIN CAPITAL LETTER A WITH CARON +01CF; C; 01D0; # LATIN CAPITAL LETTER I WITH CARON +01D1; C; 01D2; # LATIN CAPITAL LETTER O WITH CARON +01D3; C; 01D4; # LATIN CAPITAL LETTER U WITH CARON +01D5; C; 01D6; # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +01D7; C; 01D8; # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +01D9; C; 01DA; # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +01DB; C; 01DC; # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +01DE; C; 01DF; # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +01E0; C; 01E1; # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +01E2; C; 01E3; # LATIN CAPITAL LETTER AE WITH MACRON +01E4; C; 01E5; # LATIN CAPITAL LETTER G WITH STROKE +01E6; C; 01E7; # LATIN CAPITAL LETTER G WITH CARON +01E8; C; 01E9; # LATIN CAPITAL LETTER K WITH CARON +01EA; C; 01EB; # LATIN CAPITAL LETTER O WITH OGONEK +01EC; C; 01ED; # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +01EE; C; 01EF; # LATIN CAPITAL LETTER EZH WITH CARON +01F0; F; 006A 030C; # LATIN SMALL LETTER J WITH CARON +01F1; C; 01F3; # LATIN CAPITAL LETTER DZ +01F2; C; 01F3; # LATIN CAPITAL LETTER D WITH SMALL LETTER Z +01F4; C; 01F5; # LATIN CAPITAL LETTER G WITH ACUTE +01F6; C; 0195; # LATIN CAPITAL LETTER HWAIR +01F7; C; 01BF; # LATIN CAPITAL LETTER WYNN +01F8; C; 01F9; # LATIN CAPITAL LETTER N WITH GRAVE +01FA; C; 01FB; # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +01FC; C; 01FD; # LATIN CAPITAL LETTER AE WITH ACUTE +01FE; C; 01FF; # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +0200; C; 0201; # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +0202; C; 0203; # LATIN CAPITAL LETTER A WITH INVERTED BREVE +0204; C; 0205; # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +0206; C; 0207; # LATIN CAPITAL LETTER E WITH INVERTED BREVE +0208; C; 0209; # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +020A; C; 020B; # LATIN CAPITAL LETTER I WITH INVERTED BREVE +020C; C; 020D; # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +020E; C; 020F; # LATIN CAPITAL LETTER O WITH INVERTED BREVE +0210; C; 0211; # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +0212; C; 0213; # LATIN CAPITAL LETTER R WITH INVERTED BREVE +0214; C; 0215; # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +0216; C; 0217; # LATIN CAPITAL LETTER U WITH INVERTED BREVE +0218; C; 0219; # LATIN CAPITAL LETTER S WITH COMMA BELOW +021A; C; 021B; # LATIN CAPITAL LETTER T WITH COMMA BELOW +021C; C; 021D; # LATIN CAPITAL LETTER YOGH +021E; C; 021F; # LATIN CAPITAL LETTER H WITH CARON +0220; C; 019E; # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG +0222; C; 0223; # LATIN CAPITAL LETTER OU +0224; C; 0225; # LATIN CAPITAL LETTER Z WITH HOOK +0226; C; 0227; # LATIN CAPITAL LETTER A WITH DOT ABOVE +0228; C; 0229; # LATIN CAPITAL LETTER E WITH CEDILLA +022A; C; 022B; # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON +022C; C; 022D; # LATIN CAPITAL LETTER O WITH TILDE AND MACRON +022E; C; 022F; # LATIN CAPITAL LETTER O WITH DOT ABOVE +0230; C; 0231; # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON +0232; C; 0233; # LATIN CAPITAL LETTER Y WITH MACRON +0345; C; 03B9; # COMBINING GREEK YPOGEGRAMMENI +0386; C; 03AC; # GREEK CAPITAL LETTER ALPHA WITH TONOS +0388; C; 03AD; # GREEK CAPITAL LETTER EPSILON WITH TONOS +0389; C; 03AE; # GREEK CAPITAL LETTER ETA WITH TONOS +038A; C; 03AF; # GREEK CAPITAL LETTER IOTA WITH TONOS +038C; C; 03CC; # GREEK CAPITAL LETTER OMICRON WITH TONOS +038E; C; 03CD; # GREEK CAPITAL LETTER UPSILON WITH TONOS +038F; C; 03CE; # GREEK CAPITAL LETTER OMEGA WITH TONOS +0390; F; 03B9 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +0391; C; 03B1; # GREEK CAPITAL LETTER ALPHA +0392; C; 03B2; # GREEK CAPITAL LETTER BETA +0393; C; 03B3; # GREEK CAPITAL LETTER GAMMA +0394; C; 03B4; # GREEK CAPITAL LETTER DELTA +0395; C; 03B5; # GREEK CAPITAL LETTER EPSILON +0396; C; 03B6; # GREEK CAPITAL LETTER ZETA +0397; C; 03B7; # GREEK CAPITAL LETTER ETA +0398; C; 03B8; # GREEK CAPITAL LETTER THETA +0399; C; 03B9; # GREEK CAPITAL LETTER IOTA +039A; C; 03BA; # GREEK CAPITAL LETTER KAPPA +039B; C; 03BB; # GREEK CAPITAL LETTER LAMDA +039C; C; 03BC; # GREEK CAPITAL LETTER MU +039D; C; 03BD; # GREEK CAPITAL LETTER NU +039E; C; 03BE; # GREEK CAPITAL LETTER XI +039F; C; 03BF; # GREEK CAPITAL LETTER OMICRON +03A0; C; 03C0; # GREEK CAPITAL LETTER PI +03A1; C; 03C1; # GREEK CAPITAL LETTER RHO +03A3; C; 03C3; # GREEK CAPITAL LETTER SIGMA +03A4; C; 03C4; # GREEK CAPITAL LETTER TAU +03A5; C; 03C5; # GREEK CAPITAL LETTER UPSILON +03A6; C; 03C6; # GREEK CAPITAL LETTER PHI +03A7; C; 03C7; # GREEK CAPITAL LETTER CHI +03A8; C; 03C8; # GREEK CAPITAL LETTER PSI +03A9; C; 03C9; # GREEK CAPITAL LETTER OMEGA +03AA; C; 03CA; # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +03AB; C; 03CB; # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +03B0; F; 03C5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +03C2; C; 03C3; # GREEK SMALL LETTER FINAL SIGMA +03D0; C; 03B2; # GREEK BETA SYMBOL +03D1; C; 03B8; # GREEK THETA SYMBOL +03D5; C; 03C6; # GREEK PHI SYMBOL +03D6; C; 03C0; # GREEK PI SYMBOL +03D8; C; 03D9; # GREEK LETTER ARCHAIC KOPPA +03DA; C; 03DB; # GREEK LETTER STIGMA +03DC; C; 03DD; # GREEK LETTER DIGAMMA +03DE; C; 03DF; # GREEK LETTER KOPPA +03E0; C; 03E1; # GREEK LETTER SAMPI +03E2; C; 03E3; # COPTIC CAPITAL LETTER SHEI +03E4; C; 03E5; # COPTIC CAPITAL LETTER FEI +03E6; C; 03E7; # COPTIC CAPITAL LETTER KHEI +03E8; C; 03E9; # COPTIC CAPITAL LETTER HORI +03EA; C; 03EB; # COPTIC CAPITAL LETTER GANGIA +03EC; C; 03ED; # COPTIC CAPITAL LETTER SHIMA +03EE; C; 03EF; # COPTIC CAPITAL LETTER DEI +03F0; C; 03BA; # GREEK KAPPA SYMBOL +03F1; C; 03C1; # GREEK RHO SYMBOL +03F2; C; 03C3; # GREEK LUNATE SIGMA SYMBOL +03F4; C; 03B8; # GREEK CAPITAL THETA SYMBOL +03F5; C; 03B5; # GREEK LUNATE EPSILON SYMBOL +0400; C; 0450; # CYRILLIC CAPITAL LETTER IE WITH GRAVE +0401; C; 0451; # CYRILLIC CAPITAL LETTER IO +0402; C; 0452; # CYRILLIC CAPITAL LETTER DJE +0403; C; 0453; # CYRILLIC CAPITAL LETTER GJE +0404; C; 0454; # CYRILLIC CAPITAL LETTER UKRAINIAN IE +0405; C; 0455; # CYRILLIC CAPITAL LETTER DZE +0406; C; 0456; # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +0407; C; 0457; # CYRILLIC CAPITAL LETTER YI +0408; C; 0458; # CYRILLIC CAPITAL LETTER JE +0409; C; 0459; # CYRILLIC CAPITAL LETTER LJE +040A; C; 045A; # CYRILLIC CAPITAL LETTER NJE +040B; C; 045B; # CYRILLIC CAPITAL LETTER TSHE +040C; C; 045C; # CYRILLIC CAPITAL LETTER KJE +040D; C; 045D; # CYRILLIC CAPITAL LETTER I WITH GRAVE +040E; C; 045E; # CYRILLIC CAPITAL LETTER SHORT U +040F; C; 045F; # CYRILLIC CAPITAL LETTER DZHE +0410; C; 0430; # CYRILLIC CAPITAL LETTER A +0411; C; 0431; # CYRILLIC CAPITAL LETTER BE +0412; C; 0432; # CYRILLIC CAPITAL LETTER VE +0413; C; 0433; # CYRILLIC CAPITAL LETTER GHE +0414; C; 0434; # CYRILLIC CAPITAL LETTER DE +0415; C; 0435; # CYRILLIC CAPITAL LETTER IE +0416; C; 0436; # CYRILLIC CAPITAL LETTER ZHE +0417; C; 0437; # CYRILLIC CAPITAL LETTER ZE +0418; C; 0438; # CYRILLIC CAPITAL LETTER I +0419; C; 0439; # CYRILLIC CAPITAL LETTER SHORT I +041A; C; 043A; # CYRILLIC CAPITAL LETTER KA +041B; C; 043B; # CYRILLIC CAPITAL LETTER EL +041C; C; 043C; # CYRILLIC CAPITAL LETTER EM +041D; C; 043D; # CYRILLIC CAPITAL LETTER EN +041E; C; 043E; # CYRILLIC CAPITAL LETTER O +041F; C; 043F; # CYRILLIC CAPITAL LETTER PE +0420; C; 0440; # CYRILLIC CAPITAL LETTER ER +0421; C; 0441; # CYRILLIC CAPITAL LETTER ES +0422; C; 0442; # CYRILLIC CAPITAL LETTER TE +0423; C; 0443; # CYRILLIC CAPITAL LETTER U +0424; C; 0444; # CYRILLIC CAPITAL LETTER EF +0425; C; 0445; # CYRILLIC CAPITAL LETTER HA +0426; C; 0446; # CYRILLIC CAPITAL LETTER TSE +0427; C; 0447; # CYRILLIC CAPITAL LETTER CHE +0428; C; 0448; # CYRILLIC CAPITAL LETTER SHA +0429; C; 0449; # CYRILLIC CAPITAL LETTER SHCHA +042A; C; 044A; # CYRILLIC CAPITAL LETTER HARD SIGN +042B; C; 044B; # CYRILLIC CAPITAL LETTER YERU +042C; C; 044C; # CYRILLIC CAPITAL LETTER SOFT SIGN +042D; C; 044D; # CYRILLIC CAPITAL LETTER E +042E; C; 044E; # CYRILLIC CAPITAL LETTER YU +042F; C; 044F; # CYRILLIC CAPITAL LETTER YA +0460; C; 0461; # CYRILLIC CAPITAL LETTER OMEGA +0462; C; 0463; # CYRILLIC CAPITAL LETTER YAT +0464; C; 0465; # CYRILLIC CAPITAL LETTER IOTIFIED E +0466; C; 0467; # CYRILLIC CAPITAL LETTER LITTLE YUS +0468; C; 0469; # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS +046A; C; 046B; # CYRILLIC CAPITAL LETTER BIG YUS +046C; C; 046D; # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS +046E; C; 046F; # CYRILLIC CAPITAL LETTER KSI +0470; C; 0471; # CYRILLIC CAPITAL LETTER PSI +0472; C; 0473; # CYRILLIC CAPITAL LETTER FITA +0474; C; 0475; # CYRILLIC CAPITAL LETTER IZHITSA +0476; C; 0477; # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0478; C; 0479; # CYRILLIC CAPITAL LETTER UK +047A; C; 047B; # CYRILLIC CAPITAL LETTER ROUND OMEGA +047C; C; 047D; # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO +047E; C; 047F; # CYRILLIC CAPITAL LETTER OT +0480; C; 0481; # CYRILLIC CAPITAL LETTER KOPPA +048A; C; 048B; # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL +048C; C; 048D; # CYRILLIC CAPITAL LETTER SEMISOFT SIGN +048E; C; 048F; # CYRILLIC CAPITAL LETTER ER WITH TICK +0490; C; 0491; # CYRILLIC CAPITAL LETTER GHE WITH UPTURN +0492; C; 0493; # CYRILLIC CAPITAL LETTER GHE WITH STROKE +0494; C; 0495; # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK +0496; C; 0497; # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER +0498; C; 0499; # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER +049A; C; 049B; # CYRILLIC CAPITAL LETTER KA WITH DESCENDER +049C; C; 049D; # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE +049E; C; 049F; # CYRILLIC CAPITAL LETTER KA WITH STROKE +04A0; C; 04A1; # CYRILLIC CAPITAL LETTER BASHKIR KA +04A2; C; 04A3; # CYRILLIC CAPITAL LETTER EN WITH DESCENDER +04A4; C; 04A5; # CYRILLIC CAPITAL LIGATURE EN GHE +04A6; C; 04A7; # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK +04A8; C; 04A9; # CYRILLIC CAPITAL LETTER ABKHASIAN HA +04AA; C; 04AB; # CYRILLIC CAPITAL LETTER ES WITH DESCENDER +04AC; C; 04AD; # CYRILLIC CAPITAL LETTER TE WITH DESCENDER +04AE; C; 04AF; # CYRILLIC CAPITAL LETTER STRAIGHT U +04B0; C; 04B1; # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE +04B2; C; 04B3; # CYRILLIC CAPITAL LETTER HA WITH DESCENDER +04B4; C; 04B5; # CYRILLIC CAPITAL LIGATURE TE TSE +04B6; C; 04B7; # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER +04B8; C; 04B9; # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE +04BA; C; 04BB; # CYRILLIC CAPITAL LETTER SHHA +04BC; C; 04BD; # CYRILLIC CAPITAL LETTER ABKHASIAN CHE +04BE; C; 04BF; # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER +04C1; C; 04C2; # CYRILLIC CAPITAL LETTER ZHE WITH BREVE +04C3; C; 04C4; # CYRILLIC CAPITAL LETTER KA WITH HOOK +04C5; C; 04C6; # CYRILLIC CAPITAL LETTER EL WITH TAIL +04C7; C; 04C8; # CYRILLIC CAPITAL LETTER EN WITH HOOK +04C9; C; 04CA; # CYRILLIC CAPITAL LETTER EN WITH TAIL +04CB; C; 04CC; # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE +04CD; C; 04CE; # CYRILLIC CAPITAL LETTER EM WITH TAIL +04D0; C; 04D1; # CYRILLIC CAPITAL LETTER A WITH BREVE +04D2; C; 04D3; # CYRILLIC CAPITAL LETTER A WITH DIAERESIS +04D4; C; 04D5; # CYRILLIC CAPITAL LIGATURE A IE +04D6; C; 04D7; # CYRILLIC CAPITAL LETTER IE WITH BREVE +04D8; C; 04D9; # CYRILLIC CAPITAL LETTER SCHWA +04DA; C; 04DB; # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS +04DC; C; 04DD; # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS +04DE; C; 04DF; # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS +04E0; C; 04E1; # CYRILLIC CAPITAL LETTER ABKHASIAN DZE +04E2; C; 04E3; # CYRILLIC CAPITAL LETTER I WITH MACRON +04E4; C; 04E5; # CYRILLIC CAPITAL LETTER I WITH DIAERESIS +04E6; C; 04E7; # CYRILLIC CAPITAL LETTER O WITH DIAERESIS +04E8; C; 04E9; # CYRILLIC CAPITAL LETTER BARRED O +04EA; C; 04EB; # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS +04EC; C; 04ED; # CYRILLIC CAPITAL LETTER E WITH DIAERESIS +04EE; C; 04EF; # CYRILLIC CAPITAL LETTER U WITH MACRON +04F0; C; 04F1; # CYRILLIC CAPITAL LETTER U WITH DIAERESIS +04F2; C; 04F3; # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE +04F4; C; 04F5; # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS +04F8; C; 04F9; # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS +0500; C; 0501; # CYRILLIC CAPITAL LETTER KOMI DE +0502; C; 0503; # CYRILLIC CAPITAL LETTER KOMI DJE +0504; C; 0505; # CYRILLIC CAPITAL LETTER KOMI ZJE +0506; C; 0507; # CYRILLIC CAPITAL LETTER KOMI DZJE +0508; C; 0509; # CYRILLIC CAPITAL LETTER KOMI LJE +050A; C; 050B; # CYRILLIC CAPITAL LETTER KOMI NJE +050C; C; 050D; # CYRILLIC CAPITAL LETTER KOMI SJE +050E; C; 050F; # CYRILLIC CAPITAL LETTER KOMI TJE +0531; C; 0561; # ARMENIAN CAPITAL LETTER AYB +0532; C; 0562; # ARMENIAN CAPITAL LETTER BEN +0533; C; 0563; # ARMENIAN CAPITAL LETTER GIM +0534; C; 0564; # ARMENIAN CAPITAL LETTER DA +0535; C; 0565; # ARMENIAN CAPITAL LETTER ECH +0536; C; 0566; # ARMENIAN CAPITAL LETTER ZA +0537; C; 0567; # ARMENIAN CAPITAL LETTER EH +0538; C; 0568; # ARMENIAN CAPITAL LETTER ET +0539; C; 0569; # ARMENIAN CAPITAL LETTER TO +053A; C; 056A; # ARMENIAN CAPITAL LETTER ZHE +053B; C; 056B; # ARMENIAN CAPITAL LETTER INI +053C; C; 056C; # ARMENIAN CAPITAL LETTER LIWN +053D; C; 056D; # ARMENIAN CAPITAL LETTER XEH +053E; C; 056E; # ARMENIAN CAPITAL LETTER CA +053F; C; 056F; # ARMENIAN CAPITAL LETTER KEN +0540; C; 0570; # ARMENIAN CAPITAL LETTER HO +0541; C; 0571; # ARMENIAN CAPITAL LETTER JA +0542; C; 0572; # ARMENIAN CAPITAL LETTER GHAD +0543; C; 0573; # ARMENIAN CAPITAL LETTER CHEH +0544; C; 0574; # ARMENIAN CAPITAL LETTER MEN +0545; C; 0575; # ARMENIAN CAPITAL LETTER YI +0546; C; 0576; # ARMENIAN CAPITAL LETTER NOW +0547; C; 0577; # ARMENIAN CAPITAL LETTER SHA +0548; C; 0578; # ARMENIAN CAPITAL LETTER VO +0549; C; 0579; # ARMENIAN CAPITAL LETTER CHA +054A; C; 057A; # ARMENIAN CAPITAL LETTER PEH +054B; C; 057B; # ARMENIAN CAPITAL LETTER JHEH +054C; C; 057C; # ARMENIAN CAPITAL LETTER RA +054D; C; 057D; # ARMENIAN CAPITAL LETTER SEH +054E; C; 057E; # ARMENIAN CAPITAL LETTER VEW +054F; C; 057F; # ARMENIAN CAPITAL LETTER TIWN +0550; C; 0580; # ARMENIAN CAPITAL LETTER REH +0551; C; 0581; # ARMENIAN CAPITAL LETTER CO +0552; C; 0582; # ARMENIAN CAPITAL LETTER YIWN +0553; C; 0583; # ARMENIAN CAPITAL LETTER PIWR +0554; C; 0584; # ARMENIAN CAPITAL LETTER KEH +0555; C; 0585; # ARMENIAN CAPITAL LETTER OH +0556; C; 0586; # ARMENIAN CAPITAL LETTER FEH +0587; F; 0565 0582; # ARMENIAN SMALL LIGATURE ECH YIWN +1E00; C; 1E01; # LATIN CAPITAL LETTER A WITH RING BELOW +1E02; C; 1E03; # LATIN CAPITAL LETTER B WITH DOT ABOVE +1E04; C; 1E05; # LATIN CAPITAL LETTER B WITH DOT BELOW +1E06; C; 1E07; # LATIN CAPITAL LETTER B WITH LINE BELOW +1E08; C; 1E09; # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +1E0A; C; 1E0B; # LATIN CAPITAL LETTER D WITH DOT ABOVE +1E0C; C; 1E0D; # LATIN CAPITAL LETTER D WITH DOT BELOW +1E0E; C; 1E0F; # LATIN CAPITAL LETTER D WITH LINE BELOW +1E10; C; 1E11; # LATIN CAPITAL LETTER D WITH CEDILLA +1E12; C; 1E13; # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +1E14; C; 1E15; # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +1E16; C; 1E17; # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +1E18; C; 1E19; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +1E1A; C; 1E1B; # LATIN CAPITAL LETTER E WITH TILDE BELOW +1E1C; C; 1E1D; # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +1E1E; C; 1E1F; # LATIN CAPITAL LETTER F WITH DOT ABOVE +1E20; C; 1E21; # LATIN CAPITAL LETTER G WITH MACRON +1E22; C; 1E23; # LATIN CAPITAL LETTER H WITH DOT ABOVE +1E24; C; 1E25; # LATIN CAPITAL LETTER H WITH DOT BELOW +1E26; C; 1E27; # LATIN CAPITAL LETTER H WITH DIAERESIS +1E28; C; 1E29; # LATIN CAPITAL LETTER H WITH CEDILLA +1E2A; C; 1E2B; # LATIN CAPITAL LETTER H WITH BREVE BELOW +1E2C; C; 1E2D; # LATIN CAPITAL LETTER I WITH TILDE BELOW +1E2E; C; 1E2F; # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +1E30; C; 1E31; # LATIN CAPITAL LETTER K WITH ACUTE +1E32; C; 1E33; # LATIN CAPITAL LETTER K WITH DOT BELOW +1E34; C; 1E35; # LATIN CAPITAL LETTER K WITH LINE BELOW +1E36; C; 1E37; # LATIN CAPITAL LETTER L WITH DOT BELOW +1E38; C; 1E39; # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +1E3A; C; 1E3B; # LATIN CAPITAL LETTER L WITH LINE BELOW +1E3C; C; 1E3D; # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +1E3E; C; 1E3F; # LATIN CAPITAL LETTER M WITH ACUTE +1E40; C; 1E41; # LATIN CAPITAL LETTER M WITH DOT ABOVE +1E42; C; 1E43; # LATIN CAPITAL LETTER M WITH DOT BELOW +1E44; C; 1E45; # LATIN CAPITAL LETTER N WITH DOT ABOVE +1E46; C; 1E47; # LATIN CAPITAL LETTER N WITH DOT BELOW +1E48; C; 1E49; # LATIN CAPITAL LETTER N WITH LINE BELOW +1E4A; C; 1E4B; # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +1E4C; C; 1E4D; # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +1E4E; C; 1E4F; # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +1E50; C; 1E51; # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +1E52; C; 1E53; # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +1E54; C; 1E55; # LATIN CAPITAL LETTER P WITH ACUTE +1E56; C; 1E57; # LATIN CAPITAL LETTER P WITH DOT ABOVE +1E58; C; 1E59; # LATIN CAPITAL LETTER R WITH DOT ABOVE +1E5A; C; 1E5B; # LATIN CAPITAL LETTER R WITH DOT BELOW +1E5C; C; 1E5D; # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +1E5E; C; 1E5F; # LATIN CAPITAL LETTER R WITH LINE BELOW +1E60; C; 1E61; # LATIN CAPITAL LETTER S WITH DOT ABOVE +1E62; C; 1E63; # LATIN CAPITAL LETTER S WITH DOT BELOW +1E64; C; 1E65; # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +1E66; C; 1E67; # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +1E68; C; 1E69; # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +1E6A; C; 1E6B; # LATIN CAPITAL LETTER T WITH DOT ABOVE +1E6C; C; 1E6D; # LATIN CAPITAL LETTER T WITH DOT BELOW +1E6E; C; 1E6F; # LATIN CAPITAL LETTER T WITH LINE BELOW +1E70; C; 1E71; # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +1E72; C; 1E73; # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +1E74; C; 1E75; # LATIN CAPITAL LETTER U WITH TILDE BELOW +1E76; C; 1E77; # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +1E78; C; 1E79; # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +1E7A; C; 1E7B; # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +1E7C; C; 1E7D; # LATIN CAPITAL LETTER V WITH TILDE +1E7E; C; 1E7F; # LATIN CAPITAL LETTER V WITH DOT BELOW +1E80; C; 1E81; # LATIN CAPITAL LETTER W WITH GRAVE +1E82; C; 1E83; # LATIN CAPITAL LETTER W WITH ACUTE +1E84; C; 1E85; # LATIN CAPITAL LETTER W WITH DIAERESIS +1E86; C; 1E87; # LATIN CAPITAL LETTER W WITH DOT ABOVE +1E88; C; 1E89; # LATIN CAPITAL LETTER W WITH DOT BELOW +1E8A; C; 1E8B; # LATIN CAPITAL LETTER X WITH DOT ABOVE +1E8C; C; 1E8D; # LATIN CAPITAL LETTER X WITH DIAERESIS +1E8E; C; 1E8F; # LATIN CAPITAL LETTER Y WITH DOT ABOVE +1E90; C; 1E91; # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +1E92; C; 1E93; # LATIN CAPITAL LETTER Z WITH DOT BELOW +1E94; C; 1E95; # LATIN CAPITAL LETTER Z WITH LINE BELOW +1E96; F; 0068 0331; # LATIN SMALL LETTER H WITH LINE BELOW +1E97; F; 0074 0308; # LATIN SMALL LETTER T WITH DIAERESIS +1E98; F; 0077 030A; # LATIN SMALL LETTER W WITH RING ABOVE +1E99; F; 0079 030A; # LATIN SMALL LETTER Y WITH RING ABOVE +1E9A; F; 0061 02BE; # LATIN SMALL LETTER A WITH RIGHT HALF RING +1E9B; C; 1E61; # LATIN SMALL LETTER LONG S WITH DOT ABOVE +1EA0; C; 1EA1; # LATIN CAPITAL LETTER A WITH DOT BELOW +1EA2; C; 1EA3; # LATIN CAPITAL LETTER A WITH HOOK ABOVE +1EA4; C; 1EA5; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA6; C; 1EA7; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA8; C; 1EA9; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EAA; C; 1EAB; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +1EAC; C; 1EAD; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAE; C; 1EAF; # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +1EB0; C; 1EB1; # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +1EB2; C; 1EB3; # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +1EB4; C; 1EB5; # LATIN CAPITAL LETTER A WITH BREVE AND TILDE +1EB6; C; 1EB7; # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +1EB8; C; 1EB9; # LATIN CAPITAL LETTER E WITH DOT BELOW +1EBA; C; 1EBB; # LATIN CAPITAL LETTER E WITH HOOK ABOVE +1EBC; C; 1EBD; # LATIN CAPITAL LETTER E WITH TILDE +1EBE; C; 1EBF; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +1EC0; C; 1EC1; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC2; C; 1EC3; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC4; C; 1EC5; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +1EC6; C; 1EC7; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC8; C; 1EC9; # LATIN CAPITAL LETTER I WITH HOOK ABOVE +1ECA; C; 1ECB; # LATIN CAPITAL LETTER I WITH DOT BELOW +1ECC; C; 1ECD; # LATIN CAPITAL LETTER O WITH DOT BELOW +1ECE; C; 1ECF; # LATIN CAPITAL LETTER O WITH HOOK ABOVE +1ED0; C; 1ED1; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED2; C; 1ED3; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED4; C; 1ED5; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED6; C; 1ED7; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +1ED8; C; 1ED9; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1EDA; C; 1EDB; # LATIN CAPITAL LETTER O WITH HORN AND ACUTE +1EDC; C; 1EDD; # LATIN CAPITAL LETTER O WITH HORN AND GRAVE +1EDE; C; 1EDF; # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +1EE0; C; 1EE1; # LATIN CAPITAL LETTER O WITH HORN AND TILDE +1EE2; C; 1EE3; # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +1EE4; C; 1EE5; # LATIN CAPITAL LETTER U WITH DOT BELOW +1EE6; C; 1EE7; # LATIN CAPITAL LETTER U WITH HOOK ABOVE +1EE8; C; 1EE9; # LATIN CAPITAL LETTER U WITH HORN AND ACUTE +1EEA; C; 1EEB; # LATIN CAPITAL LETTER U WITH HORN AND GRAVE +1EEC; C; 1EED; # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +1EEE; C; 1EEF; # LATIN CAPITAL LETTER U WITH HORN AND TILDE +1EF0; C; 1EF1; # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +1EF2; C; 1EF3; # LATIN CAPITAL LETTER Y WITH GRAVE +1EF4; C; 1EF5; # LATIN CAPITAL LETTER Y WITH DOT BELOW +1EF6; C; 1EF7; # LATIN CAPITAL LETTER Y WITH HOOK ABOVE +1EF8; C; 1EF9; # LATIN CAPITAL LETTER Y WITH TILDE +1F08; C; 1F00; # GREEK CAPITAL LETTER ALPHA WITH PSILI +1F09; C; 1F01; # GREEK CAPITAL LETTER ALPHA WITH DASIA +1F0A; C; 1F02; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA +1F0B; C; 1F03; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA +1F0C; C; 1F04; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA +1F0D; C; 1F05; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA +1F0E; C; 1F06; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI +1F0F; C; 1F07; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F18; C; 1F10; # GREEK CAPITAL LETTER EPSILON WITH PSILI +1F19; C; 1F11; # GREEK CAPITAL LETTER EPSILON WITH DASIA +1F1A; C; 1F12; # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA +1F1B; C; 1F13; # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA +1F1C; C; 1F14; # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA +1F1D; C; 1F15; # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F28; C; 1F20; # GREEK CAPITAL LETTER ETA WITH PSILI +1F29; C; 1F21; # GREEK CAPITAL LETTER ETA WITH DASIA +1F2A; C; 1F22; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA +1F2B; C; 1F23; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA +1F2C; C; 1F24; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA +1F2D; C; 1F25; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA +1F2E; C; 1F26; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI +1F2F; C; 1F27; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI +1F38; C; 1F30; # GREEK CAPITAL LETTER IOTA WITH PSILI +1F39; C; 1F31; # GREEK CAPITAL LETTER IOTA WITH DASIA +1F3A; C; 1F32; # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA +1F3B; C; 1F33; # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA +1F3C; C; 1F34; # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA +1F3D; C; 1F35; # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA +1F3E; C; 1F36; # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI +1F3F; C; 1F37; # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI +1F48; C; 1F40; # GREEK CAPITAL LETTER OMICRON WITH PSILI +1F49; C; 1F41; # GREEK CAPITAL LETTER OMICRON WITH DASIA +1F4A; C; 1F42; # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA +1F4B; C; 1F43; # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA +1F4C; C; 1F44; # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA +1F4D; C; 1F45; # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50; F; 03C5 0313; # GREEK SMALL LETTER UPSILON WITH PSILI +1F52; F; 03C5 0313 0300; # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA +1F54; F; 03C5 0313 0301; # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA +1F56; F; 03C5 0313 0342; # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI +1F59; C; 1F51; # GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B; C; 1F53; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D; C; 1F55; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F; C; 1F57; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F68; C; 1F60; # GREEK CAPITAL LETTER OMEGA WITH PSILI +1F69; C; 1F61; # GREEK CAPITAL LETTER OMEGA WITH DASIA +1F6A; C; 1F62; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA +1F6B; C; 1F63; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA +1F6C; C; 1F64; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA +1F6D; C; 1F65; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA +1F6E; C; 1F66; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI +1F6F; C; 1F67; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F80; F; 1F00 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +1F81; F; 1F01 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +1F82; F; 1F02 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F83; F; 1F03 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F84; F; 1F04 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F85; F; 1F05 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F86; F; 1F06 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F87; F; 1F07 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F88; F; 1F00 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F88; S; 1F80; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F89; F; 1F01 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +1F89; S; 1F81; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +1F8A; F; 1F02 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F8A; S; 1F82; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F8B; F; 1F03 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F8B; S; 1F83; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F8C; F; 1F04 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F8C; S; 1F84; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F8D; F; 1F05 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F8D; S; 1F85; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F8E; F; 1F06 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F8E; S; 1F86; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F8F; F; 1F07 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F8F; S; 1F87; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F90; F; 1F20 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +1F91; F; 1F21 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +1F92; F; 1F22 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F93; F; 1F23 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F94; F; 1F24 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F95; F; 1F25 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F96; F; 1F26 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F97; F; 1F27 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F98; F; 1F20 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F98; S; 1F90; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F99; F; 1F21 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +1F99; S; 1F91; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +1F9A; F; 1F22 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F9A; S; 1F92; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F9B; F; 1F23 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F9B; S; 1F93; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F9C; F; 1F24 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F9C; S; 1F94; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F9D; F; 1F25 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F9D; S; 1F95; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F9E; F; 1F26 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F9E; S; 1F96; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F9F; F; 1F27 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F9F; S; 1F97; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FA0; F; 1F60 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +1FA1; F; 1F61 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +1FA2; F; 1F62 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1FA3; F; 1F63 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1FA4; F; 1F64 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1FA5; F; 1F65 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1FA6; F; 1F66 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1FA7; F; 1F67 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1FA8; F; 1F60 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1FA8; S; 1FA0; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1FA9; F; 1F61 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +1FA9; S; 1FA1; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +1FAA; F; 1F62 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1FAA; S; 1FA2; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1FAB; F; 1F63 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1FAB; S; 1FA3; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1FAC; F; 1F64 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1FAC; S; 1FA4; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1FAD; F; 1F65 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1FAD; S; 1FA5; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1FAE; F; 1F66 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FAE; S; 1FA6; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FAF; F; 1F67 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FAF; S; 1FA7; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FB2; F; 1F70 03B9; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +1FB3; F; 03B1 03B9; # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +1FB4; F; 03AC 03B9; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6; F; 03B1 0342; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI +1FB7; F; 03B1 0342 03B9; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +1FB8; C; 1FB0; # GREEK CAPITAL LETTER ALPHA WITH VRACHY +1FB9; C; 1FB1; # GREEK CAPITAL LETTER ALPHA WITH MACRON +1FBA; C; 1F70; # GREEK CAPITAL LETTER ALPHA WITH VARIA +1FBB; C; 1F71; # GREEK CAPITAL LETTER ALPHA WITH OXIA +1FBC; F; 03B1 03B9; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBC; S; 1FB3; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBE; C; 03B9; # GREEK PROSGEGRAMMENI +1FC2; F; 1F74 03B9; # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +1FC3; F; 03B7 03B9; # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +1FC4; F; 03AE 03B9; # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6; F; 03B7 0342; # GREEK SMALL LETTER ETA WITH PERISPOMENI +1FC7; F; 03B7 0342 03B9; # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +1FC8; C; 1F72; # GREEK CAPITAL LETTER EPSILON WITH VARIA +1FC9; C; 1F73; # GREEK CAPITAL LETTER EPSILON WITH OXIA +1FCA; C; 1F74; # GREEK CAPITAL LETTER ETA WITH VARIA +1FCB; C; 1F75; # GREEK CAPITAL LETTER ETA WITH OXIA +1FCC; F; 03B7 03B9; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCC; S; 1FC3; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FD2; F; 03B9 0308 0300; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +1FD3; F; 03B9 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6; F; 03B9 0342; # GREEK SMALL LETTER IOTA WITH PERISPOMENI +1FD7; F; 03B9 0308 0342; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +1FD8; C; 1FD0; # GREEK CAPITAL LETTER IOTA WITH VRACHY +1FD9; C; 1FD1; # GREEK CAPITAL LETTER IOTA WITH MACRON +1FDA; C; 1F76; # GREEK CAPITAL LETTER IOTA WITH VARIA +1FDB; C; 1F77; # GREEK CAPITAL LETTER IOTA WITH OXIA +1FE2; F; 03C5 0308 0300; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +1FE3; F; 03C5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +1FE4; F; 03C1 0313; # GREEK SMALL LETTER RHO WITH PSILI +1FE6; F; 03C5 0342; # GREEK SMALL LETTER UPSILON WITH PERISPOMENI +1FE7; F; 03C5 0308 0342; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +1FE8; C; 1FE0; # GREEK CAPITAL LETTER UPSILON WITH VRACHY +1FE9; C; 1FE1; # GREEK CAPITAL LETTER UPSILON WITH MACRON +1FEA; C; 1F7A; # GREEK CAPITAL LETTER UPSILON WITH VARIA +1FEB; C; 1F7B; # GREEK CAPITAL LETTER UPSILON WITH OXIA +1FEC; C; 1FE5; # GREEK CAPITAL LETTER RHO WITH DASIA +1FF2; F; 1F7C 03B9; # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +1FF3; F; 03C9 03B9; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +1FF4; F; 03CE 03B9; # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6; F; 03C9 0342; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI +1FF7; F; 03C9 0342 03B9; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +1FF8; C; 1F78; # GREEK CAPITAL LETTER OMICRON WITH VARIA +1FF9; C; 1F79; # GREEK CAPITAL LETTER OMICRON WITH OXIA +1FFA; C; 1F7C; # GREEK CAPITAL LETTER OMEGA WITH VARIA +1FFB; C; 1F7D; # GREEK CAPITAL LETTER OMEGA WITH OXIA +1FFC; F; 03C9 03B9; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFC; S; 1FF3; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +2126; C; 03C9; # OHM SIGN +212A; C; 006B; # KELVIN SIGN +212B; C; 00E5; # ANGSTROM SIGN +2160; C; 2170; # ROMAN NUMERAL ONE +2161; C; 2171; # ROMAN NUMERAL TWO +2162; C; 2172; # ROMAN NUMERAL THREE +2163; C; 2173; # ROMAN NUMERAL FOUR +2164; C; 2174; # ROMAN NUMERAL FIVE +2165; C; 2175; # ROMAN NUMERAL SIX +2166; C; 2176; # ROMAN NUMERAL SEVEN +2167; C; 2177; # ROMAN NUMERAL EIGHT +2168; C; 2178; # ROMAN NUMERAL NINE +2169; C; 2179; # ROMAN NUMERAL TEN +216A; C; 217A; # ROMAN NUMERAL ELEVEN +216B; C; 217B; # ROMAN NUMERAL TWELVE +216C; C; 217C; # ROMAN NUMERAL FIFTY +216D; C; 217D; # ROMAN NUMERAL ONE HUNDRED +216E; C; 217E; # ROMAN NUMERAL FIVE HUNDRED +216F; C; 217F; # ROMAN NUMERAL ONE THOUSAND +24B6; C; 24D0; # CIRCLED LATIN CAPITAL LETTER A +24B7; C; 24D1; # CIRCLED LATIN CAPITAL LETTER B +24B8; C; 24D2; # CIRCLED LATIN CAPITAL LETTER C +24B9; C; 24D3; # CIRCLED LATIN CAPITAL LETTER D +24BA; C; 24D4; # CIRCLED LATIN CAPITAL LETTER E +24BB; C; 24D5; # CIRCLED LATIN CAPITAL LETTER F +24BC; C; 24D6; # CIRCLED LATIN CAPITAL LETTER G +24BD; C; 24D7; # CIRCLED LATIN CAPITAL LETTER H +24BE; C; 24D8; # CIRCLED LATIN CAPITAL LETTER I +24BF; C; 24D9; # CIRCLED LATIN CAPITAL LETTER J +24C0; C; 24DA; # CIRCLED LATIN CAPITAL LETTER K +24C1; C; 24DB; # CIRCLED LATIN CAPITAL LETTER L +24C2; C; 24DC; # CIRCLED LATIN CAPITAL LETTER M +24C3; C; 24DD; # CIRCLED LATIN CAPITAL LETTER N +24C4; C; 24DE; # CIRCLED LATIN CAPITAL LETTER O +24C5; C; 24DF; # CIRCLED LATIN CAPITAL LETTER P +24C6; C; 24E0; # CIRCLED LATIN CAPITAL LETTER Q +24C7; C; 24E1; # CIRCLED LATIN CAPITAL LETTER R +24C8; C; 24E2; # CIRCLED LATIN CAPITAL LETTER S +24C9; C; 24E3; # CIRCLED LATIN CAPITAL LETTER T +24CA; C; 24E4; # CIRCLED LATIN CAPITAL LETTER U +24CB; C; 24E5; # CIRCLED LATIN CAPITAL LETTER V +24CC; C; 24E6; # CIRCLED LATIN CAPITAL LETTER W +24CD; C; 24E7; # CIRCLED LATIN CAPITAL LETTER X +24CE; C; 24E8; # CIRCLED LATIN CAPITAL LETTER Y +24CF; C; 24E9; # CIRCLED LATIN CAPITAL LETTER Z +FB00; F; 0066 0066; # LATIN SMALL LIGATURE FF +FB01; F; 0066 0069; # LATIN SMALL LIGATURE FI +FB02; F; 0066 006C; # LATIN SMALL LIGATURE FL +FB03; F; 0066 0066 0069; # LATIN SMALL LIGATURE FFI +FB04; F; 0066 0066 006C; # LATIN SMALL LIGATURE FFL +FB05; F; 0073 0074; # LATIN SMALL LIGATURE LONG S T +FB06; F; 0073 0074; # LATIN SMALL LIGATURE ST +FB13; F; 0574 0576; # ARMENIAN SMALL LIGATURE MEN NOW +FB14; F; 0574 0565; # ARMENIAN SMALL LIGATURE MEN ECH +FB15; F; 0574 056B; # ARMENIAN SMALL LIGATURE MEN INI +FB16; F; 057E 0576; # ARMENIAN SMALL LIGATURE VEW NOW +FB17; F; 0574 056D; # ARMENIAN SMALL LIGATURE MEN XEH +FF21; C; FF41; # FULLWIDTH LATIN CAPITAL LETTER A +FF22; C; FF42; # FULLWIDTH LATIN CAPITAL LETTER B +FF23; C; FF43; # FULLWIDTH LATIN CAPITAL LETTER C +FF24; C; FF44; # FULLWIDTH LATIN CAPITAL LETTER D +FF25; C; FF45; # FULLWIDTH LATIN CAPITAL LETTER E +FF26; C; FF46; # FULLWIDTH LATIN CAPITAL LETTER F +FF27; C; FF47; # FULLWIDTH LATIN CAPITAL LETTER G +FF28; C; FF48; # FULLWIDTH LATIN CAPITAL LETTER H +FF29; C; FF49; # FULLWIDTH LATIN CAPITAL LETTER I +FF2A; C; FF4A; # FULLWIDTH LATIN CAPITAL LETTER J +FF2B; C; FF4B; # FULLWIDTH LATIN CAPITAL LETTER K +FF2C; C; FF4C; # FULLWIDTH LATIN CAPITAL LETTER L +FF2D; C; FF4D; # FULLWIDTH LATIN CAPITAL LETTER M +FF2E; C; FF4E; # FULLWIDTH LATIN CAPITAL LETTER N +FF2F; C; FF4F; # FULLWIDTH LATIN CAPITAL LETTER O +FF30; C; FF50; # FULLWIDTH LATIN CAPITAL LETTER P +FF31; C; FF51; # FULLWIDTH LATIN CAPITAL LETTER Q +FF32; C; FF52; # FULLWIDTH LATIN CAPITAL LETTER R +FF33; C; FF53; # FULLWIDTH LATIN CAPITAL LETTER S +FF34; C; FF54; # FULLWIDTH LATIN CAPITAL LETTER T +FF35; C; FF55; # FULLWIDTH LATIN CAPITAL LETTER U +FF36; C; FF56; # FULLWIDTH LATIN CAPITAL LETTER V +FF37; C; FF57; # FULLWIDTH LATIN CAPITAL LETTER W +FF38; C; FF58; # FULLWIDTH LATIN CAPITAL LETTER X +FF39; C; FF59; # FULLWIDTH LATIN CAPITAL LETTER Y +FF3A; C; FF5A; # FULLWIDTH LATIN CAPITAL LETTER Z +10400; C; 10428; # DESERET CAPITAL LETTER LONG I +10401; C; 10429; # DESERET CAPITAL LETTER LONG E +10402; C; 1042A; # DESERET CAPITAL LETTER LONG A +10403; C; 1042B; # DESERET CAPITAL LETTER LONG AH +10404; C; 1042C; # DESERET CAPITAL LETTER LONG O +10405; C; 1042D; # DESERET CAPITAL LETTER LONG OO +10406; C; 1042E; # DESERET CAPITAL LETTER SHORT I +10407; C; 1042F; # DESERET CAPITAL LETTER SHORT E +10408; C; 10430; # DESERET CAPITAL LETTER SHORT A +10409; C; 10431; # DESERET CAPITAL LETTER SHORT AH +1040A; C; 10432; # DESERET CAPITAL LETTER SHORT O +1040B; C; 10433; # DESERET CAPITAL LETTER SHORT OO +1040C; C; 10434; # DESERET CAPITAL LETTER AY +1040D; C; 10435; # DESERET CAPITAL LETTER OW +1040E; C; 10436; # DESERET CAPITAL LETTER WU +1040F; C; 10437; # DESERET CAPITAL LETTER YEE +10410; C; 10438; # DESERET CAPITAL LETTER H +10411; C; 10439; # DESERET CAPITAL LETTER PEE +10412; C; 1043A; # DESERET CAPITAL LETTER BEE +10413; C; 1043B; # DESERET CAPITAL LETTER TEE +10414; C; 1043C; # DESERET CAPITAL LETTER DEE +10415; C; 1043D; # DESERET CAPITAL LETTER CHEE +10416; C; 1043E; # DESERET CAPITAL LETTER JEE +10417; C; 1043F; # DESERET CAPITAL LETTER KAY +10418; C; 10440; # DESERET CAPITAL LETTER GAY +10419; C; 10441; # DESERET CAPITAL LETTER EF +1041A; C; 10442; # DESERET CAPITAL LETTER VEE +1041B; C; 10443; # DESERET CAPITAL LETTER ETH +1041C; C; 10444; # DESERET CAPITAL LETTER THEE +1041D; C; 10445; # DESERET CAPITAL LETTER ES +1041E; C; 10446; # DESERET CAPITAL LETTER ZEE +1041F; C; 10447; # DESERET CAPITAL LETTER ESH +10420; C; 10448; # DESERET CAPITAL LETTER ZHEE +10421; C; 10449; # DESERET CAPITAL LETTER ER +10422; C; 1044A; # DESERET CAPITAL LETTER EL +10423; C; 1044B; # DESERET CAPITAL LETTER EM +10424; C; 1044C; # DESERET CAPITAL LETTER EN +10425; C; 1044D; # DESERET CAPITAL LETTER ENG diff --git a/lib/CompositionExclusions-3.2.0.txt b/lib/CompositionExclusions-3.2.0.txt new file mode 100644 index 0000000..07a60b8 --- /dev/null +++ b/lib/CompositionExclusions-3.2.0.txt @@ -0,0 +1,176 @@ +# CompositionExclusions-3.2.0.txt +# Date: 2002-03-19,23:30:28 GMT [MD] +# +# This file lists the characters from the UAX #15 Composition Exclusion Table. +# +# The format of the comments in this file has been updated since the last version, +# CompositionExclusions-3.txt. The only substantive change to this file between that +# version and this one is the addition of U+2ADC FORKING. +# +# For more information, see +# http://www.unicode.org/unicode/reports/tr15/#Primary Exclusion List Table +# ================================================ + +# (1) Script Specifics +# This list of characters cannot be derived from the UnicodeData file. +# ================================================ + +0958 # DEVANAGARI LETTER QA +0959 # DEVANAGARI LETTER KHHA +095A # DEVANAGARI LETTER GHHA +095B # DEVANAGARI LETTER ZA +095C # DEVANAGARI LETTER DDDHA +095D # DEVANAGARI LETTER RHA +095E # DEVANAGARI LETTER FA +095F # DEVANAGARI LETTER YYA +09DC # BENGALI LETTER RRA +09DD # BENGALI LETTER RHA +09DF # BENGALI LETTER YYA +0A33 # GURMUKHI LETTER LLA +0A36 # GURMUKHI LETTER SHA +0A59 # GURMUKHI LETTER KHHA +0A5A # GURMUKHI LETTER GHHA +0A5B # GURMUKHI LETTER ZA +0A5E # GURMUKHI LETTER FA +0B5C # ORIYA LETTER RRA +0B5D # ORIYA LETTER RHA +0F43 # TIBETAN LETTER GHA +0F4D # TIBETAN LETTER DDHA +0F52 # TIBETAN LETTER DHA +0F57 # TIBETAN LETTER BHA +0F5C # TIBETAN LETTER DZHA +0F69 # TIBETAN LETTER KSSA +0F76 # TIBETAN VOWEL SIGN VOCALIC R +0F78 # TIBETAN VOWEL SIGN VOCALIC L +0F93 # TIBETAN SUBJOINED LETTER GHA +0F9D # TIBETAN SUBJOINED LETTER DDHA +0FA2 # TIBETAN SUBJOINED LETTER DHA +0FA7 # TIBETAN SUBJOINED LETTER BHA +0FAC # TIBETAN SUBJOINED LETTER DZHA +0FB9 # TIBETAN SUBJOINED LETTER KSSA +FB1D # HEBREW LETTER YOD WITH HIRIQ +FB1F # HEBREW LIGATURE YIDDISH YOD YOD PATAH +FB2A # HEBREW LETTER SHIN WITH SHIN DOT +FB2B # HEBREW LETTER SHIN WITH SIN DOT +FB2C # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT +FB2D # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT +FB2E # HEBREW LETTER ALEF WITH PATAH +FB2F # HEBREW LETTER ALEF WITH QAMATS +FB30 # HEBREW LETTER ALEF WITH MAPIQ +FB31 # HEBREW LETTER BET WITH DAGESH +FB32 # HEBREW LETTER GIMEL WITH DAGESH +FB33 # HEBREW LETTER DALET WITH DAGESH +FB34 # HEBREW LETTER HE WITH MAPIQ +FB35 # HEBREW LETTER VAV WITH DAGESH +FB36 # HEBREW LETTER ZAYIN WITH DAGESH +FB38 # HEBREW LETTER TET WITH DAGESH +FB39 # HEBREW LETTER YOD WITH DAGESH +FB3A # HEBREW LETTER FINAL KAF WITH DAGESH +FB3B # HEBREW LETTER KAF WITH DAGESH +FB3C # HEBREW LETTER LAMED WITH DAGESH +FB3E # HEBREW LETTER MEM WITH DAGESH +FB40 # HEBREW LETTER NUN WITH DAGESH +FB41 # HEBREW LETTER SAMEKH WITH DAGESH +FB43 # HEBREW LETTER FINAL PE WITH DAGESH +FB44 # HEBREW LETTER PE WITH DAGESH +FB46 # HEBREW LETTER TSADI WITH DAGESH +FB47 # HEBREW LETTER QOF WITH DAGESH +FB48 # HEBREW LETTER RESH WITH DAGESH +FB49 # HEBREW LETTER SHIN WITH DAGESH +FB4A # HEBREW LETTER TAV WITH DAGESH +FB4B # HEBREW LETTER VAV WITH HOLAM +FB4C # HEBREW LETTER BET WITH RAFE +FB4D # HEBREW LETTER KAF WITH RAFE +FB4E # HEBREW LETTER PE WITH RAFE + +# Total code points: 67 + +# ================================================ +# (2) Post Composition Version precomposed characters +# These characters cannot be derived solely from the UnicodeData.txt file +# in this version of Unicode. +# ================================================ + +2ADC # FORKING +1D15E # MUSICAL SYMBOL HALF NOTE +1D15F # MUSICAL SYMBOL QUARTER NOTE +1D160 # MUSICAL SYMBOL EIGHTH NOTE +1D161 # MUSICAL SYMBOL SIXTEENTH NOTE +1D162 # MUSICAL SYMBOL THIRTY-SECOND NOTE +1D163 # MUSICAL SYMBOL SIXTY-FOURTH NOTE +1D164 # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D1BB # MUSICAL SYMBOL MINIMA +1D1BC # MUSICAL SYMBOL MINIMA BLACK +1D1BD # MUSICAL SYMBOL SEMIMINIMA WHITE +1D1BE # MUSICAL SYMBOL SEMIMINIMA BLACK +1D1BF # MUSICAL SYMBOL FUSA WHITE +1D1C0 # MUSICAL SYMBOL FUSA BLACK + +# Total code points: 14 + +# ================================================ +# (3) Singleton Decompositions +# These characters can be derived from the UnicodeData file +# by including all characters whose canonical decomposition +# consists of a single character. +# These characters are simply quoted here for reference. +# ================================================ + +# 0340..0341 [2] COMBINING GRAVE TONE MARK..COMBINING ACUTE TONE MARK +# 0343 COMBINING GREEK KORONIS +# 0374 GREEK NUMERAL SIGN +# 037E GREEK QUESTION MARK +# 0387 GREEK ANO TELEIA +# 1F71 GREEK SMALL LETTER ALPHA WITH OXIA +# 1F73 GREEK SMALL LETTER EPSILON WITH OXIA +# 1F75 GREEK SMALL LETTER ETA WITH OXIA +# 1F77 GREEK SMALL LETTER IOTA WITH OXIA +# 1F79 GREEK SMALL LETTER OMICRON WITH OXIA +# 1F7B GREEK SMALL LETTER UPSILON WITH OXIA +# 1F7D GREEK SMALL LETTER OMEGA WITH OXIA +# 1FBB GREEK CAPITAL LETTER ALPHA WITH OXIA +# 1FBE GREEK PROSGEGRAMMENI +# 1FC9 GREEK CAPITAL LETTER EPSILON WITH OXIA +# 1FCB GREEK CAPITAL LETTER ETA WITH OXIA +# 1FD3 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +# 1FDB GREEK CAPITAL LETTER IOTA WITH OXIA +# 1FE3 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +# 1FEB GREEK CAPITAL LETTER UPSILON WITH OXIA +# 1FEE..1FEF [2] GREEK DIALYTIKA AND OXIA..GREEK VARIA +# 1FF9 GREEK CAPITAL LETTER OMICRON WITH OXIA +# 1FFB GREEK CAPITAL LETTER OMEGA WITH OXIA +# 1FFD GREEK OXIA +# 2000..2001 [2] EN QUAD..EM QUAD +# 2126 OHM SIGN +# 212A..212B [2] KELVIN SIGN..ANGSTROM SIGN +# 2329 LEFT-POINTING ANGLE BRACKET +# 232A RIGHT-POINTING ANGLE BRACKET +# F900..FA0D [270] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA0D +# FA10 CJK COMPATIBILITY IDEOGRAPH-FA10 +# FA12 CJK COMPATIBILITY IDEOGRAPH-FA12 +# FA15..FA1E [10] CJK COMPATIBILITY IDEOGRAPH-FA15..CJK COMPATIBILITY IDEOGRAPH-FA1E +# FA20 CJK COMPATIBILITY IDEOGRAPH-FA20 +# FA22 CJK COMPATIBILITY IDEOGRAPH-FA22 +# FA25..FA26 [2] CJK COMPATIBILITY IDEOGRAPH-FA25..CJK COMPATIBILITY IDEOGRAPH-FA26 +# FA2A..FA2D [4] CJK COMPATIBILITY IDEOGRAPH-FA2A..CJK COMPATIBILITY IDEOGRAPH-FA2D +# FA30..FA6A [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A +# 2F800..2FA1D [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D + +# Total code points: 924 + +# ================================================ +# (4) Non-Starter Decompositions +# These characters can be derived from the UnicodeData file +# by including all characters whose canonical decomposition consists +# of a sequence of characters, the first of which has a non-zero +# combining class. +# These characters are simply quoted here for reference. +# ================================================ + +# 0344 COMBINING GREEK DIALYTIKA TONOS +# 0F73 TIBETAN VOWEL SIGN II +# 0F75 TIBETAN VOWEL SIGN UU +# 0F81 TIBETAN VOWEL SIGN REVERSED II + +# Total code points: 4 + diff --git a/lib/LineBreak-3.2.0.txt b/lib/LineBreak-3.2.0.txt new file mode 100644 index 0000000..8549eb8 --- /dev/null +++ b/lib/LineBreak-3.2.0.txt @@ -0,0 +1,13889 @@ +# LineBreak-3.2.0.txt +# +# Line Break Properties +# +# This file is a supplement to the UnicodeData.txt file. +# It contains both normative and informative data. +# The format is two fields separated by a semicolon. +# Field 1: Unicode value +# Field 2: LineBreak property, consisting of one of the following values: +# Normative: +# "BK", "CR", "LF", "CM", "SG", "GL", "CB", "SP", "ZW" +# Informative: +# "XX", "OP", "CL", "QU", "NS", "EX", "SY", +# "IS", "PR", "PO", "NU", "AL", "ID", "IN", "HY", +# "BB", "BA", "SA", "AI", "B2" +# - Assigned characters that are not listed explicitly are given the value +# "AL". +# - Unassigned characters are given the value "XX". +# - Characters ranges are specified as for other property files in +# the Unicode Character Database. +# +# The Unicode name of each character is provided in a comment for help +# in identifying the characters. +# +# See UTR #14: Line Breaking Properties, for more information +0000;CM # +0001;CM # +0002;CM # +0003;CM # +0004;CM # +0005;CM # +0006;CM # +0007;CM # +0008;CM # +0009;BA # +000A;LF # +000B;CM # +000C;BK # +000D;CR # +000E;CM # +000F;CM # +0010;CM # +0011;CM # +0012;CM # +0013;CM # +0014;CM # +0015;CM # +0016;CM # +0017;CM # +0018;CM # +0019;CM # +001A;CM # +001B;CM # +001C;CM # +001D;CM # +001E;CM # +001F;CM # +0020;SP # SPACE +0021;EX # EXCLAMATION MARK +0022;QU # QUOTATION MARK +0023;AL # NUMBER SIGN +0024;PR # DOLLAR SIGN +0025;PO # PERCENT SIGN +0026;AL # AMPERSAND +0027;QU # APOSTROPHE +0028;OP # LEFT PARENTHESIS +0029;CL # RIGHT PARENTHESIS +002A;AL # ASTERISK +002B;PR # PLUS SIGN +002C;IS # COMMA +002D;HY # HYPHEN-MINUS +002E;IS # FULL STOP +002F;SY # SOLIDUS +0030;NU # DIGIT ZERO +0031;NU # DIGIT ONE +0032;NU # DIGIT TWO +0033;NU # DIGIT THREE +0034;NU # DIGIT FOUR +0035;NU # DIGIT FIVE +0036;NU # DIGIT SIX +0037;NU # DIGIT SEVEN +0038;NU # DIGIT EIGHT +0039;NU # DIGIT NINE +003A;IS # COLON +003B;IS # SEMICOLON +003C;AL # LESS-THAN SIGN +003D;AL # EQUALS SIGN +003E;AL # GREATER-THAN SIGN +003F;EX # QUESTION MARK +0040;AL # COMMERCIAL AT +0041;AL # LATIN CAPITAL LETTER A +0042;AL # LATIN CAPITAL LETTER B +0043;AL # LATIN CAPITAL LETTER C +0044;AL # LATIN CAPITAL LETTER D +0045;AL # LATIN CAPITAL LETTER E +0046;AL # LATIN CAPITAL LETTER F +0047;AL # LATIN CAPITAL LETTER G +0048;AL # LATIN CAPITAL LETTER H +0049;AL # LATIN CAPITAL LETTER I +004A;AL # LATIN CAPITAL LETTER J +004B;AL # LATIN CAPITAL LETTER K +004C;AL # LATIN CAPITAL LETTER L +004D;AL # LATIN CAPITAL LETTER M +004E;AL # LATIN CAPITAL LETTER N +004F;AL # LATIN CAPITAL LETTER O +0050;AL # LATIN CAPITAL LETTER P +0051;AL # LATIN CAPITAL LETTER Q +0052;AL # LATIN CAPITAL LETTER R +0053;AL # LATIN CAPITAL LETTER S +0054;AL # LATIN CAPITAL LETTER T +0055;AL # LATIN CAPITAL LETTER U +0056;AL # LATIN CAPITAL LETTER V +0057;AL # LATIN CAPITAL LETTER W +0058;AL # LATIN CAPITAL LETTER X +0059;AL # LATIN CAPITAL LETTER Y +005A;AL # LATIN CAPITAL LETTER Z +005B;OP # LEFT SQUARE BRACKET +005C;PR # REVERSE SOLIDUS +005D;CL # RIGHT SQUARE BRACKET +005E;AL # CIRCUMFLEX ACCENT +005F;AL # LOW LINE +0060;AL # GRAVE ACCENT +0061;AL # LATIN SMALL LETTER A +0062;AL # LATIN SMALL LETTER B +0063;AL # LATIN SMALL LETTER C +0064;AL # LATIN SMALL LETTER D +0065;AL # LATIN SMALL LETTER E +0066;AL # LATIN SMALL LETTER F +0067;AL # LATIN SMALL LETTER G +0068;AL # LATIN SMALL LETTER H +0069;AL # LATIN SMALL LETTER I +006A;AL # LATIN SMALL LETTER J +006B;AL # LATIN SMALL LETTER K +006C;AL # LATIN SMALL LETTER L +006D;AL # LATIN SMALL LETTER M +006E;AL # LATIN SMALL LETTER N +006F;AL # LATIN SMALL LETTER O +0070;AL # LATIN SMALL LETTER P +0071;AL # LATIN SMALL LETTER Q +0072;AL # LATIN SMALL LETTER R +0073;AL # LATIN SMALL LETTER S +0074;AL # LATIN SMALL LETTER T +0075;AL # LATIN SMALL LETTER U +0076;AL # LATIN SMALL LETTER V +0077;AL # LATIN SMALL LETTER W +0078;AL # LATIN SMALL LETTER X +0079;AL # LATIN SMALL LETTER Y +007A;AL # LATIN SMALL LETTER Z +007B;OP # LEFT CURLY BRACKET +007C;BA # VERTICAL LINE +007D;CL # RIGHT CURLY BRACKET +007E;AL # TILDE +007F;CM # +0080;CM # +0081;CM # +0082;CM # +0083;CM # +0084;CM # +0085;CM # +0086;CM # +0087;CM # +0088;CM # +0089;CM # +008A;CM # +008B;CM # +008C;CM # +008D;CM # +008E;CM # +008F;CM # +0090;CM # +0091;CM # +0092;CM # +0093;CM # +0094;CM # +0095;CM # +0096;CM # +0097;CM # +0098;CM # +0099;CM # +009A;CM # +009B;CM # +009C;CM # +009D;CM # +009E;CM # +009F;CM # +00A0;GL # NO-BREAK SPACE +00A1;AI # INVERTED EXCLAMATION MARK +00A2;PO # CENT SIGN +00A3;PR # POUND SIGN +00A4;PR # CURRENCY SIGN +00A5;PR # YEN SIGN +00A6;AL # BROKEN BAR +00A7;AI # SECTION SIGN +00A8;AI # DIAERESIS +00A9;AL # COPYRIGHT SIGN +00AA;AI # FEMININE ORDINAL INDICATOR +00AB;QU # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00AC;AL # NOT SIGN +00AD;BA # SOFT HYPHEN +00AE;AL # REGISTERED SIGN +00AF;AL # MACRON +00B0;PO # DEGREE SIGN +00B1;PR # PLUS-MINUS SIGN +00B2;AI # SUPERSCRIPT TWO +00B3;AI # SUPERSCRIPT THREE +00B4;BB # ACUTE ACCENT +00B5;AL # MICRO SIGN +00B6;AI # PILCROW SIGN +00B7;AI # MIDDLE DOT +00B8;AI # CEDILLA +00B9;AI # SUPERSCRIPT ONE +00BA;AI # MASCULINE ORDINAL INDICATOR +00BB;QU # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +00BC;AI # VULGAR FRACTION ONE QUARTER +00BD;AI # VULGAR FRACTION ONE HALF +00BE;AI # VULGAR FRACTION THREE QUARTERS +00BF;AI # INVERTED QUESTION MARK +00C0;AL # LATIN CAPITAL LETTER A WITH GRAVE +00C1;AL # LATIN CAPITAL LETTER A WITH ACUTE +00C2;AL # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +00C3;AL # LATIN CAPITAL LETTER A WITH TILDE +00C4;AL # LATIN CAPITAL LETTER A WITH DIAERESIS +00C5;AL # LATIN CAPITAL LETTER A WITH RING ABOVE +00C6;AI # LATIN CAPITAL LETTER AE +00C7;AL # LATIN CAPITAL LETTER C WITH CEDILLA +00C8;AL # LATIN CAPITAL LETTER E WITH GRAVE +00C9;AL # LATIN CAPITAL LETTER E WITH ACUTE +00CA;AL # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +00CB;AL # LATIN CAPITAL LETTER E WITH DIAERESIS +00CC;AL # LATIN CAPITAL LETTER I WITH GRAVE +00CD;AL # LATIN CAPITAL LETTER I WITH ACUTE +00CE;AL # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +00CF;AL # LATIN CAPITAL LETTER I WITH DIAERESIS +00D0;AI # LATIN CAPITAL LETTER ETH +00D1;AL # LATIN CAPITAL LETTER N WITH TILDE +00D2;AL # LATIN CAPITAL LETTER O WITH GRAVE +00D3;AL # LATIN CAPITAL LETTER O WITH ACUTE +00D4;AL # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +00D5;AL # LATIN CAPITAL LETTER O WITH TILDE +00D6;AL # LATIN CAPITAL LETTER O WITH DIAERESIS +00D7;AI # MULTIPLICATION SIGN +00D8;AI # LATIN CAPITAL LETTER O WITH STROKE +00D9;AL # LATIN CAPITAL LETTER U WITH GRAVE +00DA;AL # LATIN CAPITAL LETTER U WITH ACUTE +00DB;AL # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +00DC;AL # LATIN CAPITAL LETTER U WITH DIAERESIS +00DD;AL # LATIN CAPITAL LETTER Y WITH ACUTE +00DE;AI # LATIN CAPITAL LETTER THORN +00DF;AI # LATIN SMALL LETTER SHARP S +00E0;AI # LATIN SMALL LETTER A WITH GRAVE +00E1;AI # LATIN SMALL LETTER A WITH ACUTE +00E2;AL # LATIN SMALL LETTER A WITH CIRCUMFLEX +00E3;AL # LATIN SMALL LETTER A WITH TILDE +00E4;AL # LATIN SMALL LETTER A WITH DIAERESIS +00E5;AL # LATIN SMALL LETTER A WITH RING ABOVE +00E6;AI # LATIN SMALL LETTER AE +00E7;AL # LATIN SMALL LETTER C WITH CEDILLA +00E8;AI # LATIN SMALL LETTER E WITH GRAVE +00E9;AI # LATIN SMALL LETTER E WITH ACUTE +00EA;AI # LATIN SMALL LETTER E WITH CIRCUMFLEX +00EB;AL # LATIN SMALL LETTER E WITH DIAERESIS +00EC;AI # LATIN SMALL LETTER I WITH GRAVE +00ED;AI # LATIN SMALL LETTER I WITH ACUTE +00EE;AL # LATIN SMALL LETTER I WITH CIRCUMFLEX +00EF;AL # LATIN SMALL LETTER I WITH DIAERESIS +00F0;AI # LATIN SMALL LETTER ETH +00F1;AL # LATIN SMALL LETTER N WITH TILDE +00F2;AI # LATIN SMALL LETTER O WITH GRAVE +00F3;AI # LATIN SMALL LETTER O WITH ACUTE +00F4;AL # LATIN SMALL LETTER O WITH CIRCUMFLEX +00F5;AL # LATIN SMALL LETTER O WITH TILDE +00F6;AL # LATIN SMALL LETTER O WITH DIAERESIS +00F7;AI # DIVISION SIGN +00F8;AI # LATIN SMALL LETTER O WITH STROKE +00F9;AI # LATIN SMALL LETTER U WITH GRAVE +00FA;AI # LATIN SMALL LETTER U WITH ACUTE +00FB;AL # LATIN SMALL LETTER U WITH CIRCUMFLEX +00FC;AI # LATIN SMALL LETTER U WITH DIAERESIS +00FD;AL # LATIN SMALL LETTER Y WITH ACUTE +00FE;AI # LATIN SMALL LETTER THORN +00FF;AL # LATIN SMALL LETTER Y WITH DIAERESIS +0100;AL # LATIN CAPITAL LETTER A WITH MACRON +0101;AI # LATIN SMALL LETTER A WITH MACRON +0102;AL # LATIN CAPITAL LETTER A WITH BREVE +0103;AL # LATIN SMALL LETTER A WITH BREVE +0104;AL # LATIN CAPITAL LETTER A WITH OGONEK +0105;AL # LATIN SMALL LETTER A WITH OGONEK +0106;AL # LATIN CAPITAL LETTER C WITH ACUTE +0107;AL # LATIN SMALL LETTER C WITH ACUTE +0108;AL # LATIN CAPITAL LETTER C WITH CIRCUMFLEX +0109;AL # LATIN SMALL LETTER C WITH CIRCUMFLEX +010A;AL # LATIN CAPITAL LETTER C WITH DOT ABOVE +010B;AL # LATIN SMALL LETTER C WITH DOT ABOVE +010C;AL # LATIN CAPITAL LETTER C WITH CARON +010D;AL # LATIN SMALL LETTER C WITH CARON +010E;AL # LATIN CAPITAL LETTER D WITH CARON +010F;AL # LATIN SMALL LETTER D WITH CARON +0110;AL # LATIN CAPITAL LETTER D WITH STROKE +0111;AI # LATIN SMALL LETTER D WITH STROKE +0112;AL # LATIN CAPITAL LETTER E WITH MACRON +0113;AI # LATIN SMALL LETTER E WITH MACRON +0114;AL # LATIN CAPITAL LETTER E WITH BREVE +0115;AL # LATIN SMALL LETTER E WITH BREVE +0116;AL # LATIN CAPITAL LETTER E WITH DOT ABOVE +0117;AL # LATIN SMALL LETTER E WITH DOT ABOVE +0118;AL # LATIN CAPITAL LETTER E WITH OGONEK +0119;AL # LATIN SMALL LETTER E WITH OGONEK +011A;AL # LATIN CAPITAL LETTER E WITH CARON +011B;AI # LATIN SMALL LETTER E WITH CARON +011C;AL # LATIN CAPITAL LETTER G WITH CIRCUMFLEX +011D;AL # LATIN SMALL LETTER G WITH CIRCUMFLEX +011E;AL # LATIN CAPITAL LETTER G WITH BREVE +011F;AL # LATIN SMALL LETTER G WITH BREVE +0120;AL # LATIN CAPITAL LETTER G WITH DOT ABOVE +0121;AL # LATIN SMALL LETTER G WITH DOT ABOVE +0122;AL # LATIN CAPITAL LETTER G WITH CEDILLA +0123;AL # LATIN SMALL LETTER G WITH CEDILLA +0124;AL # LATIN CAPITAL LETTER H WITH CIRCUMFLEX +0125;AL # LATIN SMALL LETTER H WITH CIRCUMFLEX +0126;AI # LATIN CAPITAL LETTER H WITH STROKE +0127;AI # LATIN SMALL LETTER H WITH STROKE +0128;AL # LATIN CAPITAL LETTER I WITH TILDE +0129;AL # LATIN SMALL LETTER I WITH TILDE +012A;AL # LATIN CAPITAL LETTER I WITH MACRON +012B;AI # LATIN SMALL LETTER I WITH MACRON +012C;AL # LATIN CAPITAL LETTER I WITH BREVE +012D;AL # LATIN SMALL LETTER I WITH BREVE +012E;AL # LATIN CAPITAL LETTER I WITH OGONEK +012F;AL # LATIN SMALL LETTER I WITH OGONEK +0130;AL # LATIN CAPITAL LETTER I WITH DOT ABOVE +0131;AI # LATIN SMALL LETTER DOTLESS I +0132;AI # LATIN CAPITAL LIGATURE IJ +0133;AI # LATIN SMALL LIGATURE IJ +0134;AL # LATIN CAPITAL LETTER J WITH CIRCUMFLEX +0135;AL # LATIN SMALL LETTER J WITH CIRCUMFLEX +0136;AL # LATIN CAPITAL LETTER K WITH CEDILLA +0137;AL # LATIN SMALL LETTER K WITH CEDILLA +0138;AI # LATIN SMALL LETTER KRA +0139;AL # LATIN CAPITAL LETTER L WITH ACUTE +013A;AL # LATIN SMALL LETTER L WITH ACUTE +013B;AL # LATIN CAPITAL LETTER L WITH CEDILLA +013C;AL # LATIN SMALL LETTER L WITH CEDILLA +013D;AL # LATIN CAPITAL LETTER L WITH CARON +013E;AL # LATIN SMALL LETTER L WITH CARON +013F;AI # LATIN CAPITAL LETTER L WITH MIDDLE DOT +0140;AI # LATIN SMALL LETTER L WITH MIDDLE DOT +0141;AI # LATIN CAPITAL LETTER L WITH STROKE +0142;AI # LATIN SMALL LETTER L WITH STROKE +0143;AL # LATIN CAPITAL LETTER N WITH ACUTE +0144;AI # LATIN SMALL LETTER N WITH ACUTE +0145;AL # LATIN CAPITAL LETTER N WITH CEDILLA +0146;AL # LATIN SMALL LETTER N WITH CEDILLA +0147;AL # LATIN CAPITAL LETTER N WITH CARON +0148;AI # LATIN SMALL LETTER N WITH CARON +0149;AI # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +014A;AI # LATIN CAPITAL LETTER ENG +014B;AL # LATIN SMALL LETTER ENG +014C;AL # LATIN CAPITAL LETTER O WITH MACRON +014D;AI # LATIN SMALL LETTER O WITH MACRON +014E;AL # LATIN CAPITAL LETTER O WITH BREVE +014F;AL # LATIN SMALL LETTER O WITH BREVE +0150;AL # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0151;AL # LATIN SMALL LETTER O WITH DOUBLE ACUTE +0152;AI # LATIN CAPITAL LIGATURE OE +0153;AI # LATIN SMALL LIGATURE OE +0154;AL # LATIN CAPITAL LETTER R WITH ACUTE +0155;AL # LATIN SMALL LETTER R WITH ACUTE +0156;AL # LATIN CAPITAL LETTER R WITH CEDILLA +0157;AL # LATIN SMALL LETTER R WITH CEDILLA +0158;AL # LATIN CAPITAL LETTER R WITH CARON +0159;AL # LATIN SMALL LETTER R WITH CARON +015A;AL # LATIN CAPITAL LETTER S WITH ACUTE +015B;AL # LATIN SMALL LETTER S WITH ACUTE +015C;AL # LATIN CAPITAL LETTER S WITH CIRCUMFLEX +015D;AL # LATIN SMALL LETTER S WITH CIRCUMFLEX +015E;AL # LATIN CAPITAL LETTER S WITH CEDILLA +015F;AL # LATIN SMALL LETTER S WITH CEDILLA +0160;AL # LATIN CAPITAL LETTER S WITH CARON +0161;AL # LATIN SMALL LETTER S WITH CARON +0162;AL # LATIN CAPITAL LETTER T WITH CEDILLA +0163;AL # LATIN SMALL LETTER T WITH CEDILLA +0164;AL # LATIN CAPITAL LETTER T WITH CARON +0165;AL # LATIN SMALL LETTER T WITH CARON +0166;AI # LATIN CAPITAL LETTER T WITH STROKE +0167;AI # LATIN SMALL LETTER T WITH STROKE +0168;AL # LATIN CAPITAL LETTER U WITH TILDE +0169;AL # LATIN SMALL LETTER U WITH TILDE +016A;AL # LATIN CAPITAL LETTER U WITH MACRON +016B;AI # LATIN SMALL LETTER U WITH MACRON +016C;AL # LATIN CAPITAL LETTER U WITH BREVE +016D;AL # LATIN SMALL LETTER U WITH BREVE +016E;AL # LATIN CAPITAL LETTER U WITH RING ABOVE +016F;AL # LATIN SMALL LETTER U WITH RING ABOVE +0170;AL # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0171;AL # LATIN SMALL LETTER U WITH DOUBLE ACUTE +0172;AL # LATIN CAPITAL LETTER U WITH OGONEK +0173;AL # LATIN SMALL LETTER U WITH OGONEK +0174;AL # LATIN CAPITAL LETTER W WITH CIRCUMFLEX +0175;AL # LATIN SMALL LETTER W WITH CIRCUMFLEX +0176;AL # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +0177;AL # LATIN SMALL LETTER Y WITH CIRCUMFLEX +0178;AL # LATIN CAPITAL LETTER Y WITH DIAERESIS +0179;AL # LATIN CAPITAL LETTER Z WITH ACUTE +017A;AL # LATIN SMALL LETTER Z WITH ACUTE +017B;AL # LATIN CAPITAL LETTER Z WITH DOT ABOVE +017C;AL # LATIN SMALL LETTER Z WITH DOT ABOVE +017D;AL # LATIN CAPITAL LETTER Z WITH CARON +017E;AL # LATIN SMALL LETTER Z WITH CARON +017F;AL # LATIN SMALL LETTER LONG S +0180;AL # LATIN SMALL LETTER B WITH STROKE +0181;AL # LATIN CAPITAL LETTER B WITH HOOK +0182;AL # LATIN CAPITAL LETTER B WITH TOPBAR +0183;AL # LATIN SMALL LETTER B WITH TOPBAR +0184;AL # LATIN CAPITAL LETTER TONE SIX +0185;AL # LATIN SMALL LETTER TONE SIX +0186;AL # LATIN CAPITAL LETTER OPEN O +0187;AL # LATIN CAPITAL LETTER C WITH HOOK +0188;AL # LATIN SMALL LETTER C WITH HOOK +0189;AL # LATIN CAPITAL LETTER AFRICAN D +018A;AL # LATIN CAPITAL LETTER D WITH HOOK +018B;AL # LATIN CAPITAL LETTER D WITH TOPBAR +018C;AL # LATIN SMALL LETTER D WITH TOPBAR +018D;AL # LATIN SMALL LETTER TURNED DELTA +018E;AL # LATIN CAPITAL LETTER REVERSED E +018F;AL # LATIN CAPITAL LETTER SCHWA +0190;AL # LATIN CAPITAL LETTER OPEN E +0191;AL # LATIN CAPITAL LETTER F WITH HOOK +0192;AL # LATIN SMALL LETTER F WITH HOOK +0193;AL # LATIN CAPITAL LETTER G WITH HOOK +0194;AL # LATIN CAPITAL LETTER GAMMA +0195;AL # LATIN SMALL LETTER HV +0196;AL # LATIN CAPITAL LETTER IOTA +0197;AL # LATIN CAPITAL LETTER I WITH STROKE +0198;AL # LATIN CAPITAL LETTER K WITH HOOK +0199;AL # LATIN SMALL LETTER K WITH HOOK +019A;AL # LATIN SMALL LETTER L WITH BAR +019B;AL # LATIN SMALL LETTER LAMBDA WITH STROKE +019C;AL # LATIN CAPITAL LETTER TURNED M +019D;AL # LATIN CAPITAL LETTER N WITH LEFT HOOK +019E;AL # LATIN SMALL LETTER N WITH LONG RIGHT LEG +019F;AL # LATIN CAPITAL LETTER O WITH MIDDLE TILDE +01A0;AL # LATIN CAPITAL LETTER O WITH HORN +01A1;AL # LATIN SMALL LETTER O WITH HORN +01A2;AL # LATIN CAPITAL LETTER OI +01A3;AL # LATIN SMALL LETTER OI +01A4;AL # LATIN CAPITAL LETTER P WITH HOOK +01A5;AL # LATIN SMALL LETTER P WITH HOOK +01A6;AL # LATIN LETTER YR +01A7;AL # LATIN CAPITAL LETTER TONE TWO +01A8;AL # LATIN SMALL LETTER TONE TWO +01A9;AL # LATIN CAPITAL LETTER ESH +01AA;AL # LATIN LETTER REVERSED ESH LOOP +01AB;AL # LATIN SMALL LETTER T WITH PALATAL HOOK +01AC;AL # LATIN CAPITAL LETTER T WITH HOOK +01AD;AL # LATIN SMALL LETTER T WITH HOOK +01AE;AL # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK +01AF;AL # LATIN CAPITAL LETTER U WITH HORN +01B0;AL # LATIN SMALL LETTER U WITH HORN +01B1;AL # LATIN CAPITAL LETTER UPSILON +01B2;AL # LATIN CAPITAL LETTER V WITH HOOK +01B3;AL # LATIN CAPITAL LETTER Y WITH HOOK +01B4;AL # LATIN SMALL LETTER Y WITH HOOK +01B5;AL # LATIN CAPITAL LETTER Z WITH STROKE +01B6;AL # LATIN SMALL LETTER Z WITH STROKE +01B7;AL # LATIN CAPITAL LETTER EZH +01B8;AL # LATIN CAPITAL LETTER EZH REVERSED +01B9;AL # LATIN SMALL LETTER EZH REVERSED +01BA;AL # LATIN SMALL LETTER EZH WITH TAIL +01BB;AL # LATIN LETTER TWO WITH STROKE +01BC;AL # LATIN CAPITAL LETTER TONE FIVE +01BD;AL # LATIN SMALL LETTER TONE FIVE +01BE;AL # LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE +01BF;AL # LATIN LETTER WYNN +01C0;AL # LATIN LETTER DENTAL CLICK +01C1;AL # LATIN LETTER LATERAL CLICK +01C2;AL # LATIN LETTER ALVEOLAR CLICK +01C3;AL # LATIN LETTER RETROFLEX CLICK +01C4;AL # LATIN CAPITAL LETTER DZ WITH CARON +01C5;AL # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON +01C6;AL # LATIN SMALL LETTER DZ WITH CARON +01C7;AL # LATIN CAPITAL LETTER LJ +01C8;AL # LATIN CAPITAL LETTER L WITH SMALL LETTER J +01C9;AL # LATIN SMALL LETTER LJ +01CA;AL # LATIN CAPITAL LETTER NJ +01CB;AL # LATIN CAPITAL LETTER N WITH SMALL LETTER J +01CC;AL # LATIN SMALL LETTER NJ +01CD;AL # LATIN CAPITAL LETTER A WITH CARON +01CE;AI # LATIN SMALL LETTER A WITH CARON +01CF;AL # LATIN CAPITAL LETTER I WITH CARON +01D0;AI # LATIN SMALL LETTER I WITH CARON +01D1;AL # LATIN CAPITAL LETTER O WITH CARON +01D2;AI # LATIN SMALL LETTER O WITH CARON +01D3;AL # LATIN CAPITAL LETTER U WITH CARON +01D4;AI # LATIN SMALL LETTER U WITH CARON +01D5;AL # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +01D6;AI # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +01D7;AL # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +01D8;AI # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +01D9;AL # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +01DA;AI # LATIN SMALL LETTER U WITH DIAERESIS AND CARON +01DB;AL # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +01DC;AI # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE +01DD;AL # LATIN SMALL LETTER TURNED E +01DE;AL # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +01DF;AL # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON +01E0;AL # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +01E1;AL # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON +01E2;AL # LATIN CAPITAL LETTER AE WITH MACRON +01E3;AL # LATIN SMALL LETTER AE WITH MACRON +01E4;AL # LATIN CAPITAL LETTER G WITH STROKE +01E5;AL # LATIN SMALL LETTER G WITH STROKE +01E6;AL # LATIN CAPITAL LETTER G WITH CARON +01E7;AL # LATIN SMALL LETTER G WITH CARON +01E8;AL # LATIN CAPITAL LETTER K WITH CARON +01E9;AL # LATIN SMALL LETTER K WITH CARON +01EA;AL # LATIN CAPITAL LETTER O WITH OGONEK +01EB;AL # LATIN SMALL LETTER O WITH OGONEK +01EC;AL # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +01ED;AL # LATIN SMALL LETTER O WITH OGONEK AND MACRON +01EE;AL # LATIN CAPITAL LETTER EZH WITH CARON +01EF;AL # LATIN SMALL LETTER EZH WITH CARON +01F0;AL # LATIN SMALL LETTER J WITH CARON +01F1;AL # LATIN CAPITAL LETTER DZ +01F2;AL # LATIN CAPITAL LETTER D WITH SMALL LETTER Z +01F3;AL # LATIN SMALL LETTER DZ +01F4;AL # LATIN CAPITAL LETTER G WITH ACUTE +01F5;AL # LATIN SMALL LETTER G WITH ACUTE +01F6;AL # LATIN CAPITAL LETTER HWAIR +01F7;AL # LATIN CAPITAL LETTER WYNN +01F8;AL # LATIN CAPITAL LETTER N WITH GRAVE +01F9;AL # LATIN SMALL LETTER N WITH GRAVE +01FA;AL # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +01FB;AL # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE +01FC;AL # LATIN CAPITAL LETTER AE WITH ACUTE +01FD;AL # LATIN SMALL LETTER AE WITH ACUTE +01FE;AL # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +01FF;AL # LATIN SMALL LETTER O WITH STROKE AND ACUTE +0200;AL # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +0201;AL # LATIN SMALL LETTER A WITH DOUBLE GRAVE +0202;AL # LATIN CAPITAL LETTER A WITH INVERTED BREVE +0203;AL # LATIN SMALL LETTER A WITH INVERTED BREVE +0204;AL # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +0205;AL # LATIN SMALL LETTER E WITH DOUBLE GRAVE +0206;AL # LATIN CAPITAL LETTER E WITH INVERTED BREVE +0207;AL # LATIN SMALL LETTER E WITH INVERTED BREVE +0208;AL # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +0209;AL # LATIN SMALL LETTER I WITH DOUBLE GRAVE +020A;AL # LATIN CAPITAL LETTER I WITH INVERTED BREVE +020B;AL # LATIN SMALL LETTER I WITH INVERTED BREVE +020C;AL # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +020D;AL # LATIN SMALL LETTER O WITH DOUBLE GRAVE +020E;AL # LATIN CAPITAL LETTER O WITH INVERTED BREVE +020F;AL # LATIN SMALL LETTER O WITH INVERTED BREVE +0210;AL # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +0211;AL # LATIN SMALL LETTER R WITH DOUBLE GRAVE +0212;AL # LATIN CAPITAL LETTER R WITH INVERTED BREVE +0213;AL # LATIN SMALL LETTER R WITH INVERTED BREVE +0214;AL # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +0215;AL # LATIN SMALL LETTER U WITH DOUBLE GRAVE +0216;AL # LATIN CAPITAL LETTER U WITH INVERTED BREVE +0217;AL # LATIN SMALL LETTER U WITH INVERTED BREVE +0218;AL # LATIN CAPITAL LETTER S WITH COMMA BELOW +0219;AL # LATIN SMALL LETTER S WITH COMMA BELOW +021A;AL # LATIN CAPITAL LETTER T WITH COMMA BELOW +021B;AL # LATIN SMALL LETTER T WITH COMMA BELOW +021C;AL # LATIN CAPITAL LETTER YOGH +021D;AL # LATIN SMALL LETTER YOGH +021E;AL # LATIN CAPITAL LETTER H WITH CARON +021F;AL # LATIN SMALL LETTER H WITH CARON +0220;AL # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG +0222;AL # LATIN CAPITAL LETTER OU +0223;AL # LATIN SMALL LETTER OU +0224;AL # LATIN CAPITAL LETTER Z WITH HOOK +0225;AL # LATIN SMALL LETTER Z WITH HOOK +0226;AL # LATIN CAPITAL LETTER A WITH DOT ABOVE +0227;AL # LATIN SMALL LETTER A WITH DOT ABOVE +0228;AL # LATIN CAPITAL LETTER E WITH CEDILLA +0229;AL # LATIN SMALL LETTER E WITH CEDILLA +022A;AL # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON +022B;AL # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON +022C;AL # LATIN CAPITAL LETTER O WITH TILDE AND MACRON +022D;AL # LATIN SMALL LETTER O WITH TILDE AND MACRON +022E;AL # LATIN CAPITAL LETTER O WITH DOT ABOVE +022F;AL # LATIN SMALL LETTER O WITH DOT ABOVE +0230;AL # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON +0231;AL # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON +0232;AL # LATIN CAPITAL LETTER Y WITH MACRON +0233;AL # LATIN SMALL LETTER Y WITH MACRON +0250;AL # LATIN SMALL LETTER TURNED A +0251;AI # LATIN SMALL LETTER ALPHA +0252;AL # LATIN SMALL LETTER TURNED ALPHA +0253;AL # LATIN SMALL LETTER B WITH HOOK +0254;AL # LATIN SMALL LETTER OPEN O +0255;AL # LATIN SMALL LETTER C WITH CURL +0256;AL # LATIN SMALL LETTER D WITH TAIL +0257;AL # LATIN SMALL LETTER D WITH HOOK +0258;AL # LATIN SMALL LETTER REVERSED E +0259;AL # LATIN SMALL LETTER SCHWA +025A;AL # LATIN SMALL LETTER SCHWA WITH HOOK +025B;AL # LATIN SMALL LETTER OPEN E +025C;AL # LATIN SMALL LETTER REVERSED OPEN E +025D;AL # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK +025E;AL # LATIN SMALL LETTER CLOSED REVERSED OPEN E +025F;AL # LATIN SMALL LETTER DOTLESS J WITH STROKE +0260;AL # LATIN SMALL LETTER G WITH HOOK +0261;AI # LATIN SMALL LETTER SCRIPT G +0262;AL # LATIN LETTER SMALL CAPITAL G +0263;AL # LATIN SMALL LETTER GAMMA +0264;AL # LATIN SMALL LETTER RAMS HORN +0265;AL # LATIN SMALL LETTER TURNED H +0266;AL # LATIN SMALL LETTER H WITH HOOK +0267;AL # LATIN SMALL LETTER HENG WITH HOOK +0268;AL # LATIN SMALL LETTER I WITH STROKE +0269;AL # LATIN SMALL LETTER IOTA +026A;AL # LATIN LETTER SMALL CAPITAL I +026B;AL # LATIN SMALL LETTER L WITH MIDDLE TILDE +026C;AL # LATIN SMALL LETTER L WITH BELT +026D;AL # LATIN SMALL LETTER L WITH RETROFLEX HOOK +026E;AL # LATIN SMALL LETTER LEZH +026F;AL # LATIN SMALL LETTER TURNED M +0270;AL # LATIN SMALL LETTER TURNED M WITH LONG LEG +0271;AL # LATIN SMALL LETTER M WITH HOOK +0272;AL # LATIN SMALL LETTER N WITH LEFT HOOK +0273;AL # LATIN SMALL LETTER N WITH RETROFLEX HOOK +0274;AL # LATIN LETTER SMALL CAPITAL N +0275;AL # LATIN SMALL LETTER BARRED O +0276;AL # LATIN LETTER SMALL CAPITAL OE +0277;AL # LATIN SMALL LETTER CLOSED OMEGA +0278;AL # LATIN SMALL LETTER PHI +0279;AL # LATIN SMALL LETTER TURNED R +027A;AL # LATIN SMALL LETTER TURNED R WITH LONG LEG +027B;AL # LATIN SMALL LETTER TURNED R WITH HOOK +027C;AL # LATIN SMALL LETTER R WITH LONG LEG +027D;AL # LATIN SMALL LETTER R WITH TAIL +027E;AL # LATIN SMALL LETTER R WITH FISHHOOK +027F;AL # LATIN SMALL LETTER REVERSED R WITH FISHHOOK +0280;AL # LATIN LETTER SMALL CAPITAL R +0281;AL # LATIN LETTER SMALL CAPITAL INVERTED R +0282;AL # LATIN SMALL LETTER S WITH HOOK +0283;AL # LATIN SMALL LETTER ESH +0284;AL # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK +0285;AL # LATIN SMALL LETTER SQUAT REVERSED ESH +0286;AL # LATIN SMALL LETTER ESH WITH CURL +0287;AL # LATIN SMALL LETTER TURNED T +0288;AL # LATIN SMALL LETTER T WITH RETROFLEX HOOK +0289;AL # LATIN SMALL LETTER U BAR +028A;AL # LATIN SMALL LETTER UPSILON +028B;AL # LATIN SMALL LETTER V WITH HOOK +028C;AL # LATIN SMALL LETTER TURNED V +028D;AL # LATIN SMALL LETTER TURNED W +028E;AL # LATIN SMALL LETTER TURNED Y +028F;AL # LATIN LETTER SMALL CAPITAL Y +0290;AL # LATIN SMALL LETTER Z WITH RETROFLEX HOOK +0291;AL # LATIN SMALL LETTER Z WITH CURL +0292;AL # LATIN SMALL LETTER EZH +0293;AL # LATIN SMALL LETTER EZH WITH CURL +0294;AL # LATIN LETTER GLOTTAL STOP +0295;AL # LATIN LETTER PHARYNGEAL VOICED FRICATIVE +0296;AL # LATIN LETTER INVERTED GLOTTAL STOP +0297;AL # LATIN LETTER STRETCHED C +0298;AL # LATIN LETTER BILABIAL CLICK +0299;AL # LATIN LETTER SMALL CAPITAL B +029A;AL # LATIN SMALL LETTER CLOSED OPEN E +029B;AL # LATIN LETTER SMALL CAPITAL G WITH HOOK +029C;AL # LATIN LETTER SMALL CAPITAL H +029D;AL # LATIN SMALL LETTER J WITH CROSSED-TAIL +029E;AL # LATIN SMALL LETTER TURNED K +029F;AL # LATIN LETTER SMALL CAPITAL L +02A0;AL # LATIN SMALL LETTER Q WITH HOOK +02A1;AL # LATIN LETTER GLOTTAL STOP WITH STROKE +02A2;AL # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE +02A3;AL # LATIN SMALL LETTER DZ DIGRAPH +02A4;AL # LATIN SMALL LETTER DEZH DIGRAPH +02A5;AL # LATIN SMALL LETTER DZ DIGRAPH WITH CURL +02A6;AL # LATIN SMALL LETTER TS DIGRAPH +02A7;AL # LATIN SMALL LETTER TESH DIGRAPH +02A8;AL # LATIN SMALL LETTER TC DIGRAPH WITH CURL +02A9;AL # LATIN SMALL LETTER FENG DIGRAPH +02AA;AL # LATIN SMALL LETTER LS DIGRAPH +02AB;AL # LATIN SMALL LETTER LZ DIGRAPH +02AC;AL # LATIN LETTER BILABIAL PERCUSSIVE +02AD;AL # LATIN LETTER BIDENTAL PERCUSSIVE +02B0;AL # MODIFIER LETTER SMALL H +02B1;AL # MODIFIER LETTER SMALL H WITH HOOK +02B2;AL # MODIFIER LETTER SMALL J +02B3;AL # MODIFIER LETTER SMALL R +02B4;AL # MODIFIER LETTER SMALL TURNED R +02B5;AL # MODIFIER LETTER SMALL TURNED R WITH HOOK +02B6;AL # MODIFIER LETTER SMALL CAPITAL INVERTED R +02B7;AL # MODIFIER LETTER SMALL W +02B8;AL # MODIFIER LETTER SMALL Y +02B9;AL # MODIFIER LETTER PRIME +02BA;AL # MODIFIER LETTER DOUBLE PRIME +02BB;AL # MODIFIER LETTER TURNED COMMA +02BC;AL # MODIFIER LETTER APOSTROPHE +02BD;AL # MODIFIER LETTER REVERSED COMMA +02BE;AL # MODIFIER LETTER RIGHT HALF RING +02BF;AL # MODIFIER LETTER LEFT HALF RING +02C0;AL # MODIFIER LETTER GLOTTAL STOP +02C1;AL # MODIFIER LETTER REVERSED GLOTTAL STOP +02C2;AL # MODIFIER LETTER LEFT ARROWHEAD +02C3;AL # MODIFIER LETTER RIGHT ARROWHEAD +02C4;AL # MODIFIER LETTER UP ARROWHEAD +02C5;AL # MODIFIER LETTER DOWN ARROWHEAD +02C6;AL # MODIFIER LETTER CIRCUMFLEX ACCENT +02C7;AI # CARON +02C8;BB # MODIFIER LETTER VERTICAL LINE +02C9;AI # MODIFIER LETTER MACRON +02CA;AI # MODIFIER LETTER ACUTE ACCENT +02CB;AI # MODIFIER LETTER GRAVE ACCENT +02CC;BB # MODIFIER LETTER LOW VERTICAL LINE +02CD;AI # MODIFIER LETTER LOW MACRON +02CE;AL # MODIFIER LETTER LOW GRAVE ACCENT +02CF;AL # MODIFIER LETTER LOW ACUTE ACCENT +02D0;AI # MODIFIER LETTER TRIANGULAR COLON +02D1;AL # MODIFIER LETTER HALF TRIANGULAR COLON +02D2;AL # MODIFIER LETTER CENTRED RIGHT HALF RING +02D3;AL # MODIFIER LETTER CENTRED LEFT HALF RING +02D4;AL # MODIFIER LETTER UP TACK +02D5;AL # MODIFIER LETTER DOWN TACK +02D6;AL # MODIFIER LETTER PLUS SIGN +02D7;AL # MODIFIER LETTER MINUS SIGN +02D8;AI # BREVE +02D9;AI # DOT ABOVE +02DA;AI # RING ABOVE +02DB;AI # OGONEK +02DC;AL # SMALL TILDE +02DD;AI # DOUBLE ACUTE ACCENT +02DE;AL # MODIFIER LETTER RHOTIC HOOK +02DF;AL # MODIFIER LETTER CROSS ACCENT +02E0;AL # MODIFIER LETTER SMALL GAMMA +02E1;AL # MODIFIER LETTER SMALL L +02E2;AL # MODIFIER LETTER SMALL S +02E3;AL # MODIFIER LETTER SMALL X +02E4;AL # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02E5;AL # MODIFIER LETTER EXTRA-HIGH TONE BAR +02E6;AL # MODIFIER LETTER HIGH TONE BAR +02E7;AL # MODIFIER LETTER MID TONE BAR +02E8;AL # MODIFIER LETTER LOW TONE BAR +02E9;AL # MODIFIER LETTER EXTRA-LOW TONE BAR +02EA;AL # MODIFIER LETTER YIN DEPARTING TONE MARK +02EB;AL # MODIFIER LETTER YANG DEPARTING TONE MARK +02EC;AL # MODIFIER LETTER VOICING +02ED;AL # MODIFIER LETTER UNASPIRATED +02EE;AL # MODIFIER LETTER DOUBLE APOSTROPHE +0300;CM # COMBINING GRAVE ACCENT +0301;CM # COMBINING ACUTE ACCENT +0302;CM # COMBINING CIRCUMFLEX ACCENT +0303;CM # COMBINING TILDE +0304;CM # COMBINING MACRON +0305;CM # COMBINING OVERLINE +0306;CM # COMBINING BREVE +0307;CM # COMBINING DOT ABOVE +0308;CM # COMBINING DIAERESIS +0309;CM # COMBINING HOOK ABOVE +030A;CM # COMBINING RING ABOVE +030B;CM # COMBINING DOUBLE ACUTE ACCENT +030C;CM # COMBINING CARON +030D;CM # COMBINING VERTICAL LINE ABOVE +030E;CM # COMBINING DOUBLE VERTICAL LINE ABOVE +030F;CM # COMBINING DOUBLE GRAVE ACCENT +0310;CM # COMBINING CANDRABINDU +0311;CM # COMBINING INVERTED BREVE +0312;CM # COMBINING TURNED COMMA ABOVE +0313;CM # COMBINING COMMA ABOVE +0314;CM # COMBINING REVERSED COMMA ABOVE +0315;CM # COMBINING COMMA ABOVE RIGHT +0316;CM # COMBINING GRAVE ACCENT BELOW +0317;CM # COMBINING ACUTE ACCENT BELOW +0318;CM # COMBINING LEFT TACK BELOW +0319;CM # COMBINING RIGHT TACK BELOW +031A;CM # COMBINING LEFT ANGLE ABOVE +031B;CM # COMBINING HORN +031C;CM # COMBINING LEFT HALF RING BELOW +031D;CM # COMBINING UP TACK BELOW +031E;CM # COMBINING DOWN TACK BELOW +031F;CM # COMBINING PLUS SIGN BELOW +0320;CM # COMBINING MINUS SIGN BELOW +0321;CM # COMBINING PALATALIZED HOOK BELOW +0322;CM # COMBINING RETROFLEX HOOK BELOW +0323;CM # COMBINING DOT BELOW +0324;CM # COMBINING DIAERESIS BELOW +0325;CM # COMBINING RING BELOW +0326;CM # COMBINING COMMA BELOW +0327;CM # COMBINING CEDILLA +0328;CM # COMBINING OGONEK +0329;CM # COMBINING VERTICAL LINE BELOW +032A;CM # COMBINING BRIDGE BELOW +032B;CM # COMBINING INVERTED DOUBLE ARCH BELOW +032C;CM # COMBINING CARON BELOW +032D;CM # COMBINING CIRCUMFLEX ACCENT BELOW +032E;CM # COMBINING BREVE BELOW +032F;CM # COMBINING INVERTED BREVE BELOW +0330;CM # COMBINING TILDE BELOW +0331;CM # COMBINING MACRON BELOW +0332;CM # COMBINING LOW LINE +0333;CM # COMBINING DOUBLE LOW LINE +0334;CM # COMBINING TILDE OVERLAY +0335;CM # COMBINING SHORT STROKE OVERLAY +0336;CM # COMBINING LONG STROKE OVERLAY +0337;CM # COMBINING SHORT SOLIDUS OVERLAY +0338;CM # COMBINING LONG SOLIDUS OVERLAY +0339;CM # COMBINING RIGHT HALF RING BELOW +033A;CM # COMBINING INVERTED BRIDGE BELOW +033B;CM # COMBINING SQUARE BELOW +033C;CM # COMBINING SEAGULL BELOW +033D;CM # COMBINING X ABOVE +033E;CM # COMBINING VERTICAL TILDE +033F;CM # COMBINING DOUBLE OVERLINE +0340;CM # COMBINING GRAVE TONE MARK +0341;CM # COMBINING ACUTE TONE MARK +0342;CM # COMBINING GREEK PERISPOMENI +0343;CM # COMBINING GREEK KORONIS +0344;CM # COMBINING GREEK DIALYTIKA TONOS +0345;CM # COMBINING GREEK YPOGEGRAMMENI +0346;CM # COMBINING BRIDGE ABOVE +0347;CM # COMBINING EQUALS SIGN BELOW +0348;CM # COMBINING DOUBLE VERTICAL LINE BELOW +0349;CM # COMBINING LEFT ANGLE BELOW +034A;CM # COMBINING NOT TILDE ABOVE +034B;CM # COMBINING HOMOTHETIC ABOVE +034C;CM # COMBINING ALMOST EQUAL TO ABOVE +034D;CM # COMBINING LEFT RIGHT ARROW BELOW +034E;CM # COMBINING UPWARDS ARROW BELOW +034F;CM # COMBINING GRAPHEME JOINER +0360;CM # COMBINING DOUBLE TILDE +0361;CM # COMBINING DOUBLE INVERTED BREVE +0362;CM # COMBINING DOUBLE RIGHTWARDS ARROW BELOW +0363;CM # COMBINING LATIN SMALL LETTER A +0364;CM # COMBINING LATIN SMALL LETTER E +0365;CM # COMBINING LATIN SMALL LETTER I +0366;CM # COMBINING LATIN SMALL LETTER O +0367;CM # COMBINING LATIN SMALL LETTER U +0368;CM # COMBINING LATIN SMALL LETTER C +0369;CM # COMBINING LATIN SMALL LETTER D +036A;CM # COMBINING LATIN SMALL LETTER H +036B;CM # COMBINING LATIN SMALL LETTER M +036C;CM # COMBINING LATIN SMALL LETTER R +036D;CM # COMBINING LATIN SMALL LETTER T +036E;CM # COMBINING LATIN SMALL LETTER V +036F;CM # COMBINING LATIN SMALL LETTER X +0374;AL # GREEK NUMERAL SIGN +0375;AL # GREEK LOWER NUMERAL SIGN +037A;AL # GREEK YPOGEGRAMMENI +037E;AL # GREEK QUESTION MARK +0384;AL # GREEK TONOS +0385;AL # GREEK DIALYTIKA TONOS +0386;AL # GREEK CAPITAL LETTER ALPHA WITH TONOS +0387;AL # GREEK ANO TELEIA +0388;AL # GREEK CAPITAL LETTER EPSILON WITH TONOS +0389;AL # GREEK CAPITAL LETTER ETA WITH TONOS +038A;AL # GREEK CAPITAL LETTER IOTA WITH TONOS +038C;AL # GREEK CAPITAL LETTER OMICRON WITH TONOS +038E;AL # GREEK CAPITAL LETTER UPSILON WITH TONOS +038F;AL # GREEK CAPITAL LETTER OMEGA WITH TONOS +0390;AL # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +0391;AI # GREEK CAPITAL LETTER ALPHA +0392;AI # GREEK CAPITAL LETTER BETA +0393;AI # GREEK CAPITAL LETTER GAMMA +0394;AI # GREEK CAPITAL LETTER DELTA +0395;AI # GREEK CAPITAL LETTER EPSILON +0396;AI # GREEK CAPITAL LETTER ZETA +0397;AI # GREEK CAPITAL LETTER ETA +0398;AI # GREEK CAPITAL LETTER THETA +0399;AI # GREEK CAPITAL LETTER IOTA +039A;AI # GREEK CAPITAL LETTER KAPPA +039B;AI # GREEK CAPITAL LETTER LAMDA +039C;AI # GREEK CAPITAL LETTER MU +039D;AI # GREEK CAPITAL LETTER NU +039E;AI # GREEK CAPITAL LETTER XI +039F;AI # GREEK CAPITAL LETTER OMICRON +03A0;AI # GREEK CAPITAL LETTER PI +03A1;AI # GREEK CAPITAL LETTER RHO +03A3;AI # GREEK CAPITAL LETTER SIGMA +03A4;AI # GREEK CAPITAL LETTER TAU +03A5;AI # GREEK CAPITAL LETTER UPSILON +03A6;AI # GREEK CAPITAL LETTER PHI +03A7;AI # GREEK CAPITAL LETTER CHI +03A8;AI # GREEK CAPITAL LETTER PSI +03A9;AI # GREEK CAPITAL LETTER OMEGA +03AA;AL # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +03AB;AL # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +03AC;AL # GREEK SMALL LETTER ALPHA WITH TONOS +03AD;AL # GREEK SMALL LETTER EPSILON WITH TONOS +03AE;AL # GREEK SMALL LETTER ETA WITH TONOS +03AF;AL # GREEK SMALL LETTER IOTA WITH TONOS +03B0;AL # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +03B1;AI # GREEK SMALL LETTER ALPHA +03B2;AI # GREEK SMALL LETTER BETA +03B3;AI # GREEK SMALL LETTER GAMMA +03B4;AI # GREEK SMALL LETTER DELTA +03B5;AI # GREEK SMALL LETTER EPSILON +03B6;AI # GREEK SMALL LETTER ZETA +03B7;AI # GREEK SMALL LETTER ETA +03B8;AI # GREEK SMALL LETTER THETA +03B9;AI # GREEK SMALL LETTER IOTA +03BA;AI # GREEK SMALL LETTER KAPPA +03BB;AI # GREEK SMALL LETTER LAMDA +03BC;AI # GREEK SMALL LETTER MU +03BD;AI # GREEK SMALL LETTER NU +03BE;AI # GREEK SMALL LETTER XI +03BF;AI # GREEK SMALL LETTER OMICRON +03C0;AI # GREEK SMALL LETTER PI +03C1;AI # GREEK SMALL LETTER RHO +03C2;AL # GREEK SMALL LETTER FINAL SIGMA +03C3;AI # GREEK SMALL LETTER SIGMA +03C4;AI # GREEK SMALL LETTER TAU +03C5;AI # GREEK SMALL LETTER UPSILON +03C6;AI # GREEK SMALL LETTER PHI +03C7;AI # GREEK SMALL LETTER CHI +03C8;AI # GREEK SMALL LETTER PSI +03C9;AI # GREEK SMALL LETTER OMEGA +03CA;AL # GREEK SMALL LETTER IOTA WITH DIALYTIKA +03CB;AL # GREEK SMALL LETTER UPSILON WITH DIALYTIKA +03CC;AL # GREEK SMALL LETTER OMICRON WITH TONOS +03CD;AL # GREEK SMALL LETTER UPSILON WITH TONOS +03CE;AL # GREEK SMALL LETTER OMEGA WITH TONOS +03D0;AL # GREEK BETA SYMBOL +03D1;AL # GREEK THETA SYMBOL +03D2;AL # GREEK UPSILON WITH HOOK SYMBOL +03D3;AL # GREEK UPSILON WITH ACUTE AND HOOK SYMBOL +03D4;AL # GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL +03D5;AL # GREEK PHI SYMBOL +03D6;AL # GREEK PI SYMBOL +03D7;AL # GREEK KAI SYMBOL +03D8;AL # GREEK LETTER ARCHAIC KOPPA +03D9;AL # GREEK SMALL LETTER ARCHAIC KOPPA +03DA;AL # GREEK LETTER STIGMA +03DB;AL # GREEK SMALL LETTER STIGMA +03DC;AL # GREEK LETTER DIGAMMA +03DD;AL # GREEK SMALL LETTER DIGAMMA +03DE;AL # GREEK LETTER KOPPA +03DF;AL # GREEK SMALL LETTER KOPPA +03E0;AL # GREEK LETTER SAMPI +03E1;AL # GREEK SMALL LETTER SAMPI +03E2;AL # COPTIC CAPITAL LETTER SHEI +03E3;AL # COPTIC SMALL LETTER SHEI +03E4;AL # COPTIC CAPITAL LETTER FEI +03E5;AL # COPTIC SMALL LETTER FEI +03E6;AL # COPTIC CAPITAL LETTER KHEI +03E7;AL # COPTIC SMALL LETTER KHEI +03E8;AL # COPTIC CAPITAL LETTER HORI +03E9;AL # COPTIC SMALL LETTER HORI +03EA;AL # COPTIC CAPITAL LETTER GANGIA +03EB;AL # COPTIC SMALL LETTER GANGIA +03EC;AL # COPTIC CAPITAL LETTER SHIMA +03ED;AL # COPTIC SMALL LETTER SHIMA +03EE;AL # COPTIC CAPITAL LETTER DEI +03EF;AL # COPTIC SMALL LETTER DEI +03F0;AL # GREEK KAPPA SYMBOL +03F1;AL # GREEK RHO SYMBOL +03F2;AL # GREEK LUNATE SIGMA SYMBOL +03F3;AL # GREEK LETTER YOT +03F4;AL # GREEK CAPITAL THETA SYMBOL +03F5;AL # GREEK LUNATE EPSILON SYMBOL +03F6;AL # GREEK REVERSED LUNATE EPSILON SYMBOL +0400;AL # CYRILLIC CAPITAL LETTER IE WITH GRAVE +0401;AI # CYRILLIC CAPITAL LETTER IO +0402;AL # CYRILLIC CAPITAL LETTER DJE +0403;AL # CYRILLIC CAPITAL LETTER GJE +0404;AL # CYRILLIC CAPITAL LETTER UKRAINIAN IE +0405;AL # CYRILLIC CAPITAL LETTER DZE +0406;AL # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +0407;AL # CYRILLIC CAPITAL LETTER YI +0408;AL # CYRILLIC CAPITAL LETTER JE +0409;AL # CYRILLIC CAPITAL LETTER LJE +040A;AL # CYRILLIC CAPITAL LETTER NJE +040B;AL # CYRILLIC CAPITAL LETTER TSHE +040C;AL # CYRILLIC CAPITAL LETTER KJE +040D;AL # CYRILLIC CAPITAL LETTER I WITH GRAVE +040E;AL # CYRILLIC CAPITAL LETTER SHORT U +040F;AL # CYRILLIC CAPITAL LETTER DZHE +0410;AI # CYRILLIC CAPITAL LETTER A +0411;AI # CYRILLIC CAPITAL LETTER BE +0412;AI # CYRILLIC CAPITAL LETTER VE +0413;AI # CYRILLIC CAPITAL LETTER GHE +0414;AI # CYRILLIC CAPITAL LETTER DE +0415;AI # CYRILLIC CAPITAL LETTER IE +0416;AI # CYRILLIC CAPITAL LETTER ZHE +0417;AI # CYRILLIC CAPITAL LETTER ZE +0418;AI # CYRILLIC CAPITAL LETTER I +0419;AI # CYRILLIC CAPITAL LETTER SHORT I +041A;AI # CYRILLIC CAPITAL LETTER KA +041B;AI # CYRILLIC CAPITAL LETTER EL +041C;AI # CYRILLIC CAPITAL LETTER EM +041D;AI # CYRILLIC CAPITAL LETTER EN +041E;AI # CYRILLIC CAPITAL LETTER O +041F;AI # CYRILLIC CAPITAL LETTER PE +0420;AI # CYRILLIC CAPITAL LETTER ER +0421;AI # CYRILLIC CAPITAL LETTER ES +0422;AI # CYRILLIC CAPITAL LETTER TE +0423;AI # CYRILLIC CAPITAL LETTER U +0424;AI # CYRILLIC CAPITAL LETTER EF +0425;AI # CYRILLIC CAPITAL LETTER HA +0426;AI # CYRILLIC CAPITAL LETTER TSE +0427;AI # CYRILLIC CAPITAL LETTER CHE +0428;AI # CYRILLIC CAPITAL LETTER SHA +0429;AI # CYRILLIC CAPITAL LETTER SHCHA +042A;AI # CYRILLIC CAPITAL LETTER HARD SIGN +042B;AI # CYRILLIC CAPITAL LETTER YERU +042C;AI # CYRILLIC CAPITAL LETTER SOFT SIGN +042D;AI # CYRILLIC CAPITAL LETTER E +042E;AI # CYRILLIC CAPITAL LETTER YU +042F;AI # CYRILLIC CAPITAL LETTER YA +0430;AI # CYRILLIC SMALL LETTER A +0431;AI # CYRILLIC SMALL LETTER BE +0432;AI # CYRILLIC SMALL LETTER VE +0433;AI # CYRILLIC SMALL LETTER GHE +0434;AI # CYRILLIC SMALL LETTER DE +0435;AI # CYRILLIC SMALL LETTER IE +0436;AI # CYRILLIC SMALL LETTER ZHE +0437;AI # CYRILLIC SMALL LETTER ZE +0438;AI # CYRILLIC SMALL LETTER I +0439;AI # CYRILLIC SMALL LETTER SHORT I +043A;AI # CYRILLIC SMALL LETTER KA +043B;AI # CYRILLIC SMALL LETTER EL +043C;AI # CYRILLIC SMALL LETTER EM +043D;AI # CYRILLIC SMALL LETTER EN +043E;AI # CYRILLIC SMALL LETTER O +043F;AI # CYRILLIC SMALL LETTER PE +0440;AI # CYRILLIC SMALL LETTER ER +0441;AI # CYRILLIC SMALL LETTER ES +0442;AI # CYRILLIC SMALL LETTER TE +0443;AI # CYRILLIC SMALL LETTER U +0444;AI # CYRILLIC SMALL LETTER EF +0445;AI # CYRILLIC SMALL LETTER HA +0446;AI # CYRILLIC SMALL LETTER TSE +0447;AI # CYRILLIC SMALL LETTER CHE +0448;AI # CYRILLIC SMALL LETTER SHA +0449;AI # CYRILLIC SMALL LETTER SHCHA +044A;AI # CYRILLIC SMALL LETTER HARD SIGN +044B;AI # CYRILLIC SMALL LETTER YERU +044C;AI # CYRILLIC SMALL LETTER SOFT SIGN +044D;AI # CYRILLIC SMALL LETTER E +044E;AI # CYRILLIC SMALL LETTER YU +044F;AI # CYRILLIC SMALL LETTER YA +0450;AL # CYRILLIC SMALL LETTER IE WITH GRAVE +0451;AI # CYRILLIC SMALL LETTER IO +0452;AL # CYRILLIC SMALL LETTER DJE +0453;AL # CYRILLIC SMALL LETTER GJE +0454;AL # CYRILLIC SMALL LETTER UKRAINIAN IE +0455;AL # CYRILLIC SMALL LETTER DZE +0456;AL # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +0457;AL # CYRILLIC SMALL LETTER YI +0458;AL # CYRILLIC SMALL LETTER JE +0459;AL # CYRILLIC SMALL LETTER LJE +045A;AL # CYRILLIC SMALL LETTER NJE +045B;AL # CYRILLIC SMALL LETTER TSHE +045C;AL # CYRILLIC SMALL LETTER KJE +045D;AL # CYRILLIC SMALL LETTER I WITH GRAVE +045E;AL # CYRILLIC SMALL LETTER SHORT U +045F;AL # CYRILLIC SMALL LETTER DZHE +0460;AL # CYRILLIC CAPITAL LETTER OMEGA +0461;AL # CYRILLIC SMALL LETTER OMEGA +0462;AL # CYRILLIC CAPITAL LETTER YAT +0463;AL # CYRILLIC SMALL LETTER YAT +0464;AL # CYRILLIC CAPITAL LETTER IOTIFIED E +0465;AL # CYRILLIC SMALL LETTER IOTIFIED E +0466;AL # CYRILLIC CAPITAL LETTER LITTLE YUS +0467;AL # CYRILLIC SMALL LETTER LITTLE YUS +0468;AL # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS +0469;AL # CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS +046A;AL # CYRILLIC CAPITAL LETTER BIG YUS +046B;AL # CYRILLIC SMALL LETTER BIG YUS +046C;AL # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS +046D;AL # CYRILLIC SMALL LETTER IOTIFIED BIG YUS +046E;AL # CYRILLIC CAPITAL LETTER KSI +046F;AL # CYRILLIC SMALL LETTER KSI +0470;AL # CYRILLIC CAPITAL LETTER PSI +0471;AL # CYRILLIC SMALL LETTER PSI +0472;AL # CYRILLIC CAPITAL LETTER FITA +0473;AL # CYRILLIC SMALL LETTER FITA +0474;AL # CYRILLIC CAPITAL LETTER IZHITSA +0475;AL # CYRILLIC SMALL LETTER IZHITSA +0476;AL # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0477;AL # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0478;AL # CYRILLIC CAPITAL LETTER UK +0479;AL # CYRILLIC SMALL LETTER UK +047A;AL # CYRILLIC CAPITAL LETTER ROUND OMEGA +047B;AL # CYRILLIC SMALL LETTER ROUND OMEGA +047C;AL # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO +047D;AL # CYRILLIC SMALL LETTER OMEGA WITH TITLO +047E;AL # CYRILLIC CAPITAL LETTER OT +047F;AL # CYRILLIC SMALL LETTER OT +0480;AL # CYRILLIC CAPITAL LETTER KOPPA +0481;AL # CYRILLIC SMALL LETTER KOPPA +0482;AL # CYRILLIC THOUSANDS SIGN +0483;CM # COMBINING CYRILLIC TITLO +0484;CM # COMBINING CYRILLIC PALATALIZATION +0485;CM # COMBINING CYRILLIC DASIA PNEUMATA +0486;CM # COMBINING CYRILLIC PSILI PNEUMATA +0488;CM # COMBINING CYRILLIC HUNDRED THOUSANDS SIGN +0489;CM # COMBINING CYRILLIC MILLIONS SIGN +048A;AL # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL +048B;AL # CYRILLIC SMALL LETTER SHORT I WITH TAIL +048C;AL # CYRILLIC CAPITAL LETTER SEMISOFT SIGN +048D;AL # CYRILLIC SMALL LETTER SEMISOFT SIGN +048E;AL # CYRILLIC CAPITAL LETTER ER WITH TICK +048F;AL # CYRILLIC SMALL LETTER ER WITH TICK +0490;AL # CYRILLIC CAPITAL LETTER GHE WITH UPTURN +0491;AL # CYRILLIC SMALL LETTER GHE WITH UPTURN +0492;AL # CYRILLIC CAPITAL LETTER GHE WITH STROKE +0493;AL # CYRILLIC SMALL LETTER GHE WITH STROKE +0494;AL # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK +0495;AL # CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK +0496;AL # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER +0497;AL # CYRILLIC SMALL LETTER ZHE WITH DESCENDER +0498;AL # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER +0499;AL # CYRILLIC SMALL LETTER ZE WITH DESCENDER +049A;AL # CYRILLIC CAPITAL LETTER KA WITH DESCENDER +049B;AL # CYRILLIC SMALL LETTER KA WITH DESCENDER +049C;AL # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE +049D;AL # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE +049E;AL # CYRILLIC CAPITAL LETTER KA WITH STROKE +049F;AL # CYRILLIC SMALL LETTER KA WITH STROKE +04A0;AL # CYRILLIC CAPITAL LETTER BASHKIR KA +04A1;AL # CYRILLIC SMALL LETTER BASHKIR KA +04A2;AL # CYRILLIC CAPITAL LETTER EN WITH DESCENDER +04A3;AL # CYRILLIC SMALL LETTER EN WITH DESCENDER +04A4;AL # CYRILLIC CAPITAL LIGATURE EN GHE +04A5;AL # CYRILLIC SMALL LIGATURE EN GHE +04A6;AL # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK +04A7;AL # CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK +04A8;AL # CYRILLIC CAPITAL LETTER ABKHASIAN HA +04A9;AL # CYRILLIC SMALL LETTER ABKHASIAN HA +04AA;AL # CYRILLIC CAPITAL LETTER ES WITH DESCENDER +04AB;AL # CYRILLIC SMALL LETTER ES WITH DESCENDER +04AC;AL # CYRILLIC CAPITAL LETTER TE WITH DESCENDER +04AD;AL # CYRILLIC SMALL LETTER TE WITH DESCENDER +04AE;AL # CYRILLIC CAPITAL LETTER STRAIGHT U +04AF;AL # CYRILLIC SMALL LETTER STRAIGHT U +04B0;AL # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE +04B1;AL # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE +04B2;AL # CYRILLIC CAPITAL LETTER HA WITH DESCENDER +04B3;AL # CYRILLIC SMALL LETTER HA WITH DESCENDER +04B4;AL # CYRILLIC CAPITAL LIGATURE TE TSE +04B5;AL # CYRILLIC SMALL LIGATURE TE TSE +04B6;AL # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER +04B7;AL # CYRILLIC SMALL LETTER CHE WITH DESCENDER +04B8;AL # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE +04B9;AL # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE +04BA;AL # CYRILLIC CAPITAL LETTER SHHA +04BB;AL # CYRILLIC SMALL LETTER SHHA +04BC;AL # CYRILLIC CAPITAL LETTER ABKHASIAN CHE +04BD;AL # CYRILLIC SMALL LETTER ABKHASIAN CHE +04BE;AL # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER +04BF;AL # CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER +04C0;AL # CYRILLIC LETTER PALOCHKA +04C1;AL # CYRILLIC CAPITAL LETTER ZHE WITH BREVE +04C2;AL # CYRILLIC SMALL LETTER ZHE WITH BREVE +04C3;AL # CYRILLIC CAPITAL LETTER KA WITH HOOK +04C4;AL # CYRILLIC SMALL LETTER KA WITH HOOK +04C5;AL # CYRILLIC CAPITAL LETTER EL WITH TAIL +04C6;AL # CYRILLIC SMALL LETTER EL WITH TAIL +04C7;AL # CYRILLIC CAPITAL LETTER EN WITH HOOK +04C8;AL # CYRILLIC SMALL LETTER EN WITH HOOK +04C9;AL # CYRILLIC CAPITAL LETTER EN WITH TAIL +04CA;AL # CYRILLIC SMALL LETTER EN WITH TAIL +04CB;AL # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE +04CC;AL # CYRILLIC SMALL LETTER KHAKASSIAN CHE +04CD;AL # CYRILLIC CAPITAL LETTER EM WITH TAIL +04CE;AL # CYRILLIC SMALL LETTER EM WITH TAIL +04D0;AL # CYRILLIC CAPITAL LETTER A WITH BREVE +04D1;AL # CYRILLIC SMALL LETTER A WITH BREVE +04D2;AL # CYRILLIC CAPITAL LETTER A WITH DIAERESIS +04D3;AL # CYRILLIC SMALL LETTER A WITH DIAERESIS +04D4;AL # CYRILLIC CAPITAL LIGATURE A IE +04D5;AL # CYRILLIC SMALL LIGATURE A IE +04D6;AL # CYRILLIC CAPITAL LETTER IE WITH BREVE +04D7;AL # CYRILLIC SMALL LETTER IE WITH BREVE +04D8;AL # CYRILLIC CAPITAL LETTER SCHWA +04D9;AL # CYRILLIC SMALL LETTER SCHWA +04DA;AL # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS +04DB;AL # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS +04DC;AL # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS +04DD;AL # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS +04DE;AL # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS +04DF;AL # CYRILLIC SMALL LETTER ZE WITH DIAERESIS +04E0;AL # CYRILLIC CAPITAL LETTER ABKHASIAN DZE +04E1;AL # CYRILLIC SMALL LETTER ABKHASIAN DZE +04E2;AL # CYRILLIC CAPITAL LETTER I WITH MACRON +04E3;AL # CYRILLIC SMALL LETTER I WITH MACRON +04E4;AL # CYRILLIC CAPITAL LETTER I WITH DIAERESIS +04E5;AL # CYRILLIC SMALL LETTER I WITH DIAERESIS +04E6;AL # CYRILLIC CAPITAL LETTER O WITH DIAERESIS +04E7;AL # CYRILLIC SMALL LETTER O WITH DIAERESIS +04E8;AL # CYRILLIC CAPITAL LETTER BARRED O +04E9;AL # CYRILLIC SMALL LETTER BARRED O +04EA;AL # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS +04EB;AL # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS +04EC;AL # CYRILLIC CAPITAL LETTER E WITH DIAERESIS +04ED;AL # CYRILLIC SMALL LETTER E WITH DIAERESIS +04EE;AL # CYRILLIC CAPITAL LETTER U WITH MACRON +04EF;AL # CYRILLIC SMALL LETTER U WITH MACRON +04F0;AL # CYRILLIC CAPITAL LETTER U WITH DIAERESIS +04F1;AL # CYRILLIC SMALL LETTER U WITH DIAERESIS +04F2;AL # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE +04F3;AL # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE +04F4;AL # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS +04F5;AL # CYRILLIC SMALL LETTER CHE WITH DIAERESIS +04F8;AL # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS +04F9;AL # CYRILLIC SMALL LETTER YERU WITH DIAERESIS +0500;AL # CYRILLIC CAPITAL LETTER KOMI DE +0501;AL # CYRILLIC SMALL LETTER KOMI DE +0502;AL # CYRILLIC CAPITAL LETTER KOMI DJE +0503;AL # CYRILLIC SMALL LETTER KOMI DJE +0504;AL # CYRILLIC CAPITAL LETTER KOMI ZJE +0505;AL # CYRILLIC SMALL LETTER KOMI ZJE +0506;AL # CYRILLIC CAPITAL LETTER KOMI DZJE +0507;AL # CYRILLIC SMALL LETTER KOMI DZJE +0508;AL # CYRILLIC CAPITAL LETTER KOMI LJE +0509;AL # CYRILLIC SMALL LETTER KOMI LJE +050A;AL # CYRILLIC CAPITAL LETTER KOMI NJE +050B;AL # CYRILLIC SMALL LETTER KOMI NJE +050C;AL # CYRILLIC CAPITAL LETTER KOMI SJE +050D;AL # CYRILLIC SMALL LETTER KOMI SJE +050E;AL # CYRILLIC CAPITAL LETTER KOMI TJE +050F;AL # CYRILLIC SMALL LETTER KOMI TJE +0531;AL # ARMENIAN CAPITAL LETTER AYB +0532;AL # ARMENIAN CAPITAL LETTER BEN +0533;AL # ARMENIAN CAPITAL LETTER GIM +0534;AL # ARMENIAN CAPITAL LETTER DA +0535;AL # ARMENIAN CAPITAL LETTER ECH +0536;AL # ARMENIAN CAPITAL LETTER ZA +0537;AL # ARMENIAN CAPITAL LETTER EH +0538;AL # ARMENIAN CAPITAL LETTER ET +0539;AL # ARMENIAN CAPITAL LETTER TO +053A;AL # ARMENIAN CAPITAL LETTER ZHE +053B;AL # ARMENIAN CAPITAL LETTER INI +053C;AL # ARMENIAN CAPITAL LETTER LIWN +053D;AL # ARMENIAN CAPITAL LETTER XEH +053E;AL # ARMENIAN CAPITAL LETTER CA +053F;AL # ARMENIAN CAPITAL LETTER KEN +0540;AL # ARMENIAN CAPITAL LETTER HO +0541;AL # ARMENIAN CAPITAL LETTER JA +0542;AL # ARMENIAN CAPITAL LETTER GHAD +0543;AL # ARMENIAN CAPITAL LETTER CHEH +0544;AL # ARMENIAN CAPITAL LETTER MEN +0545;AL # ARMENIAN CAPITAL LETTER YI +0546;AL # ARMENIAN CAPITAL LETTER NOW +0547;AL # ARMENIAN CAPITAL LETTER SHA +0548;AL # ARMENIAN CAPITAL LETTER VO +0549;AL # ARMENIAN CAPITAL LETTER CHA +054A;AL # ARMENIAN CAPITAL LETTER PEH +054B;AL # ARMENIAN CAPITAL LETTER JHEH +054C;AL # ARMENIAN CAPITAL LETTER RA +054D;AL # ARMENIAN CAPITAL LETTER SEH +054E;AL # ARMENIAN CAPITAL LETTER VEW +054F;AL # ARMENIAN CAPITAL LETTER TIWN +0550;AL # ARMENIAN CAPITAL LETTER REH +0551;AL # ARMENIAN CAPITAL LETTER CO +0552;AL # ARMENIAN CAPITAL LETTER YIWN +0553;AL # ARMENIAN CAPITAL LETTER PIWR +0554;AL # ARMENIAN CAPITAL LETTER KEH +0555;AL # ARMENIAN CAPITAL LETTER OH +0556;AL # ARMENIAN CAPITAL LETTER FEH +0559;AL # ARMENIAN MODIFIER LETTER LEFT HALF RING +055A;AL # ARMENIAN APOSTROPHE +055B;AL # ARMENIAN EMPHASIS MARK +055C;AL # ARMENIAN EXCLAMATION MARK +055D;AL # ARMENIAN COMMA +055E;AL # ARMENIAN QUESTION MARK +055F;AL # ARMENIAN ABBREVIATION MARK +0561;AL # ARMENIAN SMALL LETTER AYB +0562;AL # ARMENIAN SMALL LETTER BEN +0563;AL # ARMENIAN SMALL LETTER GIM +0564;AL # ARMENIAN SMALL LETTER DA +0565;AL # ARMENIAN SMALL LETTER ECH +0566;AL # ARMENIAN SMALL LETTER ZA +0567;AL # ARMENIAN SMALL LETTER EH +0568;AL # ARMENIAN SMALL LETTER ET +0569;AL # ARMENIAN SMALL LETTER TO +056A;AL # ARMENIAN SMALL LETTER ZHE +056B;AL # ARMENIAN SMALL LETTER INI +056C;AL # ARMENIAN SMALL LETTER LIWN +056D;AL # ARMENIAN SMALL LETTER XEH +056E;AL # ARMENIAN SMALL LETTER CA +056F;AL # ARMENIAN SMALL LETTER KEN +0570;AL # ARMENIAN SMALL LETTER HO +0571;AL # ARMENIAN SMALL LETTER JA +0572;AL # ARMENIAN SMALL LETTER GHAD +0573;AL # ARMENIAN SMALL LETTER CHEH +0574;AL # ARMENIAN SMALL LETTER MEN +0575;AL # ARMENIAN SMALL LETTER YI +0576;AL # ARMENIAN SMALL LETTER NOW +0577;AL # ARMENIAN SMALL LETTER SHA +0578;AL # ARMENIAN SMALL LETTER VO +0579;AL # ARMENIAN SMALL LETTER CHA +057A;AL # ARMENIAN SMALL LETTER PEH +057B;AL # ARMENIAN SMALL LETTER JHEH +057C;AL # ARMENIAN SMALL LETTER RA +057D;AL # ARMENIAN SMALL LETTER SEH +057E;AL # ARMENIAN SMALL LETTER VEW +057F;AL # ARMENIAN SMALL LETTER TIWN +0580;AL # ARMENIAN SMALL LETTER REH +0581;AL # ARMENIAN SMALL LETTER CO +0582;AL # ARMENIAN SMALL LETTER YIWN +0583;AL # ARMENIAN SMALL LETTER PIWR +0584;AL # ARMENIAN SMALL LETTER KEH +0585;AL # ARMENIAN SMALL LETTER OH +0586;AL # ARMENIAN SMALL LETTER FEH +0587;AL # ARMENIAN SMALL LIGATURE ECH YIWN +0589;IS # ARMENIAN FULL STOP +058A;BA # ARMENIAN HYPHEN +0591;CM # HEBREW ACCENT ETNAHTA +0592;CM # HEBREW ACCENT SEGOL +0593;CM # HEBREW ACCENT SHALSHELET +0594;CM # HEBREW ACCENT ZAQEF QATAN +0595;CM # HEBREW ACCENT ZAQEF GADOL +0596;CM # HEBREW ACCENT TIPEHA +0597;CM # HEBREW ACCENT REVIA +0598;CM # HEBREW ACCENT ZARQA +0599;CM # HEBREW ACCENT PASHTA +059A;CM # HEBREW ACCENT YETIV +059B;CM # HEBREW ACCENT TEVIR +059C;CM # HEBREW ACCENT GERESH +059D;CM # HEBREW ACCENT GERESH MUQDAM +059E;CM # HEBREW ACCENT GERSHAYIM +059F;CM # HEBREW ACCENT QARNEY PARA +05A0;CM # HEBREW ACCENT TELISHA GEDOLA +05A1;CM # HEBREW ACCENT PAZER +05A3;CM # HEBREW ACCENT MUNAH +05A4;CM # HEBREW ACCENT MAHAPAKH +05A5;CM # HEBREW ACCENT MERKHA +05A6;CM # HEBREW ACCENT MERKHA KEFULA +05A7;CM # HEBREW ACCENT DARGA +05A8;CM # HEBREW ACCENT QADMA +05A9;CM # HEBREW ACCENT TELISHA QETANA +05AA;CM # HEBREW ACCENT YERAH BEN YOMO +05AB;CM # HEBREW ACCENT OLE +05AC;CM # HEBREW ACCENT ILUY +05AD;CM # HEBREW ACCENT DEHI +05AE;CM # HEBREW ACCENT ZINOR +05AF;CM # HEBREW MARK MASORA CIRCLE +05B0;CM # HEBREW POINT SHEVA +05B1;CM # HEBREW POINT HATAF SEGOL +05B2;CM # HEBREW POINT HATAF PATAH +05B3;CM # HEBREW POINT HATAF QAMATS +05B4;CM # HEBREW POINT HIRIQ +05B5;CM # HEBREW POINT TSERE +05B6;CM # HEBREW POINT SEGOL +05B7;CM # HEBREW POINT PATAH +05B8;CM # HEBREW POINT QAMATS +05B9;CM # HEBREW POINT HOLAM +05BB;CM # HEBREW POINT QUBUTS +05BC;CM # HEBREW POINT DAGESH OR MAPIQ +05BD;CM # HEBREW POINT METEG +05BE;AL # HEBREW PUNCTUATION MAQAF +05BF;CM # HEBREW POINT RAFE +05C0;AL # HEBREW PUNCTUATION PASEQ +05C1;CM # HEBREW POINT SHIN DOT +05C2;CM # HEBREW POINT SIN DOT +05C3;AL # HEBREW PUNCTUATION SOF PASUQ +05C4;CM # HEBREW MARK UPPER DOT +05D0;AL # HEBREW LETTER ALEF +05D1;AL # HEBREW LETTER BET +05D2;AL # HEBREW LETTER GIMEL +05D3;AL # HEBREW LETTER DALET +05D4;AL # HEBREW LETTER HE +05D5;AL # HEBREW LETTER VAV +05D6;AL # HEBREW LETTER ZAYIN +05D7;AL # HEBREW LETTER HET +05D8;AL # HEBREW LETTER TET +05D9;AL # HEBREW LETTER YOD +05DA;AL # HEBREW LETTER FINAL KAF +05DB;AL # HEBREW LETTER KAF +05DC;AL # HEBREW LETTER LAMED +05DD;AL # HEBREW LETTER FINAL MEM +05DE;AL # HEBREW LETTER MEM +05DF;AL # HEBREW LETTER FINAL NUN +05E0;AL # HEBREW LETTER NUN +05E1;AL # HEBREW LETTER SAMEKH +05E2;AL # HEBREW LETTER AYIN +05E3;AL # HEBREW LETTER FINAL PE +05E4;AL # HEBREW LETTER PE +05E5;AL # HEBREW LETTER FINAL TSADI +05E6;AL # HEBREW LETTER TSADI +05E7;AL # HEBREW LETTER QOF +05E8;AL # HEBREW LETTER RESH +05E9;AL # HEBREW LETTER SHIN +05EA;AL # HEBREW LETTER TAV +05F0;AL # HEBREW LIGATURE YIDDISH DOUBLE VAV +05F1;AL # HEBREW LIGATURE YIDDISH VAV YOD +05F2;AL # HEBREW LIGATURE YIDDISH DOUBLE YOD +05F3;AL # HEBREW PUNCTUATION GERESH +05F4;AL # HEBREW PUNCTUATION GERSHAYIM +060C;AL # ARABIC COMMA +061B;AL # ARABIC SEMICOLON +061F;AL # ARABIC QUESTION MARK +0621;AL # ARABIC LETTER HAMZA +0622;AL # ARABIC LETTER ALEF WITH MADDA ABOVE +0623;AL # ARABIC LETTER ALEF WITH HAMZA ABOVE +0624;AL # ARABIC LETTER WAW WITH HAMZA ABOVE +0625;AL # ARABIC LETTER ALEF WITH HAMZA BELOW +0626;AL # ARABIC LETTER YEH WITH HAMZA ABOVE +0627;AL # ARABIC LETTER ALEF +0628;AL # ARABIC LETTER BEH +0629;AL # ARABIC LETTER TEH MARBUTA +062A;AL # ARABIC LETTER TEH +062B;AL # ARABIC LETTER THEH +062C;AL # ARABIC LETTER JEEM +062D;AL # ARABIC LETTER HAH +062E;AL # ARABIC LETTER KHAH +062F;AL # ARABIC LETTER DAL +0630;AL # ARABIC LETTER THAL +0631;AL # ARABIC LETTER REH +0632;AL # ARABIC LETTER ZAIN +0633;AL # ARABIC LETTER SEEN +0634;AL # ARABIC LETTER SHEEN +0635;AL # ARABIC LETTER SAD +0636;AL # ARABIC LETTER DAD +0637;AL # ARABIC LETTER TAH +0638;AL # ARABIC LETTER ZAH +0639;AL # ARABIC LETTER AIN +063A;AL # ARABIC LETTER GHAIN +0640;AL # ARABIC TATWEEL +0641;AL # ARABIC LETTER FEH +0642;AL # ARABIC LETTER QAF +0643;AL # ARABIC LETTER KAF +0644;AL # ARABIC LETTER LAM +0645;AL # ARABIC LETTER MEEM +0646;AL # ARABIC LETTER NOON +0647;AL # ARABIC LETTER HEH +0648;AL # ARABIC LETTER WAW +0649;AL # ARABIC LETTER ALEF MAKSURA +064A;AL # ARABIC LETTER YEH +064B;CM # ARABIC FATHATAN +064C;CM # ARABIC DAMMATAN +064D;CM # ARABIC KASRATAN +064E;CM # ARABIC FATHA +064F;CM # ARABIC DAMMA +0650;CM # ARABIC KASRA +0651;CM # ARABIC SHADDA +0652;CM # ARABIC SUKUN +0653;CM # ARABIC MADDAH ABOVE +0654;CM # ARABIC HAMZA ABOVE +0655;CM # ARABIC HAMZA BELOW +0660;NU # ARABIC-INDIC DIGIT ZERO +0661;NU # ARABIC-INDIC DIGIT ONE +0662;NU # ARABIC-INDIC DIGIT TWO +0663;NU # ARABIC-INDIC DIGIT THREE +0664;NU # ARABIC-INDIC DIGIT FOUR +0665;NU # ARABIC-INDIC DIGIT FIVE +0666;NU # ARABIC-INDIC DIGIT SIX +0667;NU # ARABIC-INDIC DIGIT SEVEN +0668;NU # ARABIC-INDIC DIGIT EIGHT +0669;NU # ARABIC-INDIC DIGIT NINE +066A;AL # ARABIC PERCENT SIGN +066B;AL # ARABIC DECIMAL SEPARATOR +066C;AL # ARABIC THOUSANDS SEPARATOR +066D;AL # ARABIC FIVE POINTED STAR +066E;AL # ARABIC LETTER DOTLESS BEH +066F;AL # ARABIC LETTER DOTLESS QAF +0670;CM # ARABIC LETTER SUPERSCRIPT ALEF +0671;AL # ARABIC LETTER ALEF WASLA +0672;AL # ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE +0673;AL # ARABIC LETTER ALEF WITH WAVY HAMZA BELOW +0674;AL # ARABIC LETTER HIGH HAMZA +0675;AL # ARABIC LETTER HIGH HAMZA ALEF +0676;AL # ARABIC LETTER HIGH HAMZA WAW +0677;AL # ARABIC LETTER U WITH HAMZA ABOVE +0678;AL # ARABIC LETTER HIGH HAMZA YEH +0679;AL # ARABIC LETTER TTEH +067A;AL # ARABIC LETTER TTEHEH +067B;AL # ARABIC LETTER BEEH +067C;AL # ARABIC LETTER TEH WITH RING +067D;AL # ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS +067E;AL # ARABIC LETTER PEH +067F;AL # ARABIC LETTER TEHEH +0680;AL # ARABIC LETTER BEHEH +0681;AL # ARABIC LETTER HAH WITH HAMZA ABOVE +0682;AL # ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE +0683;AL # ARABIC LETTER NYEH +0684;AL # ARABIC LETTER DYEH +0685;AL # ARABIC LETTER HAH WITH THREE DOTS ABOVE +0686;AL # ARABIC LETTER TCHEH +0687;AL # ARABIC LETTER TCHEHEH +0688;AL # ARABIC LETTER DDAL +0689;AL # ARABIC LETTER DAL WITH RING +068A;AL # ARABIC LETTER DAL WITH DOT BELOW +068B;AL # ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH +068C;AL # ARABIC LETTER DAHAL +068D;AL # ARABIC LETTER DDAHAL +068E;AL # ARABIC LETTER DUL +068F;AL # ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS +0690;AL # ARABIC LETTER DAL WITH FOUR DOTS ABOVE +0691;AL # ARABIC LETTER RREH +0692;AL # ARABIC LETTER REH WITH SMALL V +0693;AL # ARABIC LETTER REH WITH RING +0694;AL # ARABIC LETTER REH WITH DOT BELOW +0695;AL # ARABIC LETTER REH WITH SMALL V BELOW +0696;AL # ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE +0697;AL # ARABIC LETTER REH WITH TWO DOTS ABOVE +0698;AL # ARABIC LETTER JEH +0699;AL # ARABIC LETTER REH WITH FOUR DOTS ABOVE +069A;AL # ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE +069B;AL # ARABIC LETTER SEEN WITH THREE DOTS BELOW +069C;AL # ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE +069D;AL # ARABIC LETTER SAD WITH TWO DOTS BELOW +069E;AL # ARABIC LETTER SAD WITH THREE DOTS ABOVE +069F;AL # ARABIC LETTER TAH WITH THREE DOTS ABOVE +06A0;AL # ARABIC LETTER AIN WITH THREE DOTS ABOVE +06A1;AL # ARABIC LETTER DOTLESS FEH +06A2;AL # ARABIC LETTER FEH WITH DOT MOVED BELOW +06A3;AL # ARABIC LETTER FEH WITH DOT BELOW +06A4;AL # ARABIC LETTER VEH +06A5;AL # ARABIC LETTER FEH WITH THREE DOTS BELOW +06A6;AL # ARABIC LETTER PEHEH +06A7;AL # ARABIC LETTER QAF WITH DOT ABOVE +06A8;AL # ARABIC LETTER QAF WITH THREE DOTS ABOVE +06A9;AL # ARABIC LETTER KEHEH +06AA;AL # ARABIC LETTER SWASH KAF +06AB;AL # ARABIC LETTER KAF WITH RING +06AC;AL # ARABIC LETTER KAF WITH DOT ABOVE +06AD;AL # ARABIC LETTER NG +06AE;AL # ARABIC LETTER KAF WITH THREE DOTS BELOW +06AF;AL # ARABIC LETTER GAF +06B0;AL # ARABIC LETTER GAF WITH RING +06B1;AL # ARABIC LETTER NGOEH +06B2;AL # ARABIC LETTER GAF WITH TWO DOTS BELOW +06B3;AL # ARABIC LETTER GUEH +06B4;AL # ARABIC LETTER GAF WITH THREE DOTS ABOVE +06B5;AL # ARABIC LETTER LAM WITH SMALL V +06B6;AL # ARABIC LETTER LAM WITH DOT ABOVE +06B7;AL # ARABIC LETTER LAM WITH THREE DOTS ABOVE +06B8;AL # ARABIC LETTER LAM WITH THREE DOTS BELOW +06B9;AL # ARABIC LETTER NOON WITH DOT BELOW +06BA;AL # ARABIC LETTER NOON GHUNNA +06BB;AL # ARABIC LETTER RNOON +06BC;AL # ARABIC LETTER NOON WITH RING +06BD;AL # ARABIC LETTER NOON WITH THREE DOTS ABOVE +06BE;AL # ARABIC LETTER HEH DOACHASHMEE +06BF;AL # ARABIC LETTER TCHEH WITH DOT ABOVE +06C0;AL # ARABIC LETTER HEH WITH YEH ABOVE +06C1;AL # ARABIC LETTER HEH GOAL +06C2;AL # ARABIC LETTER HEH GOAL WITH HAMZA ABOVE +06C3;AL # ARABIC LETTER TEH MARBUTA GOAL +06C4;AL # ARABIC LETTER WAW WITH RING +06C5;AL # ARABIC LETTER KIRGHIZ OE +06C6;AL # ARABIC LETTER OE +06C7;AL # ARABIC LETTER U +06C8;AL # ARABIC LETTER YU +06C9;AL # ARABIC LETTER KIRGHIZ YU +06CA;AL # ARABIC LETTER WAW WITH TWO DOTS ABOVE +06CB;AL # ARABIC LETTER VE +06CC;AL # ARABIC LETTER FARSI YEH +06CD;AL # ARABIC LETTER YEH WITH TAIL +06CE;AL # ARABIC LETTER YEH WITH SMALL V +06CF;AL # ARABIC LETTER WAW WITH DOT ABOVE +06D0;AL # ARABIC LETTER E +06D1;AL # ARABIC LETTER YEH WITH THREE DOTS BELOW +06D2;AL # ARABIC LETTER YEH BARREE +06D3;AL # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D4;AL # ARABIC FULL STOP +06D5;AL # ARABIC LETTER AE +06D6;CM # ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA +06D7;CM # ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA +06D8;CM # ARABIC SMALL HIGH MEEM INITIAL FORM +06D9;CM # ARABIC SMALL HIGH LAM ALEF +06DA;CM # ARABIC SMALL HIGH JEEM +06DB;CM # ARABIC SMALL HIGH THREE DOTS +06DC;CM # ARABIC SMALL HIGH SEEN +06DD;CM # ARABIC END OF AYAH +06DE;CM # ARABIC START OF RUB EL HIZB +06DF;CM # ARABIC SMALL HIGH ROUNDED ZERO +06E0;CM # ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO +06E1;CM # ARABIC SMALL HIGH DOTLESS HEAD OF KHAH +06E2;CM # ARABIC SMALL HIGH MEEM ISOLATED FORM +06E3;CM # ARABIC SMALL LOW SEEN +06E4;CM # ARABIC SMALL HIGH MADDA +06E5;AL # ARABIC SMALL WAW +06E6;AL # ARABIC SMALL YEH +06E7;CM # ARABIC SMALL HIGH YEH +06E8;CM # ARABIC SMALL HIGH NOON +06E9;AL # ARABIC PLACE OF SAJDAH +06EA;CM # ARABIC EMPTY CENTRE LOW STOP +06EB;CM # ARABIC EMPTY CENTRE HIGH STOP +06EC;CM # ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE +06ED;CM # ARABIC SMALL LOW MEEM +06F0;NU # EXTENDED ARABIC-INDIC DIGIT ZERO +06F1;NU # EXTENDED ARABIC-INDIC DIGIT ONE +06F2;NU # EXTENDED ARABIC-INDIC DIGIT TWO +06F3;NU # EXTENDED ARABIC-INDIC DIGIT THREE +06F4;NU # EXTENDED ARABIC-INDIC DIGIT FOUR +06F5;NU # EXTENDED ARABIC-INDIC DIGIT FIVE +06F6;NU # EXTENDED ARABIC-INDIC DIGIT SIX +06F7;NU # EXTENDED ARABIC-INDIC DIGIT SEVEN +06F8;NU # EXTENDED ARABIC-INDIC DIGIT EIGHT +06F9;NU # EXTENDED ARABIC-INDIC DIGIT NINE +06FA;AL # ARABIC LETTER SHEEN WITH DOT BELOW +06FB;AL # ARABIC LETTER DAD WITH DOT BELOW +06FC;AL # ARABIC LETTER GHAIN WITH DOT BELOW +06FD;AL # ARABIC SIGN SINDHI AMPERSAND +06FE;AL # ARABIC SIGN SINDHI POSTPOSITION MEN +0700;AL # SYRIAC END OF PARAGRAPH +0701;AL # SYRIAC SUPRALINEAR FULL STOP +0702;AL # SYRIAC SUBLINEAR FULL STOP +0703;AL # SYRIAC SUPRALINEAR COLON +0704;AL # SYRIAC SUBLINEAR COLON +0705;AL # SYRIAC HORIZONTAL COLON +0706;AL # SYRIAC COLON SKEWED LEFT +0707;AL # SYRIAC COLON SKEWED RIGHT +0708;AL # SYRIAC SUPRALINEAR COLON SKEWED LEFT +0709;AL # SYRIAC SUBLINEAR COLON SKEWED RIGHT +070A;AL # SYRIAC CONTRACTION +070B;AL # SYRIAC HARKLEAN OBELUS +070C;AL # SYRIAC HARKLEAN METOBELUS +070D;AL # SYRIAC HARKLEAN ASTERISCUS +070F;CM # SYRIAC ABBREVIATION MARK +0710;AL # SYRIAC LETTER ALAPH +0711;CM # SYRIAC LETTER SUPERSCRIPT ALAPH +0712;AL # SYRIAC LETTER BETH +0713;AL # SYRIAC LETTER GAMAL +0714;AL # SYRIAC LETTER GAMAL GARSHUNI +0715;AL # SYRIAC LETTER DALATH +0716;AL # SYRIAC LETTER DOTLESS DALATH RISH +0717;AL # SYRIAC LETTER HE +0718;AL # SYRIAC LETTER WAW +0719;AL # SYRIAC LETTER ZAIN +071A;AL # SYRIAC LETTER HETH +071B;AL # SYRIAC LETTER TETH +071C;AL # SYRIAC LETTER TETH GARSHUNI +071D;AL # SYRIAC LETTER YUDH +071E;AL # SYRIAC LETTER YUDH HE +071F;AL # SYRIAC LETTER KAPH +0720;AL # SYRIAC LETTER LAMADH +0721;AL # SYRIAC LETTER MIM +0722;AL # SYRIAC LETTER NUN +0723;AL # SYRIAC LETTER SEMKATH +0724;AL # SYRIAC LETTER FINAL SEMKATH +0725;AL # SYRIAC LETTER E +0726;AL # SYRIAC LETTER PE +0727;AL # SYRIAC LETTER REVERSED PE +0728;AL # SYRIAC LETTER SADHE +0729;AL # SYRIAC LETTER QAPH +072A;AL # SYRIAC LETTER RISH +072B;AL # SYRIAC LETTER SHIN +072C;AL # SYRIAC LETTER TAW +0730;CM # SYRIAC PTHAHA ABOVE +0731;CM # SYRIAC PTHAHA BELOW +0732;CM # SYRIAC PTHAHA DOTTED +0733;CM # SYRIAC ZQAPHA ABOVE +0734;CM # SYRIAC ZQAPHA BELOW +0735;CM # SYRIAC ZQAPHA DOTTED +0736;CM # SYRIAC RBASA ABOVE +0737;CM # SYRIAC RBASA BELOW +0738;CM # SYRIAC DOTTED ZLAMA HORIZONTAL +0739;CM # SYRIAC DOTTED ZLAMA ANGULAR +073A;CM # SYRIAC HBASA ABOVE +073B;CM # SYRIAC HBASA BELOW +073C;CM # SYRIAC HBASA-ESASA DOTTED +073D;CM # SYRIAC ESASA ABOVE +073E;CM # SYRIAC ESASA BELOW +073F;CM # SYRIAC RWAHA +0740;CM # SYRIAC FEMININE DOT +0741;CM # SYRIAC QUSHSHAYA +0742;CM # SYRIAC RUKKAKHA +0743;CM # SYRIAC TWO VERTICAL DOTS ABOVE +0744;CM # SYRIAC TWO VERTICAL DOTS BELOW +0745;CM # SYRIAC THREE DOTS ABOVE +0746;CM # SYRIAC THREE DOTS BELOW +0747;CM # SYRIAC OBLIQUE LINE ABOVE +0748;CM # SYRIAC OBLIQUE LINE BELOW +0749;CM # SYRIAC MUSIC +074A;CM # SYRIAC BARREKH +0780;AL # THAANA LETTER HAA +0781;AL # THAANA LETTER SHAVIYANI +0782;AL # THAANA LETTER NOONU +0783;AL # THAANA LETTER RAA +0784;AL # THAANA LETTER BAA +0785;AL # THAANA LETTER LHAVIYANI +0786;AL # THAANA LETTER KAAFU +0787;AL # THAANA LETTER ALIFU +0788;AL # THAANA LETTER VAAVU +0789;AL # THAANA LETTER MEEMU +078A;AL # THAANA LETTER FAAFU +078B;AL # THAANA LETTER DHAALU +078C;AL # THAANA LETTER THAA +078D;AL # THAANA LETTER LAAMU +078E;AL # THAANA LETTER GAAFU +078F;AL # THAANA LETTER GNAVIYANI +0790;AL # THAANA LETTER SEENU +0791;AL # THAANA LETTER DAVIYANI +0792;AL # THAANA LETTER ZAVIYANI +0793;AL # THAANA LETTER TAVIYANI +0794;AL # THAANA LETTER YAA +0795;AL # THAANA LETTER PAVIYANI +0796;AL # THAANA LETTER JAVIYANI +0797;AL # THAANA LETTER CHAVIYANI +0798;AL # THAANA LETTER TTAA +0799;AL # THAANA LETTER HHAA +079A;AL # THAANA LETTER KHAA +079B;AL # THAANA LETTER THAALU +079C;AL # THAANA LETTER ZAA +079D;AL # THAANA LETTER SHEENU +079E;AL # THAANA LETTER SAADHU +079F;AL # THAANA LETTER DAADHU +07A0;AL # THAANA LETTER TO +07A1;AL # THAANA LETTER ZO +07A2;AL # THAANA LETTER AINU +07A3;AL # THAANA LETTER GHAINU +07A4;AL # THAANA LETTER QAAFU +07A5;AL # THAANA LETTER WAAVU +07A6;CM # THAANA ABAFILI +07A7;CM # THAANA AABAAFILI +07A8;CM # THAANA IBIFILI +07A9;CM # THAANA EEBEEFILI +07AA;CM # THAANA UBUFILI +07AB;CM # THAANA OOBOOFILI +07AC;CM # THAANA EBEFILI +07AD;CM # THAANA EYBEYFILI +07AE;CM # THAANA OBOFILI +07AF;CM # THAANA OABOAFILI +07B0;CM # THAANA SUKUN +07B1;AL # THAANA LETTER NAA +0901;CM # DEVANAGARI SIGN CANDRABINDU +0902;CM # DEVANAGARI SIGN ANUSVARA +0903;CM # DEVANAGARI SIGN VISARGA +0905;AL # DEVANAGARI LETTER A +0906;AL # DEVANAGARI LETTER AA +0907;AL # DEVANAGARI LETTER I +0908;AL # DEVANAGARI LETTER II +0909;AL # DEVANAGARI LETTER U +090A;AL # DEVANAGARI LETTER UU +090B;AL # DEVANAGARI LETTER VOCALIC R +090C;AL # DEVANAGARI LETTER VOCALIC L +090D;AL # DEVANAGARI LETTER CANDRA E +090E;AL # DEVANAGARI LETTER SHORT E +090F;AL # DEVANAGARI LETTER E +0910;AL # DEVANAGARI LETTER AI +0911;AL # DEVANAGARI LETTER CANDRA O +0912;AL # DEVANAGARI LETTER SHORT O +0913;AL # DEVANAGARI LETTER O +0914;AL # DEVANAGARI LETTER AU +0915;AL # DEVANAGARI LETTER KA +0916;AL # DEVANAGARI LETTER KHA +0917;AL # DEVANAGARI LETTER GA +0918;AL # DEVANAGARI LETTER GHA +0919;AL # DEVANAGARI LETTER NGA +091A;AL # DEVANAGARI LETTER CA +091B;AL # DEVANAGARI LETTER CHA +091C;AL # DEVANAGARI LETTER JA +091D;AL # DEVANAGARI LETTER JHA +091E;AL # DEVANAGARI LETTER NYA +091F;AL # DEVANAGARI LETTER TTA +0920;AL # DEVANAGARI LETTER TTHA +0921;AL # DEVANAGARI LETTER DDA +0922;AL # DEVANAGARI LETTER DDHA +0923;AL # DEVANAGARI LETTER NNA +0924;AL # DEVANAGARI LETTER TA +0925;AL # DEVANAGARI LETTER THA +0926;AL # DEVANAGARI LETTER DA +0927;AL # DEVANAGARI LETTER DHA +0928;AL # DEVANAGARI LETTER NA +0929;AL # DEVANAGARI LETTER NNNA +092A;AL # DEVANAGARI LETTER PA +092B;AL # DEVANAGARI LETTER PHA +092C;AL # DEVANAGARI LETTER BA +092D;AL # DEVANAGARI LETTER BHA +092E;AL # DEVANAGARI LETTER MA +092F;AL # DEVANAGARI LETTER YA +0930;AL # DEVANAGARI LETTER RA +0931;AL # DEVANAGARI LETTER RRA +0932;AL # DEVANAGARI LETTER LA +0933;AL # DEVANAGARI LETTER LLA +0934;AL # DEVANAGARI LETTER LLLA +0935;AL # DEVANAGARI LETTER VA +0936;AL # DEVANAGARI LETTER SHA +0937;AL # DEVANAGARI LETTER SSA +0938;AL # DEVANAGARI LETTER SA +0939;AL # DEVANAGARI LETTER HA +093C;CM # DEVANAGARI SIGN NUKTA +093D;AL # DEVANAGARI SIGN AVAGRAHA +093E;CM # DEVANAGARI VOWEL SIGN AA +093F;CM # DEVANAGARI VOWEL SIGN I +0940;CM # DEVANAGARI VOWEL SIGN II +0941;CM # DEVANAGARI VOWEL SIGN U +0942;CM # DEVANAGARI VOWEL SIGN UU +0943;CM # DEVANAGARI VOWEL SIGN VOCALIC R +0944;CM # DEVANAGARI VOWEL SIGN VOCALIC RR +0945;CM # DEVANAGARI VOWEL SIGN CANDRA E +0946;CM # DEVANAGARI VOWEL SIGN SHORT E +0947;CM # DEVANAGARI VOWEL SIGN E +0948;CM # DEVANAGARI VOWEL SIGN AI +0949;CM # DEVANAGARI VOWEL SIGN CANDRA O +094A;CM # DEVANAGARI VOWEL SIGN SHORT O +094B;CM # DEVANAGARI VOWEL SIGN O +094C;CM # DEVANAGARI VOWEL SIGN AU +094D;CM # DEVANAGARI SIGN VIRAMA +0950;AL # DEVANAGARI OM +0951;CM # DEVANAGARI STRESS SIGN UDATTA +0952;CM # DEVANAGARI STRESS SIGN ANUDATTA +0953;CM # DEVANAGARI GRAVE ACCENT +0954;CM # DEVANAGARI ACUTE ACCENT +0958;AL # DEVANAGARI LETTER QA +0959;AL # DEVANAGARI LETTER KHHA +095A;AL # DEVANAGARI LETTER GHHA +095B;AL # DEVANAGARI LETTER ZA +095C;AL # DEVANAGARI LETTER DDDHA +095D;AL # DEVANAGARI LETTER RHA +095E;AL # DEVANAGARI LETTER FA +095F;AL # DEVANAGARI LETTER YYA +0960;AL # DEVANAGARI LETTER VOCALIC RR +0961;AL # DEVANAGARI LETTER VOCALIC LL +0962;CM # DEVANAGARI VOWEL SIGN VOCALIC L +0963;CM # DEVANAGARI VOWEL SIGN VOCALIC LL +0964;AL # DEVANAGARI DANDA +0965;AL # DEVANAGARI DOUBLE DANDA +0966;NU # DEVANAGARI DIGIT ZERO +0967;NU # DEVANAGARI DIGIT ONE +0968;NU # DEVANAGARI DIGIT TWO +0969;NU # DEVANAGARI DIGIT THREE +096A;NU # DEVANAGARI DIGIT FOUR +096B;NU # DEVANAGARI DIGIT FIVE +096C;NU # DEVANAGARI DIGIT SIX +096D;NU # DEVANAGARI DIGIT SEVEN +096E;NU # DEVANAGARI DIGIT EIGHT +096F;NU # DEVANAGARI DIGIT NINE +0970;AL # DEVANAGARI ABBREVIATION SIGN +0981;CM # BENGALI SIGN CANDRABINDU +0982;CM # BENGALI SIGN ANUSVARA +0983;CM # BENGALI SIGN VISARGA +0985;AL # BENGALI LETTER A +0986;AL # BENGALI LETTER AA +0987;AL # BENGALI LETTER I +0988;AL # BENGALI LETTER II +0989;AL # BENGALI LETTER U +098A;AL # BENGALI LETTER UU +098B;AL # BENGALI LETTER VOCALIC R +098C;AL # BENGALI LETTER VOCALIC L +098F;AL # BENGALI LETTER E +0990;AL # BENGALI LETTER AI +0993;AL # BENGALI LETTER O +0994;AL # BENGALI LETTER AU +0995;AL # BENGALI LETTER KA +0996;AL # BENGALI LETTER KHA +0997;AL # BENGALI LETTER GA +0998;AL # BENGALI LETTER GHA +0999;AL # BENGALI LETTER NGA +099A;AL # BENGALI LETTER CA +099B;AL # BENGALI LETTER CHA +099C;AL # BENGALI LETTER JA +099D;AL # BENGALI LETTER JHA +099E;AL # BENGALI LETTER NYA +099F;AL # BENGALI LETTER TTA +09A0;AL # BENGALI LETTER TTHA +09A1;AL # BENGALI LETTER DDA +09A2;AL # BENGALI LETTER DDHA +09A3;AL # BENGALI LETTER NNA +09A4;AL # BENGALI LETTER TA +09A5;AL # BENGALI LETTER THA +09A6;AL # BENGALI LETTER DA +09A7;AL # BENGALI LETTER DHA +09A8;AL # BENGALI LETTER NA +09AA;AL # BENGALI LETTER PA +09AB;AL # BENGALI LETTER PHA +09AC;AL # BENGALI LETTER BA +09AD;AL # BENGALI LETTER BHA +09AE;AL # BENGALI LETTER MA +09AF;AL # BENGALI LETTER YA +09B0;AL # BENGALI LETTER RA +09B2;AL # BENGALI LETTER LA +09B6;AL # BENGALI LETTER SHA +09B7;AL # BENGALI LETTER SSA +09B8;AL # BENGALI LETTER SA +09B9;AL # BENGALI LETTER HA +09BC;CM # BENGALI SIGN NUKTA +09BE;CM # BENGALI VOWEL SIGN AA +09BF;CM # BENGALI VOWEL SIGN I +09C0;CM # BENGALI VOWEL SIGN II +09C1;CM # BENGALI VOWEL SIGN U +09C2;CM # BENGALI VOWEL SIGN UU +09C3;CM # BENGALI VOWEL SIGN VOCALIC R +09C4;CM # BENGALI VOWEL SIGN VOCALIC RR +09C7;CM # BENGALI VOWEL SIGN E +09C8;CM # BENGALI VOWEL SIGN AI +09CB;CM # BENGALI VOWEL SIGN O +09CC;CM # BENGALI VOWEL SIGN AU +09CD;CM # BENGALI SIGN VIRAMA +09D7;CM # BENGALI AU LENGTH MARK +09DC;AL # BENGALI LETTER RRA +09DD;AL # BENGALI LETTER RHA +09DF;AL # BENGALI LETTER YYA +09E0;AL # BENGALI LETTER VOCALIC RR +09E1;AL # BENGALI LETTER VOCALIC LL +09E2;CM # BENGALI VOWEL SIGN VOCALIC L +09E3;CM # BENGALI VOWEL SIGN VOCALIC LL +09E6;NU # BENGALI DIGIT ZERO +09E7;NU # BENGALI DIGIT ONE +09E8;NU # BENGALI DIGIT TWO +09E9;NU # BENGALI DIGIT THREE +09EA;NU # BENGALI DIGIT FOUR +09EB;NU # BENGALI DIGIT FIVE +09EC;NU # BENGALI DIGIT SIX +09ED;NU # BENGALI DIGIT SEVEN +09EE;NU # BENGALI DIGIT EIGHT +09EF;NU # BENGALI DIGIT NINE +09F0;AL # BENGALI LETTER RA WITH MIDDLE DIAGONAL +09F1;AL # BENGALI LETTER RA WITH LOWER DIAGONAL +09F2;PR # BENGALI RUPEE MARK +09F3;PR # BENGALI RUPEE SIGN +09F4;AL # BENGALI CURRENCY NUMERATOR ONE +09F5;AL # BENGALI CURRENCY NUMERATOR TWO +09F6;AL # BENGALI CURRENCY NUMERATOR THREE +09F7;AL # BENGALI CURRENCY NUMERATOR FOUR +09F8;AL # BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR +09F9;AL # BENGALI CURRENCY DENOMINATOR SIXTEEN +09FA;AL # BENGALI ISSHAR +0A02;CM # GURMUKHI SIGN BINDI +0A05;AL # GURMUKHI LETTER A +0A06;AL # GURMUKHI LETTER AA +0A07;AL # GURMUKHI LETTER I +0A08;AL # GURMUKHI LETTER II +0A09;AL # GURMUKHI LETTER U +0A0A;AL # GURMUKHI LETTER UU +0A0F;AL # GURMUKHI LETTER EE +0A10;AL # GURMUKHI LETTER AI +0A13;AL # GURMUKHI LETTER OO +0A14;AL # GURMUKHI LETTER AU +0A15;AL # GURMUKHI LETTER KA +0A16;AL # GURMUKHI LETTER KHA +0A17;AL # GURMUKHI LETTER GA +0A18;AL # GURMUKHI LETTER GHA +0A19;AL # GURMUKHI LETTER NGA +0A1A;AL # GURMUKHI LETTER CA +0A1B;AL # GURMUKHI LETTER CHA +0A1C;AL # GURMUKHI LETTER JA +0A1D;AL # GURMUKHI LETTER JHA +0A1E;AL # GURMUKHI LETTER NYA +0A1F;AL # GURMUKHI LETTER TTA +0A20;AL # GURMUKHI LETTER TTHA +0A21;AL # GURMUKHI LETTER DDA +0A22;AL # GURMUKHI LETTER DDHA +0A23;AL # GURMUKHI LETTER NNA +0A24;AL # GURMUKHI LETTER TA +0A25;AL # GURMUKHI LETTER THA +0A26;AL # GURMUKHI LETTER DA +0A27;AL # GURMUKHI LETTER DHA +0A28;AL # GURMUKHI LETTER NA +0A2A;AL # GURMUKHI LETTER PA +0A2B;AL # GURMUKHI LETTER PHA +0A2C;AL # GURMUKHI LETTER BA +0A2D;AL # GURMUKHI LETTER BHA +0A2E;AL # GURMUKHI LETTER MA +0A2F;AL # GURMUKHI LETTER YA +0A30;AL # GURMUKHI LETTER RA +0A32;AL # GURMUKHI LETTER LA +0A33;AL # GURMUKHI LETTER LLA +0A35;AL # GURMUKHI LETTER VA +0A36;AL # GURMUKHI LETTER SHA +0A38;AL # GURMUKHI LETTER SA +0A39;AL # GURMUKHI LETTER HA +0A3C;CM # GURMUKHI SIGN NUKTA +0A3E;CM # GURMUKHI VOWEL SIGN AA +0A3F;CM # GURMUKHI VOWEL SIGN I +0A40;CM # GURMUKHI VOWEL SIGN II +0A41;CM # GURMUKHI VOWEL SIGN U +0A42;CM # GURMUKHI VOWEL SIGN UU +0A47;CM # GURMUKHI VOWEL SIGN EE +0A48;CM # GURMUKHI VOWEL SIGN AI +0A4B;CM # GURMUKHI VOWEL SIGN OO +0A4C;CM # GURMUKHI VOWEL SIGN AU +0A4D;CM # GURMUKHI SIGN VIRAMA +0A59;AL # GURMUKHI LETTER KHHA +0A5A;AL # GURMUKHI LETTER GHHA +0A5B;AL # GURMUKHI LETTER ZA +0A5C;AL # GURMUKHI LETTER RRA +0A5E;AL # GURMUKHI LETTER FA +0A66;NU # GURMUKHI DIGIT ZERO +0A67;NU # GURMUKHI DIGIT ONE +0A68;NU # GURMUKHI DIGIT TWO +0A69;NU # GURMUKHI DIGIT THREE +0A6A;NU # GURMUKHI DIGIT FOUR +0A6B;NU # GURMUKHI DIGIT FIVE +0A6C;NU # GURMUKHI DIGIT SIX +0A6D;NU # GURMUKHI DIGIT SEVEN +0A6E;NU # GURMUKHI DIGIT EIGHT +0A6F;NU # GURMUKHI DIGIT NINE +0A70;CM # GURMUKHI TIPPI +0A71;CM # GURMUKHI ADDAK +0A72;AL # GURMUKHI IRI +0A73;AL # GURMUKHI URA +0A74;AL # GURMUKHI EK ONKAR +0A81;CM # GUJARATI SIGN CANDRABINDU +0A82;CM # GUJARATI SIGN ANUSVARA +0A83;CM # GUJARATI SIGN VISARGA +0A85;AL # GUJARATI LETTER A +0A86;AL # GUJARATI LETTER AA +0A87;AL # GUJARATI LETTER I +0A88;AL # GUJARATI LETTER II +0A89;AL # GUJARATI LETTER U +0A8A;AL # GUJARATI LETTER UU +0A8B;AL # GUJARATI LETTER VOCALIC R +0A8D;AL # GUJARATI VOWEL CANDRA E +0A8F;AL # GUJARATI LETTER E +0A90;AL # GUJARATI LETTER AI +0A91;AL # GUJARATI VOWEL CANDRA O +0A93;AL # GUJARATI LETTER O +0A94;AL # GUJARATI LETTER AU +0A95;AL # GUJARATI LETTER KA +0A96;AL # GUJARATI LETTER KHA +0A97;AL # GUJARATI LETTER GA +0A98;AL # GUJARATI LETTER GHA +0A99;AL # GUJARATI LETTER NGA +0A9A;AL # GUJARATI LETTER CA +0A9B;AL # GUJARATI LETTER CHA +0A9C;AL # GUJARATI LETTER JA +0A9D;AL # GUJARATI LETTER JHA +0A9E;AL # GUJARATI LETTER NYA +0A9F;AL # GUJARATI LETTER TTA +0AA0;AL # GUJARATI LETTER TTHA +0AA1;AL # GUJARATI LETTER DDA +0AA2;AL # GUJARATI LETTER DDHA +0AA3;AL # GUJARATI LETTER NNA +0AA4;AL # GUJARATI LETTER TA +0AA5;AL # GUJARATI LETTER THA +0AA6;AL # GUJARATI LETTER DA +0AA7;AL # GUJARATI LETTER DHA +0AA8;AL # GUJARATI LETTER NA +0AAA;AL # GUJARATI LETTER PA +0AAB;AL # GUJARATI LETTER PHA +0AAC;AL # GUJARATI LETTER BA +0AAD;AL # GUJARATI LETTER BHA +0AAE;AL # GUJARATI LETTER MA +0AAF;AL # GUJARATI LETTER YA +0AB0;AL # GUJARATI LETTER RA +0AB2;AL # GUJARATI LETTER LA +0AB3;AL # GUJARATI LETTER LLA +0AB5;AL # GUJARATI LETTER VA +0AB6;AL # GUJARATI LETTER SHA +0AB7;AL # GUJARATI LETTER SSA +0AB8;AL # GUJARATI LETTER SA +0AB9;AL # GUJARATI LETTER HA +0ABC;CM # GUJARATI SIGN NUKTA +0ABD;AL # GUJARATI SIGN AVAGRAHA +0ABE;CM # GUJARATI VOWEL SIGN AA +0ABF;CM # GUJARATI VOWEL SIGN I +0AC0;CM # GUJARATI VOWEL SIGN II +0AC1;CM # GUJARATI VOWEL SIGN U +0AC2;CM # GUJARATI VOWEL SIGN UU +0AC3;CM # GUJARATI VOWEL SIGN VOCALIC R +0AC4;CM # GUJARATI VOWEL SIGN VOCALIC RR +0AC5;CM # GUJARATI VOWEL SIGN CANDRA E +0AC7;CM # GUJARATI VOWEL SIGN E +0AC8;CM # GUJARATI VOWEL SIGN AI +0AC9;CM # GUJARATI VOWEL SIGN CANDRA O +0ACB;CM # GUJARATI VOWEL SIGN O +0ACC;CM # GUJARATI VOWEL SIGN AU +0ACD;CM # GUJARATI SIGN VIRAMA +0AD0;AL # GUJARATI OM +0AE0;AL # GUJARATI LETTER VOCALIC RR +0AE6;NU # GUJARATI DIGIT ZERO +0AE7;NU # GUJARATI DIGIT ONE +0AE8;NU # GUJARATI DIGIT TWO +0AE9;NU # GUJARATI DIGIT THREE +0AEA;NU # GUJARATI DIGIT FOUR +0AEB;NU # GUJARATI DIGIT FIVE +0AEC;NU # GUJARATI DIGIT SIX +0AED;NU # GUJARATI DIGIT SEVEN +0AEE;NU # GUJARATI DIGIT EIGHT +0AEF;NU # GUJARATI DIGIT NINE +0B01;CM # ORIYA SIGN CANDRABINDU +0B02;CM # ORIYA SIGN ANUSVARA +0B03;CM # ORIYA SIGN VISARGA +0B05;AL # ORIYA LETTER A +0B06;AL # ORIYA LETTER AA +0B07;AL # ORIYA LETTER I +0B08;AL # ORIYA LETTER II +0B09;AL # ORIYA LETTER U +0B0A;AL # ORIYA LETTER UU +0B0B;AL # ORIYA LETTER VOCALIC R +0B0C;AL # ORIYA LETTER VOCALIC L +0B0F;AL # ORIYA LETTER E +0B10;AL # ORIYA LETTER AI +0B13;AL # ORIYA LETTER O +0B14;AL # ORIYA LETTER AU +0B15;AL # ORIYA LETTER KA +0B16;AL # ORIYA LETTER KHA +0B17;AL # ORIYA LETTER GA +0B18;AL # ORIYA LETTER GHA +0B19;AL # ORIYA LETTER NGA +0B1A;AL # ORIYA LETTER CA +0B1B;AL # ORIYA LETTER CHA +0B1C;AL # ORIYA LETTER JA +0B1D;AL # ORIYA LETTER JHA +0B1E;AL # ORIYA LETTER NYA +0B1F;AL # ORIYA LETTER TTA +0B20;AL # ORIYA LETTER TTHA +0B21;AL # ORIYA LETTER DDA +0B22;AL # ORIYA LETTER DDHA +0B23;AL # ORIYA LETTER NNA +0B24;AL # ORIYA LETTER TA +0B25;AL # ORIYA LETTER THA +0B26;AL # ORIYA LETTER DA +0B27;AL # ORIYA LETTER DHA +0B28;AL # ORIYA LETTER NA +0B2A;AL # ORIYA LETTER PA +0B2B;AL # ORIYA LETTER PHA +0B2C;AL # ORIYA LETTER BA +0B2D;AL # ORIYA LETTER BHA +0B2E;AL # ORIYA LETTER MA +0B2F;AL # ORIYA LETTER YA +0B30;AL # ORIYA LETTER RA +0B32;AL # ORIYA LETTER LA +0B33;AL # ORIYA LETTER LLA +0B36;AL # ORIYA LETTER SHA +0B37;AL # ORIYA LETTER SSA +0B38;AL # ORIYA LETTER SA +0B39;AL # ORIYA LETTER HA +0B3C;CM # ORIYA SIGN NUKTA +0B3D;AL # ORIYA SIGN AVAGRAHA +0B3E;CM # ORIYA VOWEL SIGN AA +0B3F;CM # ORIYA VOWEL SIGN I +0B40;CM # ORIYA VOWEL SIGN II +0B41;CM # ORIYA VOWEL SIGN U +0B42;CM # ORIYA VOWEL SIGN UU +0B43;CM # ORIYA VOWEL SIGN VOCALIC R +0B47;CM # ORIYA VOWEL SIGN E +0B48;CM # ORIYA VOWEL SIGN AI +0B4B;CM # ORIYA VOWEL SIGN O +0B4C;CM # ORIYA VOWEL SIGN AU +0B4D;CM # ORIYA SIGN VIRAMA +0B56;CM # ORIYA AI LENGTH MARK +0B57;CM # ORIYA AU LENGTH MARK +0B5C;AL # ORIYA LETTER RRA +0B5D;AL # ORIYA LETTER RHA +0B5F;AL # ORIYA LETTER YYA +0B60;AL # ORIYA LETTER VOCALIC RR +0B61;AL # ORIYA LETTER VOCALIC LL +0B66;NU # ORIYA DIGIT ZERO +0B67;NU # ORIYA DIGIT ONE +0B68;NU # ORIYA DIGIT TWO +0B69;NU # ORIYA DIGIT THREE +0B6A;NU # ORIYA DIGIT FOUR +0B6B;NU # ORIYA DIGIT FIVE +0B6C;NU # ORIYA DIGIT SIX +0B6D;NU # ORIYA DIGIT SEVEN +0B6E;NU # ORIYA DIGIT EIGHT +0B6F;NU # ORIYA DIGIT NINE +0B70;AL # ORIYA ISSHAR +0B82;CM # TAMIL SIGN ANUSVARA +0B83;AL # TAMIL SIGN VISARGA +0B85;AL # TAMIL LETTER A +0B86;AL # TAMIL LETTER AA +0B87;AL # TAMIL LETTER I +0B88;AL # TAMIL LETTER II +0B89;AL # TAMIL LETTER U +0B8A;AL # TAMIL LETTER UU +0B8E;AL # TAMIL LETTER E +0B8F;AL # TAMIL LETTER EE +0B90;AL # TAMIL LETTER AI +0B92;AL # TAMIL LETTER O +0B93;AL # TAMIL LETTER OO +0B94;AL # TAMIL LETTER AU +0B95;AL # TAMIL LETTER KA +0B99;AL # TAMIL LETTER NGA +0B9A;AL # TAMIL LETTER CA +0B9C;AL # TAMIL LETTER JA +0B9E;AL # TAMIL LETTER NYA +0B9F;AL # TAMIL LETTER TTA +0BA3;AL # TAMIL LETTER NNA +0BA4;AL # TAMIL LETTER TA +0BA8;AL # TAMIL LETTER NA +0BA9;AL # TAMIL LETTER NNNA +0BAA;AL # TAMIL LETTER PA +0BAE;AL # TAMIL LETTER MA +0BAF;AL # TAMIL LETTER YA +0BB0;AL # TAMIL LETTER RA +0BB1;AL # TAMIL LETTER RRA +0BB2;AL # TAMIL LETTER LA +0BB3;AL # TAMIL LETTER LLA +0BB4;AL # TAMIL LETTER LLLA +0BB5;AL # TAMIL LETTER VA +0BB7;AL # TAMIL LETTER SSA +0BB8;AL # TAMIL LETTER SA +0BB9;AL # TAMIL LETTER HA +0BBE;CM # TAMIL VOWEL SIGN AA +0BBF;CM # TAMIL VOWEL SIGN I +0BC0;CM # TAMIL VOWEL SIGN II +0BC1;CM # TAMIL VOWEL SIGN U +0BC2;CM # TAMIL VOWEL SIGN UU +0BC6;CM # TAMIL VOWEL SIGN E +0BC7;CM # TAMIL VOWEL SIGN EE +0BC8;CM # TAMIL VOWEL SIGN AI +0BCA;CM # TAMIL VOWEL SIGN O +0BCB;CM # TAMIL VOWEL SIGN OO +0BCC;CM # TAMIL VOWEL SIGN AU +0BCD;CM # TAMIL SIGN VIRAMA +0BD7;CM # TAMIL AU LENGTH MARK +0BE7;NU # TAMIL DIGIT ONE +0BE8;NU # TAMIL DIGIT TWO +0BE9;NU # TAMIL DIGIT THREE +0BEA;NU # TAMIL DIGIT FOUR +0BEB;NU # TAMIL DIGIT FIVE +0BEC;NU # TAMIL DIGIT SIX +0BED;NU # TAMIL DIGIT SEVEN +0BEE;NU # TAMIL DIGIT EIGHT +0BEF;NU # TAMIL DIGIT NINE +0BF0;AL # TAMIL NUMBER TEN +0BF1;AL # TAMIL NUMBER ONE HUNDRED +0BF2;AL # TAMIL NUMBER ONE THOUSAND +0C01;CM # TELUGU SIGN CANDRABINDU +0C02;CM # TELUGU SIGN ANUSVARA +0C03;CM # TELUGU SIGN VISARGA +0C05;AL # TELUGU LETTER A +0C06;AL # TELUGU LETTER AA +0C07;AL # TELUGU LETTER I +0C08;AL # TELUGU LETTER II +0C09;AL # TELUGU LETTER U +0C0A;AL # TELUGU LETTER UU +0C0B;AL # TELUGU LETTER VOCALIC R +0C0C;AL # TELUGU LETTER VOCALIC L +0C0E;AL # TELUGU LETTER E +0C0F;AL # TELUGU LETTER EE +0C10;AL # TELUGU LETTER AI +0C12;AL # TELUGU LETTER O +0C13;AL # TELUGU LETTER OO +0C14;AL # TELUGU LETTER AU +0C15;AL # TELUGU LETTER KA +0C16;AL # TELUGU LETTER KHA +0C17;AL # TELUGU LETTER GA +0C18;AL # TELUGU LETTER GHA +0C19;AL # TELUGU LETTER NGA +0C1A;AL # TELUGU LETTER CA +0C1B;AL # TELUGU LETTER CHA +0C1C;AL # TELUGU LETTER JA +0C1D;AL # TELUGU LETTER JHA +0C1E;AL # TELUGU LETTER NYA +0C1F;AL # TELUGU LETTER TTA +0C20;AL # TELUGU LETTER TTHA +0C21;AL # TELUGU LETTER DDA +0C22;AL # TELUGU LETTER DDHA +0C23;AL # TELUGU LETTER NNA +0C24;AL # TELUGU LETTER TA +0C25;AL # TELUGU LETTER THA +0C26;AL # TELUGU LETTER DA +0C27;AL # TELUGU LETTER DHA +0C28;AL # TELUGU LETTER NA +0C2A;AL # TELUGU LETTER PA +0C2B;AL # TELUGU LETTER PHA +0C2C;AL # TELUGU LETTER BA +0C2D;AL # TELUGU LETTER BHA +0C2E;AL # TELUGU LETTER MA +0C2F;AL # TELUGU LETTER YA +0C30;AL # TELUGU LETTER RA +0C31;AL # TELUGU LETTER RRA +0C32;AL # TELUGU LETTER LA +0C33;AL # TELUGU LETTER LLA +0C35;AL # TELUGU LETTER VA +0C36;AL # TELUGU LETTER SHA +0C37;AL # TELUGU LETTER SSA +0C38;AL # TELUGU LETTER SA +0C39;AL # TELUGU LETTER HA +0C3E;CM # TELUGU VOWEL SIGN AA +0C3F;CM # TELUGU VOWEL SIGN I +0C40;CM # TELUGU VOWEL SIGN II +0C41;CM # TELUGU VOWEL SIGN U +0C42;CM # TELUGU VOWEL SIGN UU +0C43;CM # TELUGU VOWEL SIGN VOCALIC R +0C44;CM # TELUGU VOWEL SIGN VOCALIC RR +0C46;CM # TELUGU VOWEL SIGN E +0C47;CM # TELUGU VOWEL SIGN EE +0C48;CM # TELUGU VOWEL SIGN AI +0C4A;CM # TELUGU VOWEL SIGN O +0C4B;CM # TELUGU VOWEL SIGN OO +0C4C;CM # TELUGU VOWEL SIGN AU +0C4D;CM # TELUGU SIGN VIRAMA +0C55;CM # TELUGU LENGTH MARK +0C56;CM # TELUGU AI LENGTH MARK +0C60;AL # TELUGU LETTER VOCALIC RR +0C61;AL # TELUGU LETTER VOCALIC LL +0C66;NU # TELUGU DIGIT ZERO +0C67;NU # TELUGU DIGIT ONE +0C68;NU # TELUGU DIGIT TWO +0C69;NU # TELUGU DIGIT THREE +0C6A;NU # TELUGU DIGIT FOUR +0C6B;NU # TELUGU DIGIT FIVE +0C6C;NU # TELUGU DIGIT SIX +0C6D;NU # TELUGU DIGIT SEVEN +0C6E;NU # TELUGU DIGIT EIGHT +0C6F;NU # TELUGU DIGIT NINE +0C82;CM # KANNADA SIGN ANUSVARA +0C83;CM # KANNADA SIGN VISARGA +0C85;AL # KANNADA LETTER A +0C86;AL # KANNADA LETTER AA +0C87;AL # KANNADA LETTER I +0C88;AL # KANNADA LETTER II +0C89;AL # KANNADA LETTER U +0C8A;AL # KANNADA LETTER UU +0C8B;AL # KANNADA LETTER VOCALIC R +0C8C;AL # KANNADA LETTER VOCALIC L +0C8E;AL # KANNADA LETTER E +0C8F;AL # KANNADA LETTER EE +0C90;AL # KANNADA LETTER AI +0C92;AL # KANNADA LETTER O +0C93;AL # KANNADA LETTER OO +0C94;AL # KANNADA LETTER AU +0C95;AL # KANNADA LETTER KA +0C96;AL # KANNADA LETTER KHA +0C97;AL # KANNADA LETTER GA +0C98;AL # KANNADA LETTER GHA +0C99;AL # KANNADA LETTER NGA +0C9A;AL # KANNADA LETTER CA +0C9B;AL # KANNADA LETTER CHA +0C9C;AL # KANNADA LETTER JA +0C9D;AL # KANNADA LETTER JHA +0C9E;AL # KANNADA LETTER NYA +0C9F;AL # KANNADA LETTER TTA +0CA0;AL # KANNADA LETTER TTHA +0CA1;AL # KANNADA LETTER DDA +0CA2;AL # KANNADA LETTER DDHA +0CA3;AL # KANNADA LETTER NNA +0CA4;AL # KANNADA LETTER TA +0CA5;AL # KANNADA LETTER THA +0CA6;AL # KANNADA LETTER DA +0CA7;AL # KANNADA LETTER DHA +0CA8;AL # KANNADA LETTER NA +0CAA;AL # KANNADA LETTER PA +0CAB;AL # KANNADA LETTER PHA +0CAC;AL # KANNADA LETTER BA +0CAD;AL # KANNADA LETTER BHA +0CAE;AL # KANNADA LETTER MA +0CAF;AL # KANNADA LETTER YA +0CB0;AL # KANNADA LETTER RA +0CB1;AL # KANNADA LETTER RRA +0CB2;AL # KANNADA LETTER LA +0CB3;AL # KANNADA LETTER LLA +0CB5;AL # KANNADA LETTER VA +0CB6;AL # KANNADA LETTER SHA +0CB7;AL # KANNADA LETTER SSA +0CB8;AL # KANNADA LETTER SA +0CB9;AL # KANNADA LETTER HA +0CBE;CM # KANNADA VOWEL SIGN AA +0CBF;CM # KANNADA VOWEL SIGN I +0CC0;CM # KANNADA VOWEL SIGN II +0CC1;CM # KANNADA VOWEL SIGN U +0CC2;CM # KANNADA VOWEL SIGN UU +0CC3;CM # KANNADA VOWEL SIGN VOCALIC R +0CC4;CM # KANNADA VOWEL SIGN VOCALIC RR +0CC6;CM # KANNADA VOWEL SIGN E +0CC7;CM # KANNADA VOWEL SIGN EE +0CC8;CM # KANNADA VOWEL SIGN AI +0CCA;CM # KANNADA VOWEL SIGN O +0CCB;CM # KANNADA VOWEL SIGN OO +0CCC;CM # KANNADA VOWEL SIGN AU +0CCD;CM # KANNADA SIGN VIRAMA +0CD5;CM # KANNADA LENGTH MARK +0CD6;CM # KANNADA AI LENGTH MARK +0CDE;AL # KANNADA LETTER FA +0CE0;AL # KANNADA LETTER VOCALIC RR +0CE1;AL # KANNADA LETTER VOCALIC LL +0CE6;NU # KANNADA DIGIT ZERO +0CE7;NU # KANNADA DIGIT ONE +0CE8;NU # KANNADA DIGIT TWO +0CE9;NU # KANNADA DIGIT THREE +0CEA;NU # KANNADA DIGIT FOUR +0CEB;NU # KANNADA DIGIT FIVE +0CEC;NU # KANNADA DIGIT SIX +0CED;NU # KANNADA DIGIT SEVEN +0CEE;NU # KANNADA DIGIT EIGHT +0CEF;NU # KANNADA DIGIT NINE +0D02;CM # MALAYALAM SIGN ANUSVARA +0D03;CM # MALAYALAM SIGN VISARGA +0D05;AL # MALAYALAM LETTER A +0D06;AL # MALAYALAM LETTER AA +0D07;AL # MALAYALAM LETTER I +0D08;AL # MALAYALAM LETTER II +0D09;AL # MALAYALAM LETTER U +0D0A;AL # MALAYALAM LETTER UU +0D0B;AL # MALAYALAM LETTER VOCALIC R +0D0C;AL # MALAYALAM LETTER VOCALIC L +0D0E;AL # MALAYALAM LETTER E +0D0F;AL # MALAYALAM LETTER EE +0D10;AL # MALAYALAM LETTER AI +0D12;AL # MALAYALAM LETTER O +0D13;AL # MALAYALAM LETTER OO +0D14;AL # MALAYALAM LETTER AU +0D15;AL # MALAYALAM LETTER KA +0D16;AL # MALAYALAM LETTER KHA +0D17;AL # MALAYALAM LETTER GA +0D18;AL # MALAYALAM LETTER GHA +0D19;AL # MALAYALAM LETTER NGA +0D1A;AL # MALAYALAM LETTER CA +0D1B;AL # MALAYALAM LETTER CHA +0D1C;AL # MALAYALAM LETTER JA +0D1D;AL # MALAYALAM LETTER JHA +0D1E;AL # MALAYALAM LETTER NYA +0D1F;AL # MALAYALAM LETTER TTA +0D20;AL # MALAYALAM LETTER TTHA +0D21;AL # MALAYALAM LETTER DDA +0D22;AL # MALAYALAM LETTER DDHA +0D23;AL # MALAYALAM LETTER NNA +0D24;AL # MALAYALAM LETTER TA +0D25;AL # MALAYALAM LETTER THA +0D26;AL # MALAYALAM LETTER DA +0D27;AL # MALAYALAM LETTER DHA +0D28;AL # MALAYALAM LETTER NA +0D2A;AL # MALAYALAM LETTER PA +0D2B;AL # MALAYALAM LETTER PHA +0D2C;AL # MALAYALAM LETTER BA +0D2D;AL # MALAYALAM LETTER BHA +0D2E;AL # MALAYALAM LETTER MA +0D2F;AL # MALAYALAM LETTER YA +0D30;AL # MALAYALAM LETTER RA +0D31;AL # MALAYALAM LETTER RRA +0D32;AL # MALAYALAM LETTER LA +0D33;AL # MALAYALAM LETTER LLA +0D34;AL # MALAYALAM LETTER LLLA +0D35;AL # MALAYALAM LETTER VA +0D36;AL # MALAYALAM LETTER SHA +0D37;AL # MALAYALAM LETTER SSA +0D38;AL # MALAYALAM LETTER SA +0D39;AL # MALAYALAM LETTER HA +0D3E;CM # MALAYALAM VOWEL SIGN AA +0D3F;CM # MALAYALAM VOWEL SIGN I +0D40;CM # MALAYALAM VOWEL SIGN II +0D41;CM # MALAYALAM VOWEL SIGN U +0D42;CM # MALAYALAM VOWEL SIGN UU +0D43;CM # MALAYALAM VOWEL SIGN VOCALIC R +0D46;CM # MALAYALAM VOWEL SIGN E +0D47;CM # MALAYALAM VOWEL SIGN EE +0D48;CM # MALAYALAM VOWEL SIGN AI +0D4A;CM # MALAYALAM VOWEL SIGN O +0D4B;CM # MALAYALAM VOWEL SIGN OO +0D4C;CM # MALAYALAM VOWEL SIGN AU +0D4D;CM # MALAYALAM SIGN VIRAMA +0D57;CM # MALAYALAM AU LENGTH MARK +0D60;AL # MALAYALAM LETTER VOCALIC RR +0D61;AL # MALAYALAM LETTER VOCALIC LL +0D66;NU # MALAYALAM DIGIT ZERO +0D67;NU # MALAYALAM DIGIT ONE +0D68;NU # MALAYALAM DIGIT TWO +0D69;NU # MALAYALAM DIGIT THREE +0D6A;NU # MALAYALAM DIGIT FOUR +0D6B;NU # MALAYALAM DIGIT FIVE +0D6C;NU # MALAYALAM DIGIT SIX +0D6D;NU # MALAYALAM DIGIT SEVEN +0D6E;NU # MALAYALAM DIGIT EIGHT +0D6F;NU # MALAYALAM DIGIT NINE +0D82;CM # SINHALA SIGN ANUSVARAYA +0D83;CM # SINHALA SIGN VISARGAYA +0D85;AL # SINHALA LETTER AYANNA +0D86;AL # SINHALA LETTER AAYANNA +0D87;AL # SINHALA LETTER AEYANNA +0D88;AL # SINHALA LETTER AEEYANNA +0D89;AL # SINHALA LETTER IYANNA +0D8A;AL # SINHALA LETTER IIYANNA +0D8B;AL # SINHALA LETTER UYANNA +0D8C;AL # SINHALA LETTER UUYANNA +0D8D;AL # SINHALA LETTER IRUYANNA +0D8E;AL # SINHALA LETTER IRUUYANNA +0D8F;AL # SINHALA LETTER ILUYANNA +0D90;AL # SINHALA LETTER ILUUYANNA +0D91;AL # SINHALA LETTER EYANNA +0D92;AL # SINHALA LETTER EEYANNA +0D93;AL # SINHALA LETTER AIYANNA +0D94;AL # SINHALA LETTER OYANNA +0D95;AL # SINHALA LETTER OOYANNA +0D96;AL # SINHALA LETTER AUYANNA +0D9A;AL # SINHALA LETTER ALPAPRAANA KAYANNA +0D9B;AL # SINHALA LETTER MAHAAPRAANA KAYANNA +0D9C;AL # SINHALA LETTER ALPAPRAANA GAYANNA +0D9D;AL # SINHALA LETTER MAHAAPRAANA GAYANNA +0D9E;AL # SINHALA LETTER KANTAJA NAASIKYAYA +0D9F;AL # SINHALA LETTER SANYAKA GAYANNA +0DA0;AL # SINHALA LETTER ALPAPRAANA CAYANNA +0DA1;AL # SINHALA LETTER MAHAAPRAANA CAYANNA +0DA2;AL # SINHALA LETTER ALPAPRAANA JAYANNA +0DA3;AL # SINHALA LETTER MAHAAPRAANA JAYANNA +0DA4;AL # SINHALA LETTER TAALUJA NAASIKYAYA +0DA5;AL # SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA +0DA6;AL # SINHALA LETTER SANYAKA JAYANNA +0DA7;AL # SINHALA LETTER ALPAPRAANA TTAYANNA +0DA8;AL # SINHALA LETTER MAHAAPRAANA TTAYANNA +0DA9;AL # SINHALA LETTER ALPAPRAANA DDAYANNA +0DAA;AL # SINHALA LETTER MAHAAPRAANA DDAYANNA +0DAB;AL # SINHALA LETTER MUURDHAJA NAYANNA +0DAC;AL # SINHALA LETTER SANYAKA DDAYANNA +0DAD;AL # SINHALA LETTER ALPAPRAANA TAYANNA +0DAE;AL # SINHALA LETTER MAHAAPRAANA TAYANNA +0DAF;AL # SINHALA LETTER ALPAPRAANA DAYANNA +0DB0;AL # SINHALA LETTER MAHAAPRAANA DAYANNA +0DB1;AL # SINHALA LETTER DANTAJA NAYANNA +0DB3;AL # SINHALA LETTER SANYAKA DAYANNA +0DB4;AL # SINHALA LETTER ALPAPRAANA PAYANNA +0DB5;AL # SINHALA LETTER MAHAAPRAANA PAYANNA +0DB6;AL # SINHALA LETTER ALPAPRAANA BAYANNA +0DB7;AL # SINHALA LETTER MAHAAPRAANA BAYANNA +0DB8;AL # SINHALA LETTER MAYANNA +0DB9;AL # SINHALA LETTER AMBA BAYANNA +0DBA;AL # SINHALA LETTER YAYANNA +0DBB;AL # SINHALA LETTER RAYANNA +0DBD;AL # SINHALA LETTER DANTAJA LAYANNA +0DC0;AL # SINHALA LETTER VAYANNA +0DC1;AL # SINHALA LETTER TAALUJA SAYANNA +0DC2;AL # SINHALA LETTER MUURDHAJA SAYANNA +0DC3;AL # SINHALA LETTER DANTAJA SAYANNA +0DC4;AL # SINHALA LETTER HAYANNA +0DC5;AL # SINHALA LETTER MUURDHAJA LAYANNA +0DC6;AL # SINHALA LETTER FAYANNA +0DCA;CM # SINHALA SIGN AL-LAKUNA +0DCF;CM # SINHALA VOWEL SIGN AELA-PILLA +0DD0;CM # SINHALA VOWEL SIGN KETTI AEDA-PILLA +0DD1;CM # SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD2;CM # SINHALA VOWEL SIGN KETTI IS-PILLA +0DD3;CM # SINHALA VOWEL SIGN DIGA IS-PILLA +0DD4;CM # SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6;CM # SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD8;CM # SINHALA VOWEL SIGN GAETTA-PILLA +0DD9;CM # SINHALA VOWEL SIGN KOMBUVA +0DDA;CM # SINHALA VOWEL SIGN DIGA KOMBUVA +0DDB;CM # SINHALA VOWEL SIGN KOMBU DEKA +0DDC;CM # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA +0DDD;CM # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA +0DDE;CM # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA +0DDF;CM # SINHALA VOWEL SIGN GAYANUKITTA +0DF2;CM # SINHALA VOWEL SIGN DIGA GAETTA-PILLA +0DF3;CM # SINHALA VOWEL SIGN DIGA GAYANUKITTA +0DF4;AL # SINHALA PUNCTUATION KUNDDALIYA +0E01;SA # THAI CHARACTER KO KAI +0E02;SA # THAI CHARACTER KHO KHAI +0E03;SA # THAI CHARACTER KHO KHUAT +0E04;SA # THAI CHARACTER KHO KHWAI +0E05;SA # THAI CHARACTER KHO KHON +0E06;SA # THAI CHARACTER KHO RAKHANG +0E07;SA # THAI CHARACTER NGO NGU +0E08;SA # THAI CHARACTER CHO CHAN +0E09;SA # THAI CHARACTER CHO CHING +0E0A;SA # THAI CHARACTER CHO CHANG +0E0B;SA # THAI CHARACTER SO SO +0E0C;SA # THAI CHARACTER CHO CHOE +0E0D;SA # THAI CHARACTER YO YING +0E0E;SA # THAI CHARACTER DO CHADA +0E0F;SA # THAI CHARACTER TO PATAK +0E10;SA # THAI CHARACTER THO THAN +0E11;SA # THAI CHARACTER THO NANGMONTHO +0E12;SA # THAI CHARACTER THO PHUTHAO +0E13;SA # THAI CHARACTER NO NEN +0E14;SA # THAI CHARACTER DO DEK +0E15;SA # THAI CHARACTER TO TAO +0E16;SA # THAI CHARACTER THO THUNG +0E17;SA # THAI CHARACTER THO THAHAN +0E18;SA # THAI CHARACTER THO THONG +0E19;SA # THAI CHARACTER NO NU +0E1A;SA # THAI CHARACTER BO BAIMAI +0E1B;SA # THAI CHARACTER PO PLA +0E1C;SA # THAI CHARACTER PHO PHUNG +0E1D;SA # THAI CHARACTER FO FA +0E1E;SA # THAI CHARACTER PHO PHAN +0E1F;SA # THAI CHARACTER FO FAN +0E20;SA # THAI CHARACTER PHO SAMPHAO +0E21;SA # THAI CHARACTER MO MA +0E22;SA # THAI CHARACTER YO YAK +0E23;SA # THAI CHARACTER RO RUA +0E24;SA # THAI CHARACTER RU +0E25;SA # THAI CHARACTER LO LING +0E26;SA # THAI CHARACTER LU +0E27;SA # THAI CHARACTER WO WAEN +0E28;SA # THAI CHARACTER SO SALA +0E29;SA # THAI CHARACTER SO RUSI +0E2A;SA # THAI CHARACTER SO SUA +0E2B;SA # THAI CHARACTER HO HIP +0E2C;SA # THAI CHARACTER LO CHULA +0E2D;SA # THAI CHARACTER O ANG +0E2E;SA # THAI CHARACTER HO NOKHUK +0E2F;SA # THAI CHARACTER PAIYANNOI +0E30;SA # THAI CHARACTER SARA A +0E31;CM # THAI CHARACTER MAI HAN-AKAT +0E32;SA # THAI CHARACTER SARA AA +0E33;SA # THAI CHARACTER SARA AM +0E34;CM # THAI CHARACTER SARA I +0E35;CM # THAI CHARACTER SARA II +0E36;CM # THAI CHARACTER SARA UE +0E37;CM # THAI CHARACTER SARA UEE +0E38;CM # THAI CHARACTER SARA U +0E39;CM # THAI CHARACTER SARA UU +0E3A;CM # THAI CHARACTER PHINTHU +0E3F;PR # THAI CURRENCY SYMBOL BAHT +0E40;SA # THAI CHARACTER SARA E +0E41;SA # THAI CHARACTER SARA AE +0E42;SA # THAI CHARACTER SARA O +0E43;SA # THAI CHARACTER SARA AI MAIMUAN +0E44;SA # THAI CHARACTER SARA AI MAIMALAI +0E45;SA # THAI CHARACTER LAKKHANGYAO +0E46;SA # THAI CHARACTER MAIYAMOK +0E47;CM # THAI CHARACTER MAITAIKHU +0E48;CM # THAI CHARACTER MAI EK +0E49;CM # THAI CHARACTER MAI THO +0E4A;CM # THAI CHARACTER MAI TRI +0E4B;CM # THAI CHARACTER MAI CHATTAWA +0E4C;CM # THAI CHARACTER THANTHAKHAT +0E4D;CM # THAI CHARACTER NIKHAHIT +0E4E;CM # THAI CHARACTER YAMAKKAN +0E4F;AL # THAI CHARACTER FONGMAN +0E50;NU # THAI DIGIT ZERO +0E51;NU # THAI DIGIT ONE +0E52;NU # THAI DIGIT TWO +0E53;NU # THAI DIGIT THREE +0E54;NU # THAI DIGIT FOUR +0E55;NU # THAI DIGIT FIVE +0E56;NU # THAI DIGIT SIX +0E57;NU # THAI DIGIT SEVEN +0E58;NU # THAI DIGIT EIGHT +0E59;NU # THAI DIGIT NINE +0E5A;NS # THAI CHARACTER ANGKHANKHU +0E5B;NS # THAI CHARACTER KHOMUT +0E81;SA # LAO LETTER KO +0E82;SA # LAO LETTER KHO SUNG +0E84;SA # LAO LETTER KHO TAM +0E87;SA # LAO LETTER NGO +0E88;SA # LAO LETTER CO +0E8A;SA # LAO LETTER SO TAM +0E8D;SA # LAO LETTER NYO +0E94;SA # LAO LETTER DO +0E95;SA # LAO LETTER TO +0E96;SA # LAO LETTER THO SUNG +0E97;SA # LAO LETTER THO TAM +0E99;SA # LAO LETTER NO +0E9A;SA # LAO LETTER BO +0E9B;SA # LAO LETTER PO +0E9C;SA # LAO LETTER PHO SUNG +0E9D;SA # LAO LETTER FO TAM +0E9E;SA # LAO LETTER PHO TAM +0E9F;SA # LAO LETTER FO SUNG +0EA1;SA # LAO LETTER MO +0EA2;SA # LAO LETTER YO +0EA3;SA # LAO LETTER LO LING +0EA5;SA # LAO LETTER LO LOOT +0EA7;SA # LAO LETTER WO +0EAA;SA # LAO LETTER SO SUNG +0EAB;SA # LAO LETTER HO SUNG +0EAD;SA # LAO LETTER O +0EAE;SA # LAO LETTER HO TAM +0EAF;SA # LAO ELLIPSIS +0EB0;SA # LAO VOWEL SIGN A +0EB1;CM # LAO VOWEL SIGN MAI KAN +0EB2;SA # LAO VOWEL SIGN AA +0EB3;SA # LAO VOWEL SIGN AM +0EB4;CM # LAO VOWEL SIGN I +0EB5;CM # LAO VOWEL SIGN II +0EB6;CM # LAO VOWEL SIGN Y +0EB7;CM # LAO VOWEL SIGN YY +0EB8;CM # LAO VOWEL SIGN U +0EB9;CM # LAO VOWEL SIGN UU +0EBB;CM # LAO VOWEL SIGN MAI KON +0EBC;CM # LAO SEMIVOWEL SIGN LO +0EBD;SA # LAO SEMIVOWEL SIGN NYO +0EC0;SA # LAO VOWEL SIGN E +0EC1;SA # LAO VOWEL SIGN EI +0EC2;SA # LAO VOWEL SIGN O +0EC3;SA # LAO VOWEL SIGN AY +0EC4;SA # LAO VOWEL SIGN AI +0EC6;SA # LAO KO LA +0EC8;CM # LAO TONE MAI EK +0EC9;CM # LAO TONE MAI THO +0ECA;CM # LAO TONE MAI TI +0ECB;CM # LAO TONE MAI CATAWA +0ECC;CM # LAO CANCELLATION MARK +0ECD;CM # LAO NIGGAHITA +0ED0;NU # LAO DIGIT ZERO +0ED1;NU # LAO DIGIT ONE +0ED2;NU # LAO DIGIT TWO +0ED3;NU # LAO DIGIT THREE +0ED4;NU # LAO DIGIT FOUR +0ED5;NU # LAO DIGIT FIVE +0ED6;NU # LAO DIGIT SIX +0ED7;NU # LAO DIGIT SEVEN +0ED8;NU # LAO DIGIT EIGHT +0ED9;NU # LAO DIGIT NINE +0EDC;SA # LAO HO NO +0EDD;SA # LAO HO MO +0F00;AL # TIBETAN SYLLABLE OM +0F01;AL # TIBETAN MARK GTER YIG MGO TRUNCATED A +0F02;AL # TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA +0F03;AL # TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA +0F04;AL # TIBETAN MARK INITIAL YIG MGO MDUN MA +0F05;AL # TIBETAN MARK CLOSING YIG MGO SGAB MA +0F06;AL # TIBETAN MARK CARET YIG MGO PHUR SHAD MA +0F07;AL # TIBETAN MARK YIG MGO TSHEG SHAD MA +0F08;AL # TIBETAN MARK SBRUL SHAD +0F09;AL # TIBETAN MARK BSKUR YIG MGO +0F0A;AL # TIBETAN MARK BKA- SHOG YIG MGO +0F0B;BA # TIBETAN MARK INTERSYLLABIC TSHEG +0F0C;GL # TIBETAN MARK DELIMITER TSHEG BSTAR +0F0D;AL # TIBETAN MARK SHAD +0F0E;AL # TIBETAN MARK NYIS SHAD +0F0F;AL # TIBETAN MARK TSHEG SHAD +0F10;AL # TIBETAN MARK NYIS TSHEG SHAD +0F11;AL # TIBETAN MARK RIN CHEN SPUNGS SHAD +0F12;AL # TIBETAN MARK RGYA GRAM SHAD +0F13;AL # TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN +0F14;AL # TIBETAN MARK GTER TSHEG +0F15;AL # TIBETAN LOGOTYPE SIGN CHAD RTAGS +0F16;AL # TIBETAN LOGOTYPE SIGN LHAG RTAGS +0F17;AL # TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS +0F18;CM # TIBETAN ASTROLOGICAL SIGN -KHYUD PA +0F19;CM # TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F1A;AL # TIBETAN SIGN RDEL DKAR GCIG +0F1B;AL # TIBETAN SIGN RDEL DKAR GNYIS +0F1C;AL # TIBETAN SIGN RDEL DKAR GSUM +0F1D;AL # TIBETAN SIGN RDEL NAG GCIG +0F1E;AL # TIBETAN SIGN RDEL NAG GNYIS +0F1F;AL # TIBETAN SIGN RDEL DKAR RDEL NAG +0F20;NU # TIBETAN DIGIT ZERO +0F21;NU # TIBETAN DIGIT ONE +0F22;NU # TIBETAN DIGIT TWO +0F23;NU # TIBETAN DIGIT THREE +0F24;NU # TIBETAN DIGIT FOUR +0F25;NU # TIBETAN DIGIT FIVE +0F26;NU # TIBETAN DIGIT SIX +0F27;NU # TIBETAN DIGIT SEVEN +0F28;NU # TIBETAN DIGIT EIGHT +0F29;NU # TIBETAN DIGIT NINE +0F2A;AL # TIBETAN DIGIT HALF ONE +0F2B;AL # TIBETAN DIGIT HALF TWO +0F2C;AL # TIBETAN DIGIT HALF THREE +0F2D;AL # TIBETAN DIGIT HALF FOUR +0F2E;AL # TIBETAN DIGIT HALF FIVE +0F2F;AL # TIBETAN DIGIT HALF SIX +0F30;AL # TIBETAN DIGIT HALF SEVEN +0F31;AL # TIBETAN DIGIT HALF EIGHT +0F32;AL # TIBETAN DIGIT HALF NINE +0F33;AL # TIBETAN DIGIT HALF ZERO +0F34;AL # TIBETAN MARK BSDUS RTAGS +0F35;CM # TIBETAN MARK NGAS BZUNG NYI ZLA +0F36;AL # TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN +0F37;CM # TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F38;AL # TIBETAN MARK CHE MGO +0F39;CM # TIBETAN MARK TSA -PHRU +0F3A;OP # TIBETAN MARK GUG RTAGS GYON +0F3B;CL # TIBETAN MARK GUG RTAGS GYAS +0F3C;OP # TIBETAN MARK ANG KHANG GYON +0F3D;CL # TIBETAN MARK ANG KHANG GYAS +0F3E;CM # TIBETAN SIGN YAR TSHES +0F3F;CM # TIBETAN SIGN MAR TSHES +0F40;AL # TIBETAN LETTER KA +0F41;AL # TIBETAN LETTER KHA +0F42;AL # TIBETAN LETTER GA +0F43;AL # TIBETAN LETTER GHA +0F44;AL # TIBETAN LETTER NGA +0F45;AL # TIBETAN LETTER CA +0F46;AL # TIBETAN LETTER CHA +0F47;AL # TIBETAN LETTER JA +0F49;AL # TIBETAN LETTER NYA +0F4A;AL # TIBETAN LETTER TTA +0F4B;AL # TIBETAN LETTER TTHA +0F4C;AL # TIBETAN LETTER DDA +0F4D;AL # TIBETAN LETTER DDHA +0F4E;AL # TIBETAN LETTER NNA +0F4F;AL # TIBETAN LETTER TA +0F50;AL # TIBETAN LETTER THA +0F51;AL # TIBETAN LETTER DA +0F52;AL # TIBETAN LETTER DHA +0F53;AL # TIBETAN LETTER NA +0F54;AL # TIBETAN LETTER PA +0F55;AL # TIBETAN LETTER PHA +0F56;AL # TIBETAN LETTER BA +0F57;AL # TIBETAN LETTER BHA +0F58;AL # TIBETAN LETTER MA +0F59;AL # TIBETAN LETTER TSA +0F5A;AL # TIBETAN LETTER TSHA +0F5B;AL # TIBETAN LETTER DZA +0F5C;AL # TIBETAN LETTER DZHA +0F5D;AL # TIBETAN LETTER WA +0F5E;AL # TIBETAN LETTER ZHA +0F5F;AL # TIBETAN LETTER ZA +0F60;AL # TIBETAN LETTER -A +0F61;AL # TIBETAN LETTER YA +0F62;AL # TIBETAN LETTER RA +0F63;AL # TIBETAN LETTER LA +0F64;AL # TIBETAN LETTER SHA +0F65;AL # TIBETAN LETTER SSA +0F66;AL # TIBETAN LETTER SA +0F67;AL # TIBETAN LETTER HA +0F68;AL # TIBETAN LETTER A +0F69;AL # TIBETAN LETTER KSSA +0F6A;AL # TIBETAN LETTER FIXED-FORM RA +0F71;CM # TIBETAN VOWEL SIGN AA +0F72;CM # TIBETAN VOWEL SIGN I +0F73;CM # TIBETAN VOWEL SIGN II +0F74;CM # TIBETAN VOWEL SIGN U +0F75;CM # TIBETAN VOWEL SIGN UU +0F76;CM # TIBETAN VOWEL SIGN VOCALIC R +0F77;CM # TIBETAN VOWEL SIGN VOCALIC RR +0F78;CM # TIBETAN VOWEL SIGN VOCALIC L +0F79;CM # TIBETAN VOWEL SIGN VOCALIC LL +0F7A;CM # TIBETAN VOWEL SIGN E +0F7B;CM # TIBETAN VOWEL SIGN EE +0F7C;CM # TIBETAN VOWEL SIGN O +0F7D;CM # TIBETAN VOWEL SIGN OO +0F7E;CM # TIBETAN SIGN RJES SU NGA RO +0F7F;CM # TIBETAN SIGN RNAM BCAD +0F80;CM # TIBETAN VOWEL SIGN REVERSED I +0F81;CM # TIBETAN VOWEL SIGN REVERSED II +0F82;CM # TIBETAN SIGN NYI ZLA NAA DA +0F83;CM # TIBETAN SIGN SNA LDAN +0F84;CM # TIBETAN MARK HALANTA +0F85;AL # TIBETAN MARK PALUTA +0F86;CM # TIBETAN SIGN LCI RTAGS +0F87;CM # TIBETAN SIGN YANG RTAGS +0F88;AL # TIBETAN SIGN LCE TSA CAN +0F89;AL # TIBETAN SIGN MCHU CAN +0F8A;AL # TIBETAN SIGN GRU CAN RGYINGS +0F8B;AL # TIBETAN SIGN GRU MED RGYINGS +0F90;CM # TIBETAN SUBJOINED LETTER KA +0F91;CM # TIBETAN SUBJOINED LETTER KHA +0F92;CM # TIBETAN SUBJOINED LETTER GA +0F93;CM # TIBETAN SUBJOINED LETTER GHA +0F94;CM # TIBETAN SUBJOINED LETTER NGA +0F95;CM # TIBETAN SUBJOINED LETTER CA +0F96;CM # TIBETAN SUBJOINED LETTER CHA +0F97;CM # TIBETAN SUBJOINED LETTER JA +0F99;CM # TIBETAN SUBJOINED LETTER NYA +0F9A;CM # TIBETAN SUBJOINED LETTER TTA +0F9B;CM # TIBETAN SUBJOINED LETTER TTHA +0F9C;CM # TIBETAN SUBJOINED LETTER DDA +0F9D;CM # TIBETAN SUBJOINED LETTER DDHA +0F9E;CM # TIBETAN SUBJOINED LETTER NNA +0F9F;CM # TIBETAN SUBJOINED LETTER TA +0FA0;CM # TIBETAN SUBJOINED LETTER THA +0FA1;CM # TIBETAN SUBJOINED LETTER DA +0FA2;CM # TIBETAN SUBJOINED LETTER DHA +0FA3;CM # TIBETAN SUBJOINED LETTER NA +0FA4;CM # TIBETAN SUBJOINED LETTER PA +0FA5;CM # TIBETAN SUBJOINED LETTER PHA +0FA6;CM # TIBETAN SUBJOINED LETTER BA +0FA7;CM # TIBETAN SUBJOINED LETTER BHA +0FA8;CM # TIBETAN SUBJOINED LETTER MA +0FA9;CM # TIBETAN SUBJOINED LETTER TSA +0FAA;CM # TIBETAN SUBJOINED LETTER TSHA +0FAB;CM # TIBETAN SUBJOINED LETTER DZA +0FAC;CM # TIBETAN SUBJOINED LETTER DZHA +0FAD;CM # TIBETAN SUBJOINED LETTER WA +0FAE;CM # TIBETAN SUBJOINED LETTER ZHA +0FAF;CM # TIBETAN SUBJOINED LETTER ZA +0FB0;CM # TIBETAN SUBJOINED LETTER -A +0FB1;CM # TIBETAN SUBJOINED LETTER YA +0FB2;CM # TIBETAN SUBJOINED LETTER RA +0FB3;CM # TIBETAN SUBJOINED LETTER LA +0FB4;CM # TIBETAN SUBJOINED LETTER SHA +0FB5;CM # TIBETAN SUBJOINED LETTER SSA +0FB6;CM # TIBETAN SUBJOINED LETTER SA +0FB7;CM # TIBETAN SUBJOINED LETTER HA +0FB8;CM # TIBETAN SUBJOINED LETTER A +0FB9;CM # TIBETAN SUBJOINED LETTER KSSA +0FBA;CM # TIBETAN SUBJOINED LETTER FIXED-FORM WA +0FBB;CM # TIBETAN SUBJOINED LETTER FIXED-FORM YA +0FBC;CM # TIBETAN SUBJOINED LETTER FIXED-FORM RA +0FBE;AL # TIBETAN KU RU KHA +0FBF;AL # TIBETAN KU RU KHA BZHI MIG CAN +0FC0;AL # TIBETAN CANTILLATION SIGN HEAVY BEAT +0FC1;AL # TIBETAN CANTILLATION SIGN LIGHT BEAT +0FC2;AL # TIBETAN CANTILLATION SIGN CANG TE-U +0FC3;AL # TIBETAN CANTILLATION SIGN SBUB -CHAL +0FC4;AL # TIBETAN SYMBOL DRIL BU +0FC5;AL # TIBETAN SYMBOL RDO RJE +0FC6;CM # TIBETAN SYMBOL PADMA GDAN +0FC7;AL # TIBETAN SYMBOL RDO RJE RGYA GRAM +0FC8;AL # TIBETAN SYMBOL PHUR PA +0FC9;AL # TIBETAN SYMBOL NOR BU +0FCA;AL # TIBETAN SYMBOL NOR BU NYIS -KHYIL +0FCB;AL # TIBETAN SYMBOL NOR BU GSUM -KHYIL +0FCC;AL # TIBETAN SYMBOL NOR BU BZHI -KHYIL +0FCF;AL # TIBETAN SIGN RDEL NAG GSUM +1000;SA # MYANMAR LETTER KA +1001;SA # MYANMAR LETTER KHA +1002;SA # MYANMAR LETTER GA +1003;SA # MYANMAR LETTER GHA +1004;SA # MYANMAR LETTER NGA +1005;SA # MYANMAR LETTER CA +1006;SA # MYANMAR LETTER CHA +1007;SA # MYANMAR LETTER JA +1008;SA # MYANMAR LETTER JHA +1009;SA # MYANMAR LETTER NYA +100A;SA # MYANMAR LETTER NNYA +100B;SA # MYANMAR LETTER TTA +100C;SA # MYANMAR LETTER TTHA +100D;SA # MYANMAR LETTER DDA +100E;SA # MYANMAR LETTER DDHA +100F;SA # MYANMAR LETTER NNA +1010;SA # MYANMAR LETTER TA +1011;SA # MYANMAR LETTER THA +1012;SA # MYANMAR LETTER DA +1013;SA # MYANMAR LETTER DHA +1014;SA # MYANMAR LETTER NA +1015;SA # MYANMAR LETTER PA +1016;SA # MYANMAR LETTER PHA +1017;SA # MYANMAR LETTER BA +1018;SA # MYANMAR LETTER BHA +1019;SA # MYANMAR LETTER MA +101A;SA # MYANMAR LETTER YA +101B;SA # MYANMAR LETTER RA +101C;SA # MYANMAR LETTER LA +101D;SA # MYANMAR LETTER WA +101E;SA # MYANMAR LETTER SA +101F;SA # MYANMAR LETTER HA +1020;SA # MYANMAR LETTER LLA +1021;SA # MYANMAR LETTER A +1023;SA # MYANMAR LETTER I +1024;SA # MYANMAR LETTER II +1025;SA # MYANMAR LETTER U +1026;SA # MYANMAR LETTER UU +1027;SA # MYANMAR LETTER E +1029;SA # MYANMAR LETTER O +102A;SA # MYANMAR LETTER AU +102C;CM # MYANMAR VOWEL SIGN AA +102D;CM # MYANMAR VOWEL SIGN I +102E;CM # MYANMAR VOWEL SIGN II +102F;CM # MYANMAR VOWEL SIGN U +1030;CM # MYANMAR VOWEL SIGN UU +1031;CM # MYANMAR VOWEL SIGN E +1032;CM # MYANMAR VOWEL SIGN AI +1036;CM # MYANMAR SIGN ANUSVARA +1037;CM # MYANMAR SIGN DOT BELOW +1038;CM # MYANMAR SIGN VISARGA +1039;CM # MYANMAR SIGN VIRAMA +1040;NU # MYANMAR DIGIT ZERO +1041;NU # MYANMAR DIGIT ONE +1042;NU # MYANMAR DIGIT TWO +1043;NU # MYANMAR DIGIT THREE +1044;NU # MYANMAR DIGIT FOUR +1045;NU # MYANMAR DIGIT FIVE +1046;NU # MYANMAR DIGIT SIX +1047;NU # MYANMAR DIGIT SEVEN +1048;NU # MYANMAR DIGIT EIGHT +1049;NU # MYANMAR DIGIT NINE +104A;AL # MYANMAR SIGN LITTLE SECTION +104B;AL # MYANMAR SIGN SECTION +104C;AL # MYANMAR SYMBOL LOCATIVE +104D;AL # MYANMAR SYMBOL COMPLETED +104E;AL # MYANMAR SYMBOL AFOREMENTIONED +104F;AL # MYANMAR SYMBOL GENITIVE +1050;SA # MYANMAR LETTER SHA +1051;SA # MYANMAR LETTER SSA +1052;SA # MYANMAR LETTER VOCALIC R +1053;SA # MYANMAR LETTER VOCALIC RR +1054;SA # MYANMAR LETTER VOCALIC L +1055;SA # MYANMAR LETTER VOCALIC LL +1056;CM # MYANMAR VOWEL SIGN VOCALIC R +1057;CM # MYANMAR VOWEL SIGN VOCALIC RR +1058;CM # MYANMAR VOWEL SIGN VOCALIC L +1059;CM # MYANMAR VOWEL SIGN VOCALIC LL +10A0;AL # GEORGIAN CAPITAL LETTER AN +10A1;AL # GEORGIAN CAPITAL LETTER BAN +10A2;AL # GEORGIAN CAPITAL LETTER GAN +10A3;AL # GEORGIAN CAPITAL LETTER DON +10A4;AL # GEORGIAN CAPITAL LETTER EN +10A5;AL # GEORGIAN CAPITAL LETTER VIN +10A6;AL # GEORGIAN CAPITAL LETTER ZEN +10A7;AL # GEORGIAN CAPITAL LETTER TAN +10A8;AL # GEORGIAN CAPITAL LETTER IN +10A9;AL # GEORGIAN CAPITAL LETTER KAN +10AA;AL # GEORGIAN CAPITAL LETTER LAS +10AB;AL # GEORGIAN CAPITAL LETTER MAN +10AC;AL # GEORGIAN CAPITAL LETTER NAR +10AD;AL # GEORGIAN CAPITAL LETTER ON +10AE;AL # GEORGIAN CAPITAL LETTER PAR +10AF;AL # GEORGIAN CAPITAL LETTER ZHAR +10B0;AL # GEORGIAN CAPITAL LETTER RAE +10B1;AL # GEORGIAN CAPITAL LETTER SAN +10B2;AL # GEORGIAN CAPITAL LETTER TAR +10B3;AL # GEORGIAN CAPITAL LETTER UN +10B4;AL # GEORGIAN CAPITAL LETTER PHAR +10B5;AL # GEORGIAN CAPITAL LETTER KHAR +10B6;AL # GEORGIAN CAPITAL LETTER GHAN +10B7;AL # GEORGIAN CAPITAL LETTER QAR +10B8;AL # GEORGIAN CAPITAL LETTER SHIN +10B9;AL # GEORGIAN CAPITAL LETTER CHIN +10BA;AL # GEORGIAN CAPITAL LETTER CAN +10BB;AL # GEORGIAN CAPITAL LETTER JIL +10BC;AL # GEORGIAN CAPITAL LETTER CIL +10BD;AL # GEORGIAN CAPITAL LETTER CHAR +10BE;AL # GEORGIAN CAPITAL LETTER XAN +10BF;AL # GEORGIAN CAPITAL LETTER JHAN +10C0;AL # GEORGIAN CAPITAL LETTER HAE +10C1;AL # GEORGIAN CAPITAL LETTER HE +10C2;AL # GEORGIAN CAPITAL LETTER HIE +10C3;AL # GEORGIAN CAPITAL LETTER WE +10C4;AL # GEORGIAN CAPITAL LETTER HAR +10C5;AL # GEORGIAN CAPITAL LETTER HOE +10D0;AL # GEORGIAN LETTER AN +10D1;AL # GEORGIAN LETTER BAN +10D2;AL # GEORGIAN LETTER GAN +10D3;AL # GEORGIAN LETTER DON +10D4;AL # GEORGIAN LETTER EN +10D5;AL # GEORGIAN LETTER VIN +10D6;AL # GEORGIAN LETTER ZEN +10D7;AL # GEORGIAN LETTER TAN +10D8;AL # GEORGIAN LETTER IN +10D9;AL # GEORGIAN LETTER KAN +10DA;AL # GEORGIAN LETTER LAS +10DB;AL # GEORGIAN LETTER MAN +10DC;AL # GEORGIAN LETTER NAR +10DD;AL # GEORGIAN LETTER ON +10DE;AL # GEORGIAN LETTER PAR +10DF;AL # GEORGIAN LETTER ZHAR +10E0;AL # GEORGIAN LETTER RAE +10E1;AL # GEORGIAN LETTER SAN +10E2;AL # GEORGIAN LETTER TAR +10E3;AL # GEORGIAN LETTER UN +10E4;AL # GEORGIAN LETTER PHAR +10E5;AL # GEORGIAN LETTER KHAR +10E6;AL # GEORGIAN LETTER GHAN +10E7;AL # GEORGIAN LETTER QAR +10E8;AL # GEORGIAN LETTER SHIN +10E9;AL # GEORGIAN LETTER CHIN +10EA;AL # GEORGIAN LETTER CAN +10EB;AL # GEORGIAN LETTER JIL +10EC;AL # GEORGIAN LETTER CIL +10ED;AL # GEORGIAN LETTER CHAR +10EE;AL # GEORGIAN LETTER XAN +10EF;AL # GEORGIAN LETTER JHAN +10F0;AL # GEORGIAN LETTER HAE +10F1;AL # GEORGIAN LETTER HE +10F2;AL # GEORGIAN LETTER HIE +10F3;AL # GEORGIAN LETTER WE +10F4;AL # GEORGIAN LETTER HAR +10F5;AL # GEORGIAN LETTER HOE +10F6;AL # GEORGIAN LETTER FI +10F7;AL # GEORGIAN LETTER YN +10F8;AL # GEORGIAN LETTER ELIFI +10FB;AL # GEORGIAN PARAGRAPH SEPARATOR +1100;ID # HANGUL CHOSEONG KIYEOK +1101;ID # HANGUL CHOSEONG SSANGKIYEOK +1102;ID # HANGUL CHOSEONG NIEUN +1103;ID # HANGUL CHOSEONG TIKEUT +1104;ID # HANGUL CHOSEONG SSANGTIKEUT +1105;ID # HANGUL CHOSEONG RIEUL +1106;ID # HANGUL CHOSEONG MIEUM +1107;ID # HANGUL CHOSEONG PIEUP +1108;ID # HANGUL CHOSEONG SSANGPIEUP +1109;ID # HANGUL CHOSEONG SIOS +110A;ID # HANGUL CHOSEONG SSANGSIOS +110B;ID # HANGUL CHOSEONG IEUNG +110C;ID # HANGUL CHOSEONG CIEUC +110D;ID # HANGUL CHOSEONG SSANGCIEUC +110E;ID # HANGUL CHOSEONG CHIEUCH +110F;ID # HANGUL CHOSEONG KHIEUKH +1110;ID # HANGUL CHOSEONG THIEUTH +1111;ID # HANGUL CHOSEONG PHIEUPH +1112;ID # HANGUL CHOSEONG HIEUH +1113;ID # HANGUL CHOSEONG NIEUN-KIYEOK +1114;ID # HANGUL CHOSEONG SSANGNIEUN +1115;ID # HANGUL CHOSEONG NIEUN-TIKEUT +1116;ID # HANGUL CHOSEONG NIEUN-PIEUP +1117;ID # HANGUL CHOSEONG TIKEUT-KIYEOK +1118;ID # HANGUL CHOSEONG RIEUL-NIEUN +1119;ID # HANGUL CHOSEONG SSANGRIEUL +111A;ID # HANGUL CHOSEONG RIEUL-HIEUH +111B;ID # HANGUL CHOSEONG KAPYEOUNRIEUL +111C;ID # HANGUL CHOSEONG MIEUM-PIEUP +111D;ID # HANGUL CHOSEONG KAPYEOUNMIEUM +111E;ID # HANGUL CHOSEONG PIEUP-KIYEOK +111F;ID # HANGUL CHOSEONG PIEUP-NIEUN +1120;ID # HANGUL CHOSEONG PIEUP-TIKEUT +1121;ID # HANGUL CHOSEONG PIEUP-SIOS +1122;ID # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK +1123;ID # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT +1124;ID # HANGUL CHOSEONG PIEUP-SIOS-PIEUP +1125;ID # HANGUL CHOSEONG PIEUP-SSANGSIOS +1126;ID # HANGUL CHOSEONG PIEUP-SIOS-CIEUC +1127;ID # HANGUL CHOSEONG PIEUP-CIEUC +1128;ID # HANGUL CHOSEONG PIEUP-CHIEUCH +1129;ID # HANGUL CHOSEONG PIEUP-THIEUTH +112A;ID # HANGUL CHOSEONG PIEUP-PHIEUPH +112B;ID # HANGUL CHOSEONG KAPYEOUNPIEUP +112C;ID # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP +112D;ID # HANGUL CHOSEONG SIOS-KIYEOK +112E;ID # HANGUL CHOSEONG SIOS-NIEUN +112F;ID # HANGUL CHOSEONG SIOS-TIKEUT +1130;ID # HANGUL CHOSEONG SIOS-RIEUL +1131;ID # HANGUL CHOSEONG SIOS-MIEUM +1132;ID # HANGUL CHOSEONG SIOS-PIEUP +1133;ID # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK +1134;ID # HANGUL CHOSEONG SIOS-SSANGSIOS +1135;ID # HANGUL CHOSEONG SIOS-IEUNG +1136;ID # HANGUL CHOSEONG SIOS-CIEUC +1137;ID # HANGUL CHOSEONG SIOS-CHIEUCH +1138;ID # HANGUL CHOSEONG SIOS-KHIEUKH +1139;ID # HANGUL CHOSEONG SIOS-THIEUTH +113A;ID # HANGUL CHOSEONG SIOS-PHIEUPH +113B;ID # HANGUL CHOSEONG SIOS-HIEUH +113C;ID # HANGUL CHOSEONG CHITUEUMSIOS +113D;ID # HANGUL CHOSEONG CHITUEUMSSANGSIOS +113E;ID # HANGUL CHOSEONG CEONGCHIEUMSIOS +113F;ID # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS +1140;ID # HANGUL CHOSEONG PANSIOS +1141;ID # HANGUL CHOSEONG IEUNG-KIYEOK +1142;ID # HANGUL CHOSEONG IEUNG-TIKEUT +1143;ID # HANGUL CHOSEONG IEUNG-MIEUM +1144;ID # HANGUL CHOSEONG IEUNG-PIEUP +1145;ID # HANGUL CHOSEONG IEUNG-SIOS +1146;ID # HANGUL CHOSEONG IEUNG-PANSIOS +1147;ID # HANGUL CHOSEONG SSANGIEUNG +1148;ID # HANGUL CHOSEONG IEUNG-CIEUC +1149;ID # HANGUL CHOSEONG IEUNG-CHIEUCH +114A;ID # HANGUL CHOSEONG IEUNG-THIEUTH +114B;ID # HANGUL CHOSEONG IEUNG-PHIEUPH +114C;ID # HANGUL CHOSEONG YESIEUNG +114D;ID # HANGUL CHOSEONG CIEUC-IEUNG +114E;ID # HANGUL CHOSEONG CHITUEUMCIEUC +114F;ID # HANGUL CHOSEONG CHITUEUMSSANGCIEUC +1150;ID # HANGUL CHOSEONG CEONGCHIEUMCIEUC +1151;ID # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC +1152;ID # HANGUL CHOSEONG CHIEUCH-KHIEUKH +1153;ID # HANGUL CHOSEONG CHIEUCH-HIEUH +1154;ID # HANGUL CHOSEONG CHITUEUMCHIEUCH +1155;ID # HANGUL CHOSEONG CEONGCHIEUMCHIEUCH +1156;ID # HANGUL CHOSEONG PHIEUPH-PIEUP +1157;ID # HANGUL CHOSEONG KAPYEOUNPHIEUPH +1158;ID # HANGUL CHOSEONG SSANGHIEUH +1159;ID # HANGUL CHOSEONG YEORINHIEUH +115F;ID # HANGUL CHOSEONG FILLER +1160;CM # HANGUL JUNGSEONG FILLER +1161;CM # HANGUL JUNGSEONG A +1162;CM # HANGUL JUNGSEONG AE +1163;CM # HANGUL JUNGSEONG YA +1164;CM # HANGUL JUNGSEONG YAE +1165;CM # HANGUL JUNGSEONG EO +1166;CM # HANGUL JUNGSEONG E +1167;CM # HANGUL JUNGSEONG YEO +1168;CM # HANGUL JUNGSEONG YE +1169;CM # HANGUL JUNGSEONG O +116A;CM # HANGUL JUNGSEONG WA +116B;CM # HANGUL JUNGSEONG WAE +116C;CM # HANGUL JUNGSEONG OE +116D;CM # HANGUL JUNGSEONG YO +116E;CM # HANGUL JUNGSEONG U +116F;CM # HANGUL JUNGSEONG WEO +1170;CM # HANGUL JUNGSEONG WE +1171;CM # HANGUL JUNGSEONG WI +1172;CM # HANGUL JUNGSEONG YU +1173;CM # HANGUL JUNGSEONG EU +1174;CM # HANGUL JUNGSEONG YI +1175;CM # HANGUL JUNGSEONG I +1176;CM # HANGUL JUNGSEONG A-O +1177;CM # HANGUL JUNGSEONG A-U +1178;CM # HANGUL JUNGSEONG YA-O +1179;CM # HANGUL JUNGSEONG YA-YO +117A;CM # HANGUL JUNGSEONG EO-O +117B;CM # HANGUL JUNGSEONG EO-U +117C;CM # HANGUL JUNGSEONG EO-EU +117D;CM # HANGUL JUNGSEONG YEO-O +117E;CM # HANGUL JUNGSEONG YEO-U +117F;CM # HANGUL JUNGSEONG O-EO +1180;CM # HANGUL JUNGSEONG O-E +1181;CM # HANGUL JUNGSEONG O-YE +1182;CM # HANGUL JUNGSEONG O-O +1183;CM # HANGUL JUNGSEONG O-U +1184;CM # HANGUL JUNGSEONG YO-YA +1185;CM # HANGUL JUNGSEONG YO-YAE +1186;CM # HANGUL JUNGSEONG YO-YEO +1187;CM # HANGUL JUNGSEONG YO-O +1188;CM # HANGUL JUNGSEONG YO-I +1189;CM # HANGUL JUNGSEONG U-A +118A;CM # HANGUL JUNGSEONG U-AE +118B;CM # HANGUL JUNGSEONG U-EO-EU +118C;CM # HANGUL JUNGSEONG U-YE +118D;CM # HANGUL JUNGSEONG U-U +118E;CM # HANGUL JUNGSEONG YU-A +118F;CM # HANGUL JUNGSEONG YU-EO +1190;CM # HANGUL JUNGSEONG YU-E +1191;CM # HANGUL JUNGSEONG YU-YEO +1192;CM # HANGUL JUNGSEONG YU-YE +1193;CM # HANGUL JUNGSEONG YU-U +1194;CM # HANGUL JUNGSEONG YU-I +1195;CM # HANGUL JUNGSEONG EU-U +1196;CM # HANGUL JUNGSEONG EU-EU +1197;CM # HANGUL JUNGSEONG YI-U +1198;CM # HANGUL JUNGSEONG I-A +1199;CM # HANGUL JUNGSEONG I-YA +119A;CM # HANGUL JUNGSEONG I-O +119B;CM # HANGUL JUNGSEONG I-U +119C;CM # HANGUL JUNGSEONG I-EU +119D;CM # HANGUL JUNGSEONG I-ARAEA +119E;CM # HANGUL JUNGSEONG ARAEA +119F;CM # HANGUL JUNGSEONG ARAEA-EO +11A0;CM # HANGUL JUNGSEONG ARAEA-U +11A1;CM # HANGUL JUNGSEONG ARAEA-I +11A2;CM # HANGUL JUNGSEONG SSANGARAEA +11A8;CM # HANGUL JONGSEONG KIYEOK +11A9;CM # HANGUL JONGSEONG SSANGKIYEOK +11AA;CM # HANGUL JONGSEONG KIYEOK-SIOS +11AB;CM # HANGUL JONGSEONG NIEUN +11AC;CM # HANGUL JONGSEONG NIEUN-CIEUC +11AD;CM # HANGUL JONGSEONG NIEUN-HIEUH +11AE;CM # HANGUL JONGSEONG TIKEUT +11AF;CM # HANGUL JONGSEONG RIEUL +11B0;CM # HANGUL JONGSEONG RIEUL-KIYEOK +11B1;CM # HANGUL JONGSEONG RIEUL-MIEUM +11B2;CM # HANGUL JONGSEONG RIEUL-PIEUP +11B3;CM # HANGUL JONGSEONG RIEUL-SIOS +11B4;CM # HANGUL JONGSEONG RIEUL-THIEUTH +11B5;CM # HANGUL JONGSEONG RIEUL-PHIEUPH +11B6;CM # HANGUL JONGSEONG RIEUL-HIEUH +11B7;CM # HANGUL JONGSEONG MIEUM +11B8;CM # HANGUL JONGSEONG PIEUP +11B9;CM # HANGUL JONGSEONG PIEUP-SIOS +11BA;CM # HANGUL JONGSEONG SIOS +11BB;CM # HANGUL JONGSEONG SSANGSIOS +11BC;CM # HANGUL JONGSEONG IEUNG +11BD;CM # HANGUL JONGSEONG CIEUC +11BE;CM # HANGUL JONGSEONG CHIEUCH +11BF;CM # HANGUL JONGSEONG KHIEUKH +11C0;CM # HANGUL JONGSEONG THIEUTH +11C1;CM # HANGUL JONGSEONG PHIEUPH +11C2;CM # HANGUL JONGSEONG HIEUH +11C3;CM # HANGUL JONGSEONG KIYEOK-RIEUL +11C4;CM # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK +11C5;CM # HANGUL JONGSEONG NIEUN-KIYEOK +11C6;CM # HANGUL JONGSEONG NIEUN-TIKEUT +11C7;CM # HANGUL JONGSEONG NIEUN-SIOS +11C8;CM # HANGUL JONGSEONG NIEUN-PANSIOS +11C9;CM # HANGUL JONGSEONG NIEUN-THIEUTH +11CA;CM # HANGUL JONGSEONG TIKEUT-KIYEOK +11CB;CM # HANGUL JONGSEONG TIKEUT-RIEUL +11CC;CM # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS +11CD;CM # HANGUL JONGSEONG RIEUL-NIEUN +11CE;CM # HANGUL JONGSEONG RIEUL-TIKEUT +11CF;CM # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH +11D0;CM # HANGUL JONGSEONG SSANGRIEUL +11D1;CM # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK +11D2;CM # HANGUL JONGSEONG RIEUL-MIEUM-SIOS +11D3;CM # HANGUL JONGSEONG RIEUL-PIEUP-SIOS +11D4;CM # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH +11D5;CM # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP +11D6;CM # HANGUL JONGSEONG RIEUL-SSANGSIOS +11D7;CM # HANGUL JONGSEONG RIEUL-PANSIOS +11D8;CM # HANGUL JONGSEONG RIEUL-KHIEUKH +11D9;CM # HANGUL JONGSEONG RIEUL-YEORINHIEUH +11DA;CM # HANGUL JONGSEONG MIEUM-KIYEOK +11DB;CM # HANGUL JONGSEONG MIEUM-RIEUL +11DC;CM # HANGUL JONGSEONG MIEUM-PIEUP +11DD;CM # HANGUL JONGSEONG MIEUM-SIOS +11DE;CM # HANGUL JONGSEONG MIEUM-SSANGSIOS +11DF;CM # HANGUL JONGSEONG MIEUM-PANSIOS +11E0;CM # HANGUL JONGSEONG MIEUM-CHIEUCH +11E1;CM # HANGUL JONGSEONG MIEUM-HIEUH +11E2;CM # HANGUL JONGSEONG KAPYEOUNMIEUM +11E3;CM # HANGUL JONGSEONG PIEUP-RIEUL +11E4;CM # HANGUL JONGSEONG PIEUP-PHIEUPH +11E5;CM # HANGUL JONGSEONG PIEUP-HIEUH +11E6;CM # HANGUL JONGSEONG KAPYEOUNPIEUP +11E7;CM # HANGUL JONGSEONG SIOS-KIYEOK +11E8;CM # HANGUL JONGSEONG SIOS-TIKEUT +11E9;CM # HANGUL JONGSEONG SIOS-RIEUL +11EA;CM # HANGUL JONGSEONG SIOS-PIEUP +11EB;CM # HANGUL JONGSEONG PANSIOS +11EC;CM # HANGUL JONGSEONG IEUNG-KIYEOK +11ED;CM # HANGUL JONGSEONG IEUNG-SSANGKIYEOK +11EE;CM # HANGUL JONGSEONG SSANGIEUNG +11EF;CM # HANGUL JONGSEONG IEUNG-KHIEUKH +11F0;CM # HANGUL JONGSEONG YESIEUNG +11F1;CM # HANGUL JONGSEONG YESIEUNG-SIOS +11F2;CM # HANGUL JONGSEONG YESIEUNG-PANSIOS +11F3;CM # HANGUL JONGSEONG PHIEUPH-PIEUP +11F4;CM # HANGUL JONGSEONG KAPYEOUNPHIEUPH +11F5;CM # HANGUL JONGSEONG HIEUH-NIEUN +11F6;CM # HANGUL JONGSEONG HIEUH-RIEUL +11F7;CM # HANGUL JONGSEONG HIEUH-MIEUM +11F8;CM # HANGUL JONGSEONG HIEUH-PIEUP +11F9;CM # HANGUL JONGSEONG YEORINHIEUH +1200;AL # ETHIOPIC SYLLABLE HA +1201;AL # ETHIOPIC SYLLABLE HU +1202;AL # ETHIOPIC SYLLABLE HI +1203;AL # ETHIOPIC SYLLABLE HAA +1204;AL # ETHIOPIC SYLLABLE HEE +1205;AL # ETHIOPIC SYLLABLE HE +1206;AL # ETHIOPIC SYLLABLE HO +1208;AL # ETHIOPIC SYLLABLE LA +1209;AL # ETHIOPIC SYLLABLE LU +120A;AL # ETHIOPIC SYLLABLE LI +120B;AL # ETHIOPIC SYLLABLE LAA +120C;AL # ETHIOPIC SYLLABLE LEE +120D;AL # ETHIOPIC SYLLABLE LE +120E;AL # ETHIOPIC SYLLABLE LO +120F;AL # ETHIOPIC SYLLABLE LWA +1210;AL # ETHIOPIC SYLLABLE HHA +1211;AL # ETHIOPIC SYLLABLE HHU +1212;AL # ETHIOPIC SYLLABLE HHI +1213;AL # ETHIOPIC SYLLABLE HHAA +1214;AL # ETHIOPIC SYLLABLE HHEE +1215;AL # ETHIOPIC SYLLABLE HHE +1216;AL # ETHIOPIC SYLLABLE HHO +1217;AL # ETHIOPIC SYLLABLE HHWA +1218;AL # ETHIOPIC SYLLABLE MA +1219;AL # ETHIOPIC SYLLABLE MU +121A;AL # ETHIOPIC SYLLABLE MI +121B;AL # ETHIOPIC SYLLABLE MAA +121C;AL # ETHIOPIC SYLLABLE MEE +121D;AL # ETHIOPIC SYLLABLE ME +121E;AL # ETHIOPIC SYLLABLE MO +121F;AL # ETHIOPIC SYLLABLE MWA +1220;AL # ETHIOPIC SYLLABLE SZA +1221;AL # ETHIOPIC SYLLABLE SZU +1222;AL # ETHIOPIC SYLLABLE SZI +1223;AL # ETHIOPIC SYLLABLE SZAA +1224;AL # ETHIOPIC SYLLABLE SZEE +1225;AL # ETHIOPIC SYLLABLE SZE +1226;AL # ETHIOPIC SYLLABLE SZO +1227;AL # ETHIOPIC SYLLABLE SZWA +1228;AL # ETHIOPIC SYLLABLE RA +1229;AL # ETHIOPIC SYLLABLE RU +122A;AL # ETHIOPIC SYLLABLE RI +122B;AL # ETHIOPIC SYLLABLE RAA +122C;AL # ETHIOPIC SYLLABLE REE +122D;AL # ETHIOPIC SYLLABLE RE +122E;AL # ETHIOPIC SYLLABLE RO +122F;AL # ETHIOPIC SYLLABLE RWA +1230;AL # ETHIOPIC SYLLABLE SA +1231;AL # ETHIOPIC SYLLABLE SU +1232;AL # ETHIOPIC SYLLABLE SI +1233;AL # ETHIOPIC SYLLABLE SAA +1234;AL # ETHIOPIC SYLLABLE SEE +1235;AL # ETHIOPIC SYLLABLE SE +1236;AL # ETHIOPIC SYLLABLE SO +1237;AL # ETHIOPIC SYLLABLE SWA +1238;AL # ETHIOPIC SYLLABLE SHA +1239;AL # ETHIOPIC SYLLABLE SHU +123A;AL # ETHIOPIC SYLLABLE SHI +123B;AL # ETHIOPIC SYLLABLE SHAA +123C;AL # ETHIOPIC SYLLABLE SHEE +123D;AL # ETHIOPIC SYLLABLE SHE +123E;AL # ETHIOPIC SYLLABLE SHO +123F;AL # ETHIOPIC SYLLABLE SHWA +1240;AL # ETHIOPIC SYLLABLE QA +1241;AL # ETHIOPIC SYLLABLE QU +1242;AL # ETHIOPIC SYLLABLE QI +1243;AL # ETHIOPIC SYLLABLE QAA +1244;AL # ETHIOPIC SYLLABLE QEE +1245;AL # ETHIOPIC SYLLABLE QE +1246;AL # ETHIOPIC SYLLABLE QO +1248;AL # ETHIOPIC SYLLABLE QWA +124A;AL # ETHIOPIC SYLLABLE QWI +124B;AL # ETHIOPIC SYLLABLE QWAA +124C;AL # ETHIOPIC SYLLABLE QWEE +124D;AL # ETHIOPIC SYLLABLE QWE +1250;AL # ETHIOPIC SYLLABLE QHA +1251;AL # ETHIOPIC SYLLABLE QHU +1252;AL # ETHIOPIC SYLLABLE QHI +1253;AL # ETHIOPIC SYLLABLE QHAA +1254;AL # ETHIOPIC SYLLABLE QHEE +1255;AL # ETHIOPIC SYLLABLE QHE +1256;AL # ETHIOPIC SYLLABLE QHO +1258;AL # ETHIOPIC SYLLABLE QHWA +125A;AL # ETHIOPIC SYLLABLE QHWI +125B;AL # ETHIOPIC SYLLABLE QHWAA +125C;AL # ETHIOPIC SYLLABLE QHWEE +125D;AL # ETHIOPIC SYLLABLE QHWE +1260;AL # ETHIOPIC SYLLABLE BA +1261;AL # ETHIOPIC SYLLABLE BU +1262;AL # ETHIOPIC SYLLABLE BI +1263;AL # ETHIOPIC SYLLABLE BAA +1264;AL # ETHIOPIC SYLLABLE BEE +1265;AL # ETHIOPIC SYLLABLE BE +1266;AL # ETHIOPIC SYLLABLE BO +1267;AL # ETHIOPIC SYLLABLE BWA +1268;AL # ETHIOPIC SYLLABLE VA +1269;AL # ETHIOPIC SYLLABLE VU +126A;AL # ETHIOPIC SYLLABLE VI +126B;AL # ETHIOPIC SYLLABLE VAA +126C;AL # ETHIOPIC SYLLABLE VEE +126D;AL # ETHIOPIC SYLLABLE VE +126E;AL # ETHIOPIC SYLLABLE VO +126F;AL # ETHIOPIC SYLLABLE VWA +1270;AL # ETHIOPIC SYLLABLE TA +1271;AL # ETHIOPIC SYLLABLE TU +1272;AL # ETHIOPIC SYLLABLE TI +1273;AL # ETHIOPIC SYLLABLE TAA +1274;AL # ETHIOPIC SYLLABLE TEE +1275;AL # ETHIOPIC SYLLABLE TE +1276;AL # ETHIOPIC SYLLABLE TO +1277;AL # ETHIOPIC SYLLABLE TWA +1278;AL # ETHIOPIC SYLLABLE CA +1279;AL # ETHIOPIC SYLLABLE CU +127A;AL # ETHIOPIC SYLLABLE CI +127B;AL # ETHIOPIC SYLLABLE CAA +127C;AL # ETHIOPIC SYLLABLE CEE +127D;AL # ETHIOPIC SYLLABLE CE +127E;AL # ETHIOPIC SYLLABLE CO +127F;AL # ETHIOPIC SYLLABLE CWA +1280;AL # ETHIOPIC SYLLABLE XA +1281;AL # ETHIOPIC SYLLABLE XU +1282;AL # ETHIOPIC SYLLABLE XI +1283;AL # ETHIOPIC SYLLABLE XAA +1284;AL # ETHIOPIC SYLLABLE XEE +1285;AL # ETHIOPIC SYLLABLE XE +1286;AL # ETHIOPIC SYLLABLE XO +1288;AL # ETHIOPIC SYLLABLE XWA +128A;AL # ETHIOPIC SYLLABLE XWI +128B;AL # ETHIOPIC SYLLABLE XWAA +128C;AL # ETHIOPIC SYLLABLE XWEE +128D;AL # ETHIOPIC SYLLABLE XWE +1290;AL # ETHIOPIC SYLLABLE NA +1291;AL # ETHIOPIC SYLLABLE NU +1292;AL # ETHIOPIC SYLLABLE NI +1293;AL # ETHIOPIC SYLLABLE NAA +1294;AL # ETHIOPIC SYLLABLE NEE +1295;AL # ETHIOPIC SYLLABLE NE +1296;AL # ETHIOPIC SYLLABLE NO +1297;AL # ETHIOPIC SYLLABLE NWA +1298;AL # ETHIOPIC SYLLABLE NYA +1299;AL # ETHIOPIC SYLLABLE NYU +129A;AL # ETHIOPIC SYLLABLE NYI +129B;AL # ETHIOPIC SYLLABLE NYAA +129C;AL # ETHIOPIC SYLLABLE NYEE +129D;AL # ETHIOPIC SYLLABLE NYE +129E;AL # ETHIOPIC SYLLABLE NYO +129F;AL # ETHIOPIC SYLLABLE NYWA +12A0;AL # ETHIOPIC SYLLABLE GLOTTAL A +12A1;AL # ETHIOPIC SYLLABLE GLOTTAL U +12A2;AL # ETHIOPIC SYLLABLE GLOTTAL I +12A3;AL # ETHIOPIC SYLLABLE GLOTTAL AA +12A4;AL # ETHIOPIC SYLLABLE GLOTTAL EE +12A5;AL # ETHIOPIC SYLLABLE GLOTTAL E +12A6;AL # ETHIOPIC SYLLABLE GLOTTAL O +12A7;AL # ETHIOPIC SYLLABLE GLOTTAL WA +12A8;AL # ETHIOPIC SYLLABLE KA +12A9;AL # ETHIOPIC SYLLABLE KU +12AA;AL # ETHIOPIC SYLLABLE KI +12AB;AL # ETHIOPIC SYLLABLE KAA +12AC;AL # ETHIOPIC SYLLABLE KEE +12AD;AL # ETHIOPIC SYLLABLE KE +12AE;AL # ETHIOPIC SYLLABLE KO +12B0;AL # ETHIOPIC SYLLABLE KWA +12B2;AL # ETHIOPIC SYLLABLE KWI +12B3;AL # ETHIOPIC SYLLABLE KWAA +12B4;AL # ETHIOPIC SYLLABLE KWEE +12B5;AL # ETHIOPIC SYLLABLE KWE +12B8;AL # ETHIOPIC SYLLABLE KXA +12B9;AL # ETHIOPIC SYLLABLE KXU +12BA;AL # ETHIOPIC SYLLABLE KXI +12BB;AL # ETHIOPIC SYLLABLE KXAA +12BC;AL # ETHIOPIC SYLLABLE KXEE +12BD;AL # ETHIOPIC SYLLABLE KXE +12BE;AL # ETHIOPIC SYLLABLE KXO +12C0;AL # ETHIOPIC SYLLABLE KXWA +12C2;AL # ETHIOPIC SYLLABLE KXWI +12C3;AL # ETHIOPIC SYLLABLE KXWAA +12C4;AL # ETHIOPIC SYLLABLE KXWEE +12C5;AL # ETHIOPIC SYLLABLE KXWE +12C8;AL # ETHIOPIC SYLLABLE WA +12C9;AL # ETHIOPIC SYLLABLE WU +12CA;AL # ETHIOPIC SYLLABLE WI +12CB;AL # ETHIOPIC SYLLABLE WAA +12CC;AL # ETHIOPIC SYLLABLE WEE +12CD;AL # ETHIOPIC SYLLABLE WE +12CE;AL # ETHIOPIC SYLLABLE WO +12D0;AL # ETHIOPIC SYLLABLE PHARYNGEAL A +12D1;AL # ETHIOPIC SYLLABLE PHARYNGEAL U +12D2;AL # ETHIOPIC SYLLABLE PHARYNGEAL I +12D3;AL # ETHIOPIC SYLLABLE PHARYNGEAL AA +12D4;AL # ETHIOPIC SYLLABLE PHARYNGEAL EE +12D5;AL # ETHIOPIC SYLLABLE PHARYNGEAL E +12D6;AL # ETHIOPIC SYLLABLE PHARYNGEAL O +12D8;AL # ETHIOPIC SYLLABLE ZA +12D9;AL # ETHIOPIC SYLLABLE ZU +12DA;AL # ETHIOPIC SYLLABLE ZI +12DB;AL # ETHIOPIC SYLLABLE ZAA +12DC;AL # ETHIOPIC SYLLABLE ZEE +12DD;AL # ETHIOPIC SYLLABLE ZE +12DE;AL # ETHIOPIC SYLLABLE ZO +12DF;AL # ETHIOPIC SYLLABLE ZWA +12E0;AL # ETHIOPIC SYLLABLE ZHA +12E1;AL # ETHIOPIC SYLLABLE ZHU +12E2;AL # ETHIOPIC SYLLABLE ZHI +12E3;AL # ETHIOPIC SYLLABLE ZHAA +12E4;AL # ETHIOPIC SYLLABLE ZHEE +12E5;AL # ETHIOPIC SYLLABLE ZHE +12E6;AL # ETHIOPIC SYLLABLE ZHO +12E7;AL # ETHIOPIC SYLLABLE ZHWA +12E8;AL # ETHIOPIC SYLLABLE YA +12E9;AL # ETHIOPIC SYLLABLE YU +12EA;AL # ETHIOPIC SYLLABLE YI +12EB;AL # ETHIOPIC SYLLABLE YAA +12EC;AL # ETHIOPIC SYLLABLE YEE +12ED;AL # ETHIOPIC SYLLABLE YE +12EE;AL # ETHIOPIC SYLLABLE YO +12F0;AL # ETHIOPIC SYLLABLE DA +12F1;AL # ETHIOPIC SYLLABLE DU +12F2;AL # ETHIOPIC SYLLABLE DI +12F3;AL # ETHIOPIC SYLLABLE DAA +12F4;AL # ETHIOPIC SYLLABLE DEE +12F5;AL # ETHIOPIC SYLLABLE DE +12F6;AL # ETHIOPIC SYLLABLE DO +12F7;AL # ETHIOPIC SYLLABLE DWA +12F8;AL # ETHIOPIC SYLLABLE DDA +12F9;AL # ETHIOPIC SYLLABLE DDU +12FA;AL # ETHIOPIC SYLLABLE DDI +12FB;AL # ETHIOPIC SYLLABLE DDAA +12FC;AL # ETHIOPIC SYLLABLE DDEE +12FD;AL # ETHIOPIC SYLLABLE DDE +12FE;AL # ETHIOPIC SYLLABLE DDO +12FF;AL # ETHIOPIC SYLLABLE DDWA +1300;AL # ETHIOPIC SYLLABLE JA +1301;AL # ETHIOPIC SYLLABLE JU +1302;AL # ETHIOPIC SYLLABLE JI +1303;AL # ETHIOPIC SYLLABLE JAA +1304;AL # ETHIOPIC SYLLABLE JEE +1305;AL # ETHIOPIC SYLLABLE JE +1306;AL # ETHIOPIC SYLLABLE JO +1307;AL # ETHIOPIC SYLLABLE JWA +1308;AL # ETHIOPIC SYLLABLE GA +1309;AL # ETHIOPIC SYLLABLE GU +130A;AL # ETHIOPIC SYLLABLE GI +130B;AL # ETHIOPIC SYLLABLE GAA +130C;AL # ETHIOPIC SYLLABLE GEE +130D;AL # ETHIOPIC SYLLABLE GE +130E;AL # ETHIOPIC SYLLABLE GO +1310;AL # ETHIOPIC SYLLABLE GWA +1312;AL # ETHIOPIC SYLLABLE GWI +1313;AL # ETHIOPIC SYLLABLE GWAA +1314;AL # ETHIOPIC SYLLABLE GWEE +1315;AL # ETHIOPIC SYLLABLE GWE +1318;AL # ETHIOPIC SYLLABLE GGA +1319;AL # ETHIOPIC SYLLABLE GGU +131A;AL # ETHIOPIC SYLLABLE GGI +131B;AL # ETHIOPIC SYLLABLE GGAA +131C;AL # ETHIOPIC SYLLABLE GGEE +131D;AL # ETHIOPIC SYLLABLE GGE +131E;AL # ETHIOPIC SYLLABLE GGO +1320;AL # ETHIOPIC SYLLABLE THA +1321;AL # ETHIOPIC SYLLABLE THU +1322;AL # ETHIOPIC SYLLABLE THI +1323;AL # ETHIOPIC SYLLABLE THAA +1324;AL # ETHIOPIC SYLLABLE THEE +1325;AL # ETHIOPIC SYLLABLE THE +1326;AL # ETHIOPIC SYLLABLE THO +1327;AL # ETHIOPIC SYLLABLE THWA +1328;AL # ETHIOPIC SYLLABLE CHA +1329;AL # ETHIOPIC SYLLABLE CHU +132A;AL # ETHIOPIC SYLLABLE CHI +132B;AL # ETHIOPIC SYLLABLE CHAA +132C;AL # ETHIOPIC SYLLABLE CHEE +132D;AL # ETHIOPIC SYLLABLE CHE +132E;AL # ETHIOPIC SYLLABLE CHO +132F;AL # ETHIOPIC SYLLABLE CHWA +1330;AL # ETHIOPIC SYLLABLE PHA +1331;AL # ETHIOPIC SYLLABLE PHU +1332;AL # ETHIOPIC SYLLABLE PHI +1333;AL # ETHIOPIC SYLLABLE PHAA +1334;AL # ETHIOPIC SYLLABLE PHEE +1335;AL # ETHIOPIC SYLLABLE PHE +1336;AL # ETHIOPIC SYLLABLE PHO +1337;AL # ETHIOPIC SYLLABLE PHWA +1338;AL # ETHIOPIC SYLLABLE TSA +1339;AL # ETHIOPIC SYLLABLE TSU +133A;AL # ETHIOPIC SYLLABLE TSI +133B;AL # ETHIOPIC SYLLABLE TSAA +133C;AL # ETHIOPIC SYLLABLE TSEE +133D;AL # ETHIOPIC SYLLABLE TSE +133E;AL # ETHIOPIC SYLLABLE TSO +133F;AL # ETHIOPIC SYLLABLE TSWA +1340;AL # ETHIOPIC SYLLABLE TZA +1341;AL # ETHIOPIC SYLLABLE TZU +1342;AL # ETHIOPIC SYLLABLE TZI +1343;AL # ETHIOPIC SYLLABLE TZAA +1344;AL # ETHIOPIC SYLLABLE TZEE +1345;AL # ETHIOPIC SYLLABLE TZE +1346;AL # ETHIOPIC SYLLABLE TZO +1348;AL # ETHIOPIC SYLLABLE FA +1349;AL # ETHIOPIC SYLLABLE FU +134A;AL # ETHIOPIC SYLLABLE FI +134B;AL # ETHIOPIC SYLLABLE FAA +134C;AL # ETHIOPIC SYLLABLE FEE +134D;AL # ETHIOPIC SYLLABLE FE +134E;AL # ETHIOPIC SYLLABLE FO +134F;AL # ETHIOPIC SYLLABLE FWA +1350;AL # ETHIOPIC SYLLABLE PA +1351;AL # ETHIOPIC SYLLABLE PU +1352;AL # ETHIOPIC SYLLABLE PI +1353;AL # ETHIOPIC SYLLABLE PAA +1354;AL # ETHIOPIC SYLLABLE PEE +1355;AL # ETHIOPIC SYLLABLE PE +1356;AL # ETHIOPIC SYLLABLE PO +1357;AL # ETHIOPIC SYLLABLE PWA +1358;AL # ETHIOPIC SYLLABLE RYA +1359;AL # ETHIOPIC SYLLABLE MYA +135A;AL # ETHIOPIC SYLLABLE FYA +1361;BA # ETHIOPIC WORDSPACE +1362;AL # ETHIOPIC FULL STOP +1363;AL # ETHIOPIC COMMA +1364;AL # ETHIOPIC SEMICOLON +1365;AL # ETHIOPIC COLON +1366;AL # ETHIOPIC PREFACE COLON +1367;AL # ETHIOPIC QUESTION MARK +1368;AL # ETHIOPIC PARAGRAPH SEPARATOR +1369;NU # ETHIOPIC DIGIT ONE +136A;NU # ETHIOPIC DIGIT TWO +136B;NU # ETHIOPIC DIGIT THREE +136C;NU # ETHIOPIC DIGIT FOUR +136D;NU # ETHIOPIC DIGIT FIVE +136E;NU # ETHIOPIC DIGIT SIX +136F;NU # ETHIOPIC DIGIT SEVEN +1370;NU # ETHIOPIC DIGIT EIGHT +1371;NU # ETHIOPIC DIGIT NINE +1372;AL # ETHIOPIC NUMBER TEN +1373;AL # ETHIOPIC NUMBER TWENTY +1374;AL # ETHIOPIC NUMBER THIRTY +1375;AL # ETHIOPIC NUMBER FORTY +1376;AL # ETHIOPIC NUMBER FIFTY +1377;AL # ETHIOPIC NUMBER SIXTY +1378;AL # ETHIOPIC NUMBER SEVENTY +1379;AL # ETHIOPIC NUMBER EIGHTY +137A;AL # ETHIOPIC NUMBER NINETY +137B;AL # ETHIOPIC NUMBER HUNDRED +137C;AL # ETHIOPIC NUMBER TEN THOUSAND +13A0;AL # CHEROKEE LETTER A +13A1;AL # CHEROKEE LETTER E +13A2;AL # CHEROKEE LETTER I +13A3;AL # CHEROKEE LETTER O +13A4;AL # CHEROKEE LETTER U +13A5;AL # CHEROKEE LETTER V +13A6;AL # CHEROKEE LETTER GA +13A7;AL # CHEROKEE LETTER KA +13A8;AL # CHEROKEE LETTER GE +13A9;AL # CHEROKEE LETTER GI +13AA;AL # CHEROKEE LETTER GO +13AB;AL # CHEROKEE LETTER GU +13AC;AL # CHEROKEE LETTER GV +13AD;AL # CHEROKEE LETTER HA +13AE;AL # CHEROKEE LETTER HE +13AF;AL # CHEROKEE LETTER HI +13B0;AL # CHEROKEE LETTER HO +13B1;AL # CHEROKEE LETTER HU +13B2;AL # CHEROKEE LETTER HV +13B3;AL # CHEROKEE LETTER LA +13B4;AL # CHEROKEE LETTER LE +13B5;AL # CHEROKEE LETTER LI +13B6;AL # CHEROKEE LETTER LO +13B7;AL # CHEROKEE LETTER LU +13B8;AL # CHEROKEE LETTER LV +13B9;AL # CHEROKEE LETTER MA +13BA;AL # CHEROKEE LETTER ME +13BB;AL # CHEROKEE LETTER MI +13BC;AL # CHEROKEE LETTER MO +13BD;AL # CHEROKEE LETTER MU +13BE;AL # CHEROKEE LETTER NA +13BF;AL # CHEROKEE LETTER HNA +13C0;AL # CHEROKEE LETTER NAH +13C1;AL # CHEROKEE LETTER NE +13C2;AL # CHEROKEE LETTER NI +13C3;AL # CHEROKEE LETTER NO +13C4;AL # CHEROKEE LETTER NU +13C5;AL # CHEROKEE LETTER NV +13C6;AL # CHEROKEE LETTER QUA +13C7;AL # CHEROKEE LETTER QUE +13C8;AL # CHEROKEE LETTER QUI +13C9;AL # CHEROKEE LETTER QUO +13CA;AL # CHEROKEE LETTER QUU +13CB;AL # CHEROKEE LETTER QUV +13CC;AL # CHEROKEE LETTER SA +13CD;AL # CHEROKEE LETTER S +13CE;AL # CHEROKEE LETTER SE +13CF;AL # CHEROKEE LETTER SI +13D0;AL # CHEROKEE LETTER SO +13D1;AL # CHEROKEE LETTER SU +13D2;AL # CHEROKEE LETTER SV +13D3;AL # CHEROKEE LETTER DA +13D4;AL # CHEROKEE LETTER TA +13D5;AL # CHEROKEE LETTER DE +13D6;AL # CHEROKEE LETTER TE +13D7;AL # CHEROKEE LETTER DI +13D8;AL # CHEROKEE LETTER TI +13D9;AL # CHEROKEE LETTER DO +13DA;AL # CHEROKEE LETTER DU +13DB;AL # CHEROKEE LETTER DV +13DC;AL # CHEROKEE LETTER DLA +13DD;AL # CHEROKEE LETTER TLA +13DE;AL # CHEROKEE LETTER TLE +13DF;AL # CHEROKEE LETTER TLI +13E0;AL # CHEROKEE LETTER TLO +13E1;AL # CHEROKEE LETTER TLU +13E2;AL # CHEROKEE LETTER TLV +13E3;AL # CHEROKEE LETTER TSA +13E4;AL # CHEROKEE LETTER TSE +13E5;AL # CHEROKEE LETTER TSI +13E6;AL # CHEROKEE LETTER TSO +13E7;AL # CHEROKEE LETTER TSU +13E8;AL # CHEROKEE LETTER TSV +13E9;AL # CHEROKEE LETTER WA +13EA;AL # CHEROKEE LETTER WE +13EB;AL # CHEROKEE LETTER WI +13EC;AL # CHEROKEE LETTER WO +13ED;AL # CHEROKEE LETTER WU +13EE;AL # CHEROKEE LETTER WV +13EF;AL # CHEROKEE LETTER YA +13F0;AL # CHEROKEE LETTER YE +13F1;AL # CHEROKEE LETTER YI +13F2;AL # CHEROKEE LETTER YO +13F3;AL # CHEROKEE LETTER YU +13F4;AL # CHEROKEE LETTER YV +1401;AL # CANADIAN SYLLABICS E +1402;AL # CANADIAN SYLLABICS AAI +1403;AL # CANADIAN SYLLABICS I +1404;AL # CANADIAN SYLLABICS II +1405;AL # CANADIAN SYLLABICS O +1406;AL # CANADIAN SYLLABICS OO +1407;AL # CANADIAN SYLLABICS Y-CREE OO +1408;AL # CANADIAN SYLLABICS CARRIER EE +1409;AL # CANADIAN SYLLABICS CARRIER I +140A;AL # CANADIAN SYLLABICS A +140B;AL # CANADIAN SYLLABICS AA +140C;AL # CANADIAN SYLLABICS WE +140D;AL # CANADIAN SYLLABICS WEST-CREE WE +140E;AL # CANADIAN SYLLABICS WI +140F;AL # CANADIAN SYLLABICS WEST-CREE WI +1410;AL # CANADIAN SYLLABICS WII +1411;AL # CANADIAN SYLLABICS WEST-CREE WII +1412;AL # CANADIAN SYLLABICS WO +1413;AL # CANADIAN SYLLABICS WEST-CREE WO +1414;AL # CANADIAN SYLLABICS WOO +1415;AL # CANADIAN SYLLABICS WEST-CREE WOO +1416;AL # CANADIAN SYLLABICS NASKAPI WOO +1417;AL # CANADIAN SYLLABICS WA +1418;AL # CANADIAN SYLLABICS WEST-CREE WA +1419;AL # CANADIAN SYLLABICS WAA +141A;AL # CANADIAN SYLLABICS WEST-CREE WAA +141B;AL # CANADIAN SYLLABICS NASKAPI WAA +141C;AL # CANADIAN SYLLABICS AI +141D;AL # CANADIAN SYLLABICS Y-CREE W +141E;AL # CANADIAN SYLLABICS GLOTTAL STOP +141F;AL # CANADIAN SYLLABICS FINAL ACUTE +1420;AL # CANADIAN SYLLABICS FINAL GRAVE +1421;AL # CANADIAN SYLLABICS FINAL BOTTOM HALF RING +1422;AL # CANADIAN SYLLABICS FINAL TOP HALF RING +1423;AL # CANADIAN SYLLABICS FINAL RIGHT HALF RING +1424;AL # CANADIAN SYLLABICS FINAL RING +1425;AL # CANADIAN SYLLABICS FINAL DOUBLE ACUTE +1426;AL # CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES +1427;AL # CANADIAN SYLLABICS FINAL MIDDLE DOT +1428;AL # CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE +1429;AL # CANADIAN SYLLABICS FINAL PLUS +142A;AL # CANADIAN SYLLABICS FINAL DOWN TACK +142B;AL # CANADIAN SYLLABICS EN +142C;AL # CANADIAN SYLLABICS IN +142D;AL # CANADIAN SYLLABICS ON +142E;AL # CANADIAN SYLLABICS AN +142F;AL # CANADIAN SYLLABICS PE +1430;AL # CANADIAN SYLLABICS PAAI +1431;AL # CANADIAN SYLLABICS PI +1432;AL # CANADIAN SYLLABICS PII +1433;AL # CANADIAN SYLLABICS PO +1434;AL # CANADIAN SYLLABICS POO +1435;AL # CANADIAN SYLLABICS Y-CREE POO +1436;AL # CANADIAN SYLLABICS CARRIER HEE +1437;AL # CANADIAN SYLLABICS CARRIER HI +1438;AL # CANADIAN SYLLABICS PA +1439;AL # CANADIAN SYLLABICS PAA +143A;AL # CANADIAN SYLLABICS PWE +143B;AL # CANADIAN SYLLABICS WEST-CREE PWE +143C;AL # CANADIAN SYLLABICS PWI +143D;AL # CANADIAN SYLLABICS WEST-CREE PWI +143E;AL # CANADIAN SYLLABICS PWII +143F;AL # CANADIAN SYLLABICS WEST-CREE PWII +1440;AL # CANADIAN SYLLABICS PWO +1441;AL # CANADIAN SYLLABICS WEST-CREE PWO +1442;AL # CANADIAN SYLLABICS PWOO +1443;AL # CANADIAN SYLLABICS WEST-CREE PWOO +1444;AL # CANADIAN SYLLABICS PWA +1445;AL # CANADIAN SYLLABICS WEST-CREE PWA +1446;AL # CANADIAN SYLLABICS PWAA +1447;AL # CANADIAN SYLLABICS WEST-CREE PWAA +1448;AL # CANADIAN SYLLABICS Y-CREE PWAA +1449;AL # CANADIAN SYLLABICS P +144A;AL # CANADIAN SYLLABICS WEST-CREE P +144B;AL # CANADIAN SYLLABICS CARRIER H +144C;AL # CANADIAN SYLLABICS TE +144D;AL # CANADIAN SYLLABICS TAAI +144E;AL # CANADIAN SYLLABICS TI +144F;AL # CANADIAN SYLLABICS TII +1450;AL # CANADIAN SYLLABICS TO +1451;AL # CANADIAN SYLLABICS TOO +1452;AL # CANADIAN SYLLABICS Y-CREE TOO +1453;AL # CANADIAN SYLLABICS CARRIER DEE +1454;AL # CANADIAN SYLLABICS CARRIER DI +1455;AL # CANADIAN SYLLABICS TA +1456;AL # CANADIAN SYLLABICS TAA +1457;AL # CANADIAN SYLLABICS TWE +1458;AL # CANADIAN SYLLABICS WEST-CREE TWE +1459;AL # CANADIAN SYLLABICS TWI +145A;AL # CANADIAN SYLLABICS WEST-CREE TWI +145B;AL # CANADIAN SYLLABICS TWII +145C;AL # CANADIAN SYLLABICS WEST-CREE TWII +145D;AL # CANADIAN SYLLABICS TWO +145E;AL # CANADIAN SYLLABICS WEST-CREE TWO +145F;AL # CANADIAN SYLLABICS TWOO +1460;AL # CANADIAN SYLLABICS WEST-CREE TWOO +1461;AL # CANADIAN SYLLABICS TWA +1462;AL # CANADIAN SYLLABICS WEST-CREE TWA +1463;AL # CANADIAN SYLLABICS TWAA +1464;AL # CANADIAN SYLLABICS WEST-CREE TWAA +1465;AL # CANADIAN SYLLABICS NASKAPI TWAA +1466;AL # CANADIAN SYLLABICS T +1467;AL # CANADIAN SYLLABICS TTE +1468;AL # CANADIAN SYLLABICS TTI +1469;AL # CANADIAN SYLLABICS TTO +146A;AL # CANADIAN SYLLABICS TTA +146B;AL # CANADIAN SYLLABICS KE +146C;AL # CANADIAN SYLLABICS KAAI +146D;AL # CANADIAN SYLLABICS KI +146E;AL # CANADIAN SYLLABICS KII +146F;AL # CANADIAN SYLLABICS KO +1470;AL # CANADIAN SYLLABICS KOO +1471;AL # CANADIAN SYLLABICS Y-CREE KOO +1472;AL # CANADIAN SYLLABICS KA +1473;AL # CANADIAN SYLLABICS KAA +1474;AL # CANADIAN SYLLABICS KWE +1475;AL # CANADIAN SYLLABICS WEST-CREE KWE +1476;AL # CANADIAN SYLLABICS KWI +1477;AL # CANADIAN SYLLABICS WEST-CREE KWI +1478;AL # CANADIAN SYLLABICS KWII +1479;AL # CANADIAN SYLLABICS WEST-CREE KWII +147A;AL # CANADIAN SYLLABICS KWO +147B;AL # CANADIAN SYLLABICS WEST-CREE KWO +147C;AL # CANADIAN SYLLABICS KWOO +147D;AL # CANADIAN SYLLABICS WEST-CREE KWOO +147E;AL # CANADIAN SYLLABICS KWA +147F;AL # CANADIAN SYLLABICS WEST-CREE KWA +1480;AL # CANADIAN SYLLABICS KWAA +1481;AL # CANADIAN SYLLABICS WEST-CREE KWAA +1482;AL # CANADIAN SYLLABICS NASKAPI KWAA +1483;AL # CANADIAN SYLLABICS K +1484;AL # CANADIAN SYLLABICS KW +1485;AL # CANADIAN SYLLABICS SOUTH-SLAVEY KEH +1486;AL # CANADIAN SYLLABICS SOUTH-SLAVEY KIH +1487;AL # CANADIAN SYLLABICS SOUTH-SLAVEY KOH +1488;AL # CANADIAN SYLLABICS SOUTH-SLAVEY KAH +1489;AL # CANADIAN SYLLABICS CE +148A;AL # CANADIAN SYLLABICS CAAI +148B;AL # CANADIAN SYLLABICS CI +148C;AL # CANADIAN SYLLABICS CII +148D;AL # CANADIAN SYLLABICS CO +148E;AL # CANADIAN SYLLABICS COO +148F;AL # CANADIAN SYLLABICS Y-CREE COO +1490;AL # CANADIAN SYLLABICS CA +1491;AL # CANADIAN SYLLABICS CAA +1492;AL # CANADIAN SYLLABICS CWE +1493;AL # CANADIAN SYLLABICS WEST-CREE CWE +1494;AL # CANADIAN SYLLABICS CWI +1495;AL # CANADIAN SYLLABICS WEST-CREE CWI +1496;AL # CANADIAN SYLLABICS CWII +1497;AL # CANADIAN SYLLABICS WEST-CREE CWII +1498;AL # CANADIAN SYLLABICS CWO +1499;AL # CANADIAN SYLLABICS WEST-CREE CWO +149A;AL # CANADIAN SYLLABICS CWOO +149B;AL # CANADIAN SYLLABICS WEST-CREE CWOO +149C;AL # CANADIAN SYLLABICS CWA +149D;AL # CANADIAN SYLLABICS WEST-CREE CWA +149E;AL # CANADIAN SYLLABICS CWAA +149F;AL # CANADIAN SYLLABICS WEST-CREE CWAA +14A0;AL # CANADIAN SYLLABICS NASKAPI CWAA +14A1;AL # CANADIAN SYLLABICS C +14A2;AL # CANADIAN SYLLABICS SAYISI TH +14A3;AL # CANADIAN SYLLABICS ME +14A4;AL # CANADIAN SYLLABICS MAAI +14A5;AL # CANADIAN SYLLABICS MI +14A6;AL # CANADIAN SYLLABICS MII +14A7;AL # CANADIAN SYLLABICS MO +14A8;AL # CANADIAN SYLLABICS MOO +14A9;AL # CANADIAN SYLLABICS Y-CREE MOO +14AA;AL # CANADIAN SYLLABICS MA +14AB;AL # CANADIAN SYLLABICS MAA +14AC;AL # CANADIAN SYLLABICS MWE +14AD;AL # CANADIAN SYLLABICS WEST-CREE MWE +14AE;AL # CANADIAN SYLLABICS MWI +14AF;AL # CANADIAN SYLLABICS WEST-CREE MWI +14B0;AL # CANADIAN SYLLABICS MWII +14B1;AL # CANADIAN SYLLABICS WEST-CREE MWII +14B2;AL # CANADIAN SYLLABICS MWO +14B3;AL # CANADIAN SYLLABICS WEST-CREE MWO +14B4;AL # CANADIAN SYLLABICS MWOO +14B5;AL # CANADIAN SYLLABICS WEST-CREE MWOO +14B6;AL # CANADIAN SYLLABICS MWA +14B7;AL # CANADIAN SYLLABICS WEST-CREE MWA +14B8;AL # CANADIAN SYLLABICS MWAA +14B9;AL # CANADIAN SYLLABICS WEST-CREE MWAA +14BA;AL # CANADIAN SYLLABICS NASKAPI MWAA +14BB;AL # CANADIAN SYLLABICS M +14BC;AL # CANADIAN SYLLABICS WEST-CREE M +14BD;AL # CANADIAN SYLLABICS MH +14BE;AL # CANADIAN SYLLABICS ATHAPASCAN M +14BF;AL # CANADIAN SYLLABICS SAYISI M +14C0;AL # CANADIAN SYLLABICS NE +14C1;AL # CANADIAN SYLLABICS NAAI +14C2;AL # CANADIAN SYLLABICS NI +14C3;AL # CANADIAN SYLLABICS NII +14C4;AL # CANADIAN SYLLABICS NO +14C5;AL # CANADIAN SYLLABICS NOO +14C6;AL # CANADIAN SYLLABICS Y-CREE NOO +14C7;AL # CANADIAN SYLLABICS NA +14C8;AL # CANADIAN SYLLABICS NAA +14C9;AL # CANADIAN SYLLABICS NWE +14CA;AL # CANADIAN SYLLABICS WEST-CREE NWE +14CB;AL # CANADIAN SYLLABICS NWA +14CC;AL # CANADIAN SYLLABICS WEST-CREE NWA +14CD;AL # CANADIAN SYLLABICS NWAA +14CE;AL # CANADIAN SYLLABICS WEST-CREE NWAA +14CF;AL # CANADIAN SYLLABICS NASKAPI NWAA +14D0;AL # CANADIAN SYLLABICS N +14D1;AL # CANADIAN SYLLABICS CARRIER NG +14D2;AL # CANADIAN SYLLABICS NH +14D3;AL # CANADIAN SYLLABICS LE +14D4;AL # CANADIAN SYLLABICS LAAI +14D5;AL # CANADIAN SYLLABICS LI +14D6;AL # CANADIAN SYLLABICS LII +14D7;AL # CANADIAN SYLLABICS LO +14D8;AL # CANADIAN SYLLABICS LOO +14D9;AL # CANADIAN SYLLABICS Y-CREE LOO +14DA;AL # CANADIAN SYLLABICS LA +14DB;AL # CANADIAN SYLLABICS LAA +14DC;AL # CANADIAN SYLLABICS LWE +14DD;AL # CANADIAN SYLLABICS WEST-CREE LWE +14DE;AL # CANADIAN SYLLABICS LWI +14DF;AL # CANADIAN SYLLABICS WEST-CREE LWI +14E0;AL # CANADIAN SYLLABICS LWII +14E1;AL # CANADIAN SYLLABICS WEST-CREE LWII +14E2;AL # CANADIAN SYLLABICS LWO +14E3;AL # CANADIAN SYLLABICS WEST-CREE LWO +14E4;AL # CANADIAN SYLLABICS LWOO +14E5;AL # CANADIAN SYLLABICS WEST-CREE LWOO +14E6;AL # CANADIAN SYLLABICS LWA +14E7;AL # CANADIAN SYLLABICS WEST-CREE LWA +14E8;AL # CANADIAN SYLLABICS LWAA +14E9;AL # CANADIAN SYLLABICS WEST-CREE LWAA +14EA;AL # CANADIAN SYLLABICS L +14EB;AL # CANADIAN SYLLABICS WEST-CREE L +14EC;AL # CANADIAN SYLLABICS MEDIAL L +14ED;AL # CANADIAN SYLLABICS SE +14EE;AL # CANADIAN SYLLABICS SAAI +14EF;AL # CANADIAN SYLLABICS SI +14F0;AL # CANADIAN SYLLABICS SII +14F1;AL # CANADIAN SYLLABICS SO +14F2;AL # CANADIAN SYLLABICS SOO +14F3;AL # CANADIAN SYLLABICS Y-CREE SOO +14F4;AL # CANADIAN SYLLABICS SA +14F5;AL # CANADIAN SYLLABICS SAA +14F6;AL # CANADIAN SYLLABICS SWE +14F7;AL # CANADIAN SYLLABICS WEST-CREE SWE +14F8;AL # CANADIAN SYLLABICS SWI +14F9;AL # CANADIAN SYLLABICS WEST-CREE SWI +14FA;AL # CANADIAN SYLLABICS SWII +14FB;AL # CANADIAN SYLLABICS WEST-CREE SWII +14FC;AL # CANADIAN SYLLABICS SWO +14FD;AL # CANADIAN SYLLABICS WEST-CREE SWO +14FE;AL # CANADIAN SYLLABICS SWOO +14FF;AL # CANADIAN SYLLABICS WEST-CREE SWOO +1500;AL # CANADIAN SYLLABICS SWA +1501;AL # CANADIAN SYLLABICS WEST-CREE SWA +1502;AL # CANADIAN SYLLABICS SWAA +1503;AL # CANADIAN SYLLABICS WEST-CREE SWAA +1504;AL # CANADIAN SYLLABICS NASKAPI SWAA +1505;AL # CANADIAN SYLLABICS S +1506;AL # CANADIAN SYLLABICS ATHAPASCAN S +1507;AL # CANADIAN SYLLABICS SW +1508;AL # CANADIAN SYLLABICS BLACKFOOT S +1509;AL # CANADIAN SYLLABICS MOOSE-CREE SK +150A;AL # CANADIAN SYLLABICS NASKAPI SKW +150B;AL # CANADIAN SYLLABICS NASKAPI S-W +150C;AL # CANADIAN SYLLABICS NASKAPI SPWA +150D;AL # CANADIAN SYLLABICS NASKAPI STWA +150E;AL # CANADIAN SYLLABICS NASKAPI SKWA +150F;AL # CANADIAN SYLLABICS NASKAPI SCWA +1510;AL # CANADIAN SYLLABICS SHE +1511;AL # CANADIAN SYLLABICS SHI +1512;AL # CANADIAN SYLLABICS SHII +1513;AL # CANADIAN SYLLABICS SHO +1514;AL # CANADIAN SYLLABICS SHOO +1515;AL # CANADIAN SYLLABICS SHA +1516;AL # CANADIAN SYLLABICS SHAA +1517;AL # CANADIAN SYLLABICS SHWE +1518;AL # CANADIAN SYLLABICS WEST-CREE SHWE +1519;AL # CANADIAN SYLLABICS SHWI +151A;AL # CANADIAN SYLLABICS WEST-CREE SHWI +151B;AL # CANADIAN SYLLABICS SHWII +151C;AL # CANADIAN SYLLABICS WEST-CREE SHWII +151D;AL # CANADIAN SYLLABICS SHWO +151E;AL # CANADIAN SYLLABICS WEST-CREE SHWO +151F;AL # CANADIAN SYLLABICS SHWOO +1520;AL # CANADIAN SYLLABICS WEST-CREE SHWOO +1521;AL # CANADIAN SYLLABICS SHWA +1522;AL # CANADIAN SYLLABICS WEST-CREE SHWA +1523;AL # CANADIAN SYLLABICS SHWAA +1524;AL # CANADIAN SYLLABICS WEST-CREE SHWAA +1525;AL # CANADIAN SYLLABICS SH +1526;AL # CANADIAN SYLLABICS YE +1527;AL # CANADIAN SYLLABICS YAAI +1528;AL # CANADIAN SYLLABICS YI +1529;AL # CANADIAN SYLLABICS YII +152A;AL # CANADIAN SYLLABICS YO +152B;AL # CANADIAN SYLLABICS YOO +152C;AL # CANADIAN SYLLABICS Y-CREE YOO +152D;AL # CANADIAN SYLLABICS YA +152E;AL # CANADIAN SYLLABICS YAA +152F;AL # CANADIAN SYLLABICS YWE +1530;AL # CANADIAN SYLLABICS WEST-CREE YWE +1531;AL # CANADIAN SYLLABICS YWI +1532;AL # CANADIAN SYLLABICS WEST-CREE YWI +1533;AL # CANADIAN SYLLABICS YWII +1534;AL # CANADIAN SYLLABICS WEST-CREE YWII +1535;AL # CANADIAN SYLLABICS YWO +1536;AL # CANADIAN SYLLABICS WEST-CREE YWO +1537;AL # CANADIAN SYLLABICS YWOO +1538;AL # CANADIAN SYLLABICS WEST-CREE YWOO +1539;AL # CANADIAN SYLLABICS YWA +153A;AL # CANADIAN SYLLABICS WEST-CREE YWA +153B;AL # CANADIAN SYLLABICS YWAA +153C;AL # CANADIAN SYLLABICS WEST-CREE YWAA +153D;AL # CANADIAN SYLLABICS NASKAPI YWAA +153E;AL # CANADIAN SYLLABICS Y +153F;AL # CANADIAN SYLLABICS BIBLE-CREE Y +1540;AL # CANADIAN SYLLABICS WEST-CREE Y +1541;AL # CANADIAN SYLLABICS SAYISI YI +1542;AL # CANADIAN SYLLABICS RE +1543;AL # CANADIAN SYLLABICS R-CREE RE +1544;AL # CANADIAN SYLLABICS WEST-CREE LE +1545;AL # CANADIAN SYLLABICS RAAI +1546;AL # CANADIAN SYLLABICS RI +1547;AL # CANADIAN SYLLABICS RII +1548;AL # CANADIAN SYLLABICS RO +1549;AL # CANADIAN SYLLABICS ROO +154A;AL # CANADIAN SYLLABICS WEST-CREE LO +154B;AL # CANADIAN SYLLABICS RA +154C;AL # CANADIAN SYLLABICS RAA +154D;AL # CANADIAN SYLLABICS WEST-CREE LA +154E;AL # CANADIAN SYLLABICS RWAA +154F;AL # CANADIAN SYLLABICS WEST-CREE RWAA +1550;AL # CANADIAN SYLLABICS R +1551;AL # CANADIAN SYLLABICS WEST-CREE R +1552;AL # CANADIAN SYLLABICS MEDIAL R +1553;AL # CANADIAN SYLLABICS FE +1554;AL # CANADIAN SYLLABICS FAAI +1555;AL # CANADIAN SYLLABICS FI +1556;AL # CANADIAN SYLLABICS FII +1557;AL # CANADIAN SYLLABICS FO +1558;AL # CANADIAN SYLLABICS FOO +1559;AL # CANADIAN SYLLABICS FA +155A;AL # CANADIAN SYLLABICS FAA +155B;AL # CANADIAN SYLLABICS FWAA +155C;AL # CANADIAN SYLLABICS WEST-CREE FWAA +155D;AL # CANADIAN SYLLABICS F +155E;AL # CANADIAN SYLLABICS THE +155F;AL # CANADIAN SYLLABICS N-CREE THE +1560;AL # CANADIAN SYLLABICS THI +1561;AL # CANADIAN SYLLABICS N-CREE THI +1562;AL # CANADIAN SYLLABICS THII +1563;AL # CANADIAN SYLLABICS N-CREE THII +1564;AL # CANADIAN SYLLABICS THO +1565;AL # CANADIAN SYLLABICS THOO +1566;AL # CANADIAN SYLLABICS THA +1567;AL # CANADIAN SYLLABICS THAA +1568;AL # CANADIAN SYLLABICS THWAA +1569;AL # CANADIAN SYLLABICS WEST-CREE THWAA +156A;AL # CANADIAN SYLLABICS TH +156B;AL # CANADIAN SYLLABICS TTHE +156C;AL # CANADIAN SYLLABICS TTHI +156D;AL # CANADIAN SYLLABICS TTHO +156E;AL # CANADIAN SYLLABICS TTHA +156F;AL # CANADIAN SYLLABICS TTH +1570;AL # CANADIAN SYLLABICS TYE +1571;AL # CANADIAN SYLLABICS TYI +1572;AL # CANADIAN SYLLABICS TYO +1573;AL # CANADIAN SYLLABICS TYA +1574;AL # CANADIAN SYLLABICS NUNAVIK HE +1575;AL # CANADIAN SYLLABICS NUNAVIK HI +1576;AL # CANADIAN SYLLABICS NUNAVIK HII +1577;AL # CANADIAN SYLLABICS NUNAVIK HO +1578;AL # CANADIAN SYLLABICS NUNAVIK HOO +1579;AL # CANADIAN SYLLABICS NUNAVIK HA +157A;AL # CANADIAN SYLLABICS NUNAVIK HAA +157B;AL # CANADIAN SYLLABICS NUNAVIK H +157C;AL # CANADIAN SYLLABICS NUNAVUT H +157D;AL # CANADIAN SYLLABICS HK +157E;AL # CANADIAN SYLLABICS QAAI +157F;AL # CANADIAN SYLLABICS QI +1580;AL # CANADIAN SYLLABICS QII +1581;AL # CANADIAN SYLLABICS QO +1582;AL # CANADIAN SYLLABICS QOO +1583;AL # CANADIAN SYLLABICS QA +1584;AL # CANADIAN SYLLABICS QAA +1585;AL # CANADIAN SYLLABICS Q +1586;AL # CANADIAN SYLLABICS TLHE +1587;AL # CANADIAN SYLLABICS TLHI +1588;AL # CANADIAN SYLLABICS TLHO +1589;AL # CANADIAN SYLLABICS TLHA +158A;AL # CANADIAN SYLLABICS WEST-CREE RE +158B;AL # CANADIAN SYLLABICS WEST-CREE RI +158C;AL # CANADIAN SYLLABICS WEST-CREE RO +158D;AL # CANADIAN SYLLABICS WEST-CREE RA +158E;AL # CANADIAN SYLLABICS NGAAI +158F;AL # CANADIAN SYLLABICS NGI +1590;AL # CANADIAN SYLLABICS NGII +1591;AL # CANADIAN SYLLABICS NGO +1592;AL # CANADIAN SYLLABICS NGOO +1593;AL # CANADIAN SYLLABICS NGA +1594;AL # CANADIAN SYLLABICS NGAA +1595;AL # CANADIAN SYLLABICS NG +1596;AL # CANADIAN SYLLABICS NNG +1597;AL # CANADIAN SYLLABICS SAYISI SHE +1598;AL # CANADIAN SYLLABICS SAYISI SHI +1599;AL # CANADIAN SYLLABICS SAYISI SHO +159A;AL # CANADIAN SYLLABICS SAYISI SHA +159B;AL # CANADIAN SYLLABICS WOODS-CREE THE +159C;AL # CANADIAN SYLLABICS WOODS-CREE THI +159D;AL # CANADIAN SYLLABICS WOODS-CREE THO +159E;AL # CANADIAN SYLLABICS WOODS-CREE THA +159F;AL # CANADIAN SYLLABICS WOODS-CREE TH +15A0;AL # CANADIAN SYLLABICS LHI +15A1;AL # CANADIAN SYLLABICS LHII +15A2;AL # CANADIAN SYLLABICS LHO +15A3;AL # CANADIAN SYLLABICS LHOO +15A4;AL # CANADIAN SYLLABICS LHA +15A5;AL # CANADIAN SYLLABICS LHAA +15A6;AL # CANADIAN SYLLABICS LH +15A7;AL # CANADIAN SYLLABICS TH-CREE THE +15A8;AL # CANADIAN SYLLABICS TH-CREE THI +15A9;AL # CANADIAN SYLLABICS TH-CREE THII +15AA;AL # CANADIAN SYLLABICS TH-CREE THO +15AB;AL # CANADIAN SYLLABICS TH-CREE THOO +15AC;AL # CANADIAN SYLLABICS TH-CREE THA +15AD;AL # CANADIAN SYLLABICS TH-CREE THAA +15AE;AL # CANADIAN SYLLABICS TH-CREE TH +15AF;AL # CANADIAN SYLLABICS AIVILIK B +15B0;AL # CANADIAN SYLLABICS BLACKFOOT E +15B1;AL # CANADIAN SYLLABICS BLACKFOOT I +15B2;AL # CANADIAN SYLLABICS BLACKFOOT O +15B3;AL # CANADIAN SYLLABICS BLACKFOOT A +15B4;AL # CANADIAN SYLLABICS BLACKFOOT WE +15B5;AL # CANADIAN SYLLABICS BLACKFOOT WI +15B6;AL # CANADIAN SYLLABICS BLACKFOOT WO +15B7;AL # CANADIAN SYLLABICS BLACKFOOT WA +15B8;AL # CANADIAN SYLLABICS BLACKFOOT NE +15B9;AL # CANADIAN SYLLABICS BLACKFOOT NI +15BA;AL # CANADIAN SYLLABICS BLACKFOOT NO +15BB;AL # CANADIAN SYLLABICS BLACKFOOT NA +15BC;AL # CANADIAN SYLLABICS BLACKFOOT KE +15BD;AL # CANADIAN SYLLABICS BLACKFOOT KI +15BE;AL # CANADIAN SYLLABICS BLACKFOOT KO +15BF;AL # CANADIAN SYLLABICS BLACKFOOT KA +15C0;AL # CANADIAN SYLLABICS SAYISI HE +15C1;AL # CANADIAN SYLLABICS SAYISI HI +15C2;AL # CANADIAN SYLLABICS SAYISI HO +15C3;AL # CANADIAN SYLLABICS SAYISI HA +15C4;AL # CANADIAN SYLLABICS CARRIER GHU +15C5;AL # CANADIAN SYLLABICS CARRIER GHO +15C6;AL # CANADIAN SYLLABICS CARRIER GHE +15C7;AL # CANADIAN SYLLABICS CARRIER GHEE +15C8;AL # CANADIAN SYLLABICS CARRIER GHI +15C9;AL # CANADIAN SYLLABICS CARRIER GHA +15CA;AL # CANADIAN SYLLABICS CARRIER RU +15CB;AL # CANADIAN SYLLABICS CARRIER RO +15CC;AL # CANADIAN SYLLABICS CARRIER RE +15CD;AL # CANADIAN SYLLABICS CARRIER REE +15CE;AL # CANADIAN SYLLABICS CARRIER RI +15CF;AL # CANADIAN SYLLABICS CARRIER RA +15D0;AL # CANADIAN SYLLABICS CARRIER WU +15D1;AL # CANADIAN SYLLABICS CARRIER WO +15D2;AL # CANADIAN SYLLABICS CARRIER WE +15D3;AL # CANADIAN SYLLABICS CARRIER WEE +15D4;AL # CANADIAN SYLLABICS CARRIER WI +15D5;AL # CANADIAN SYLLABICS CARRIER WA +15D6;AL # CANADIAN SYLLABICS CARRIER HWU +15D7;AL # CANADIAN SYLLABICS CARRIER HWO +15D8;AL # CANADIAN SYLLABICS CARRIER HWE +15D9;AL # CANADIAN SYLLABICS CARRIER HWEE +15DA;AL # CANADIAN SYLLABICS CARRIER HWI +15DB;AL # CANADIAN SYLLABICS CARRIER HWA +15DC;AL # CANADIAN SYLLABICS CARRIER THU +15DD;AL # CANADIAN SYLLABICS CARRIER THO +15DE;AL # CANADIAN SYLLABICS CARRIER THE +15DF;AL # CANADIAN SYLLABICS CARRIER THEE +15E0;AL # CANADIAN SYLLABICS CARRIER THI +15E1;AL # CANADIAN SYLLABICS CARRIER THA +15E2;AL # CANADIAN SYLLABICS CARRIER TTU +15E3;AL # CANADIAN SYLLABICS CARRIER TTO +15E4;AL # CANADIAN SYLLABICS CARRIER TTE +15E5;AL # CANADIAN SYLLABICS CARRIER TTEE +15E6;AL # CANADIAN SYLLABICS CARRIER TTI +15E7;AL # CANADIAN SYLLABICS CARRIER TTA +15E8;AL # CANADIAN SYLLABICS CARRIER PU +15E9;AL # CANADIAN SYLLABICS CARRIER PO +15EA;AL # CANADIAN SYLLABICS CARRIER PE +15EB;AL # CANADIAN SYLLABICS CARRIER PEE +15EC;AL # CANADIAN SYLLABICS CARRIER PI +15ED;AL # CANADIAN SYLLABICS CARRIER PA +15EE;AL # CANADIAN SYLLABICS CARRIER P +15EF;AL # CANADIAN SYLLABICS CARRIER GU +15F0;AL # CANADIAN SYLLABICS CARRIER GO +15F1;AL # CANADIAN SYLLABICS CARRIER GE +15F2;AL # CANADIAN SYLLABICS CARRIER GEE +15F3;AL # CANADIAN SYLLABICS CARRIER GI +15F4;AL # CANADIAN SYLLABICS CARRIER GA +15F5;AL # CANADIAN SYLLABICS CARRIER KHU +15F6;AL # CANADIAN SYLLABICS CARRIER KHO +15F7;AL # CANADIAN SYLLABICS CARRIER KHE +15F8;AL # CANADIAN SYLLABICS CARRIER KHEE +15F9;AL # CANADIAN SYLLABICS CARRIER KHI +15FA;AL # CANADIAN SYLLABICS CARRIER KHA +15FB;AL # CANADIAN SYLLABICS CARRIER KKU +15FC;AL # CANADIAN SYLLABICS CARRIER KKO +15FD;AL # CANADIAN SYLLABICS CARRIER KKE +15FE;AL # CANADIAN SYLLABICS CARRIER KKEE +15FF;AL # CANADIAN SYLLABICS CARRIER KKI +1600;AL # CANADIAN SYLLABICS CARRIER KKA +1601;AL # CANADIAN SYLLABICS CARRIER KK +1602;AL # CANADIAN SYLLABICS CARRIER NU +1603;AL # CANADIAN SYLLABICS CARRIER NO +1604;AL # CANADIAN SYLLABICS CARRIER NE +1605;AL # CANADIAN SYLLABICS CARRIER NEE +1606;AL # CANADIAN SYLLABICS CARRIER NI +1607;AL # CANADIAN SYLLABICS CARRIER NA +1608;AL # CANADIAN SYLLABICS CARRIER MU +1609;AL # CANADIAN SYLLABICS CARRIER MO +160A;AL # CANADIAN SYLLABICS CARRIER ME +160B;AL # CANADIAN SYLLABICS CARRIER MEE +160C;AL # CANADIAN SYLLABICS CARRIER MI +160D;AL # CANADIAN SYLLABICS CARRIER MA +160E;AL # CANADIAN SYLLABICS CARRIER YU +160F;AL # CANADIAN SYLLABICS CARRIER YO +1610;AL # CANADIAN SYLLABICS CARRIER YE +1611;AL # CANADIAN SYLLABICS CARRIER YEE +1612;AL # CANADIAN SYLLABICS CARRIER YI +1613;AL # CANADIAN SYLLABICS CARRIER YA +1614;AL # CANADIAN SYLLABICS CARRIER JU +1615;AL # CANADIAN SYLLABICS SAYISI JU +1616;AL # CANADIAN SYLLABICS CARRIER JO +1617;AL # CANADIAN SYLLABICS CARRIER JE +1618;AL # CANADIAN SYLLABICS CARRIER JEE +1619;AL # CANADIAN SYLLABICS CARRIER JI +161A;AL # CANADIAN SYLLABICS SAYISI JI +161B;AL # CANADIAN SYLLABICS CARRIER JA +161C;AL # CANADIAN SYLLABICS CARRIER JJU +161D;AL # CANADIAN SYLLABICS CARRIER JJO +161E;AL # CANADIAN SYLLABICS CARRIER JJE +161F;AL # CANADIAN SYLLABICS CARRIER JJEE +1620;AL # CANADIAN SYLLABICS CARRIER JJI +1621;AL # CANADIAN SYLLABICS CARRIER JJA +1622;AL # CANADIAN SYLLABICS CARRIER LU +1623;AL # CANADIAN SYLLABICS CARRIER LO +1624;AL # CANADIAN SYLLABICS CARRIER LE +1625;AL # CANADIAN SYLLABICS CARRIER LEE +1626;AL # CANADIAN SYLLABICS CARRIER LI +1627;AL # CANADIAN SYLLABICS CARRIER LA +1628;AL # CANADIAN SYLLABICS CARRIER DLU +1629;AL # CANADIAN SYLLABICS CARRIER DLO +162A;AL # CANADIAN SYLLABICS CARRIER DLE +162B;AL # CANADIAN SYLLABICS CARRIER DLEE +162C;AL # CANADIAN SYLLABICS CARRIER DLI +162D;AL # CANADIAN SYLLABICS CARRIER DLA +162E;AL # CANADIAN SYLLABICS CARRIER LHU +162F;AL # CANADIAN SYLLABICS CARRIER LHO +1630;AL # CANADIAN SYLLABICS CARRIER LHE +1631;AL # CANADIAN SYLLABICS CARRIER LHEE +1632;AL # CANADIAN SYLLABICS CARRIER LHI +1633;AL # CANADIAN SYLLABICS CARRIER LHA +1634;AL # CANADIAN SYLLABICS CARRIER TLHU +1635;AL # CANADIAN SYLLABICS CARRIER TLHO +1636;AL # CANADIAN SYLLABICS CARRIER TLHE +1637;AL # CANADIAN SYLLABICS CARRIER TLHEE +1638;AL # CANADIAN SYLLABICS CARRIER TLHI +1639;AL # CANADIAN SYLLABICS CARRIER TLHA +163A;AL # CANADIAN SYLLABICS CARRIER TLU +163B;AL # CANADIAN SYLLABICS CARRIER TLO +163C;AL # CANADIAN SYLLABICS CARRIER TLE +163D;AL # CANADIAN SYLLABICS CARRIER TLEE +163E;AL # CANADIAN SYLLABICS CARRIER TLI +163F;AL # CANADIAN SYLLABICS CARRIER TLA +1640;AL # CANADIAN SYLLABICS CARRIER ZU +1641;AL # CANADIAN SYLLABICS CARRIER ZO +1642;AL # CANADIAN SYLLABICS CARRIER ZE +1643;AL # CANADIAN SYLLABICS CARRIER ZEE +1644;AL # CANADIAN SYLLABICS CARRIER ZI +1645;AL # CANADIAN SYLLABICS CARRIER ZA +1646;AL # CANADIAN SYLLABICS CARRIER Z +1647;AL # CANADIAN SYLLABICS CARRIER INITIAL Z +1648;AL # CANADIAN SYLLABICS CARRIER DZU +1649;AL # CANADIAN SYLLABICS CARRIER DZO +164A;AL # CANADIAN SYLLABICS CARRIER DZE +164B;AL # CANADIAN SYLLABICS CARRIER DZEE +164C;AL # CANADIAN SYLLABICS CARRIER DZI +164D;AL # CANADIAN SYLLABICS CARRIER DZA +164E;AL # CANADIAN SYLLABICS CARRIER SU +164F;AL # CANADIAN SYLLABICS CARRIER SO +1650;AL # CANADIAN SYLLABICS CARRIER SE +1651;AL # CANADIAN SYLLABICS CARRIER SEE +1652;AL # CANADIAN SYLLABICS CARRIER SI +1653;AL # CANADIAN SYLLABICS CARRIER SA +1654;AL # CANADIAN SYLLABICS CARRIER SHU +1655;AL # CANADIAN SYLLABICS CARRIER SHO +1656;AL # CANADIAN SYLLABICS CARRIER SHE +1657;AL # CANADIAN SYLLABICS CARRIER SHEE +1658;AL # CANADIAN SYLLABICS CARRIER SHI +1659;AL # CANADIAN SYLLABICS CARRIER SHA +165A;AL # CANADIAN SYLLABICS CARRIER SH +165B;AL # CANADIAN SYLLABICS CARRIER TSU +165C;AL # CANADIAN SYLLABICS CARRIER TSO +165D;AL # CANADIAN SYLLABICS CARRIER TSE +165E;AL # CANADIAN SYLLABICS CARRIER TSEE +165F;AL # CANADIAN SYLLABICS CARRIER TSI +1660;AL # CANADIAN SYLLABICS CARRIER TSA +1661;AL # CANADIAN SYLLABICS CARRIER CHU +1662;AL # CANADIAN SYLLABICS CARRIER CHO +1663;AL # CANADIAN SYLLABICS CARRIER CHE +1664;AL # CANADIAN SYLLABICS CARRIER CHEE +1665;AL # CANADIAN SYLLABICS CARRIER CHI +1666;AL # CANADIAN SYLLABICS CARRIER CHA +1667;AL # CANADIAN SYLLABICS CARRIER TTSU +1668;AL # CANADIAN SYLLABICS CARRIER TTSO +1669;AL # CANADIAN SYLLABICS CARRIER TTSE +166A;AL # CANADIAN SYLLABICS CARRIER TTSEE +166B;AL # CANADIAN SYLLABICS CARRIER TTSI +166C;AL # CANADIAN SYLLABICS CARRIER TTSA +166D;AL # CANADIAN SYLLABICS CHI SIGN +166E;AL # CANADIAN SYLLABICS FULL STOP +166F;AL # CANADIAN SYLLABICS QAI +1670;AL # CANADIAN SYLLABICS NGAI +1671;AL # CANADIAN SYLLABICS NNGI +1672;AL # CANADIAN SYLLABICS NNGII +1673;AL # CANADIAN SYLLABICS NNGO +1674;AL # CANADIAN SYLLABICS NNGOO +1675;AL # CANADIAN SYLLABICS NNGA +1676;AL # CANADIAN SYLLABICS NNGAA +1680;BA # OGHAM SPACE MARK +1681;AL # OGHAM LETTER BEITH +1682;AL # OGHAM LETTER LUIS +1683;AL # OGHAM LETTER FEARN +1684;AL # OGHAM LETTER SAIL +1685;AL # OGHAM LETTER NION +1686;AL # OGHAM LETTER UATH +1687;AL # OGHAM LETTER DAIR +1688;AL # OGHAM LETTER TINNE +1689;AL # OGHAM LETTER COLL +168A;AL # OGHAM LETTER CEIRT +168B;AL # OGHAM LETTER MUIN +168C;AL # OGHAM LETTER GORT +168D;AL # OGHAM LETTER NGEADAL +168E;AL # OGHAM LETTER STRAIF +168F;AL # OGHAM LETTER RUIS +1690;AL # OGHAM LETTER AILM +1691;AL # OGHAM LETTER ONN +1692;AL # OGHAM LETTER UR +1693;AL # OGHAM LETTER EADHADH +1694;AL # OGHAM LETTER IODHADH +1695;AL # OGHAM LETTER EABHADH +1696;AL # OGHAM LETTER OR +1697;AL # OGHAM LETTER UILLEANN +1698;AL # OGHAM LETTER IFIN +1699;AL # OGHAM LETTER EAMHANCHOLL +169A;AL # OGHAM LETTER PEITH +169B;OP # OGHAM FEATHER MARK +169C;CL # OGHAM REVERSED FEATHER MARK +16A0;AL # RUNIC LETTER FEHU FEOH FE F +16A1;AL # RUNIC LETTER V +16A2;AL # RUNIC LETTER URUZ UR U +16A3;AL # RUNIC LETTER YR +16A4;AL # RUNIC LETTER Y +16A5;AL # RUNIC LETTER W +16A6;AL # RUNIC LETTER THURISAZ THURS THORN +16A7;AL # RUNIC LETTER ETH +16A8;AL # RUNIC LETTER ANSUZ A +16A9;AL # RUNIC LETTER OS O +16AA;AL # RUNIC LETTER AC A +16AB;AL # RUNIC LETTER AESC +16AC;AL # RUNIC LETTER LONG-BRANCH-OSS O +16AD;AL # RUNIC LETTER SHORT-TWIG-OSS O +16AE;AL # RUNIC LETTER O +16AF;AL # RUNIC LETTER OE +16B0;AL # RUNIC LETTER ON +16B1;AL # RUNIC LETTER RAIDO RAD REID R +16B2;AL # RUNIC LETTER KAUNA +16B3;AL # RUNIC LETTER CEN +16B4;AL # RUNIC LETTER KAUN K +16B5;AL # RUNIC LETTER G +16B6;AL # RUNIC LETTER ENG +16B7;AL # RUNIC LETTER GEBO GYFU G +16B8;AL # RUNIC LETTER GAR +16B9;AL # RUNIC LETTER WUNJO WYNN W +16BA;AL # RUNIC LETTER HAGLAZ H +16BB;AL # RUNIC LETTER HAEGL H +16BC;AL # RUNIC LETTER LONG-BRANCH-HAGALL H +16BD;AL # RUNIC LETTER SHORT-TWIG-HAGALL H +16BE;AL # RUNIC LETTER NAUDIZ NYD NAUD N +16BF;AL # RUNIC LETTER SHORT-TWIG-NAUD N +16C0;AL # RUNIC LETTER DOTTED-N +16C1;AL # RUNIC LETTER ISAZ IS ISS I +16C2;AL # RUNIC LETTER E +16C3;AL # RUNIC LETTER JERAN J +16C4;AL # RUNIC LETTER GER +16C5;AL # RUNIC LETTER LONG-BRANCH-AR AE +16C6;AL # RUNIC LETTER SHORT-TWIG-AR A +16C7;AL # RUNIC LETTER IWAZ EOH +16C8;AL # RUNIC LETTER PERTHO PEORTH P +16C9;AL # RUNIC LETTER ALGIZ EOLHX +16CA;AL # RUNIC LETTER SOWILO S +16CB;AL # RUNIC LETTER SIGEL LONG-BRANCH-SOL S +16CC;AL # RUNIC LETTER SHORT-TWIG-SOL S +16CD;AL # RUNIC LETTER C +16CE;AL # RUNIC LETTER Z +16CF;AL # RUNIC LETTER TIWAZ TIR TYR T +16D0;AL # RUNIC LETTER SHORT-TWIG-TYR T +16D1;AL # RUNIC LETTER D +16D2;AL # RUNIC LETTER BERKANAN BEORC BJARKAN B +16D3;AL # RUNIC LETTER SHORT-TWIG-BJARKAN B +16D4;AL # RUNIC LETTER DOTTED-P +16D5;AL # RUNIC LETTER OPEN-P +16D6;AL # RUNIC LETTER EHWAZ EH E +16D7;AL # RUNIC LETTER MANNAZ MAN M +16D8;AL # RUNIC LETTER LONG-BRANCH-MADR M +16D9;AL # RUNIC LETTER SHORT-TWIG-MADR M +16DA;AL # RUNIC LETTER LAUKAZ LAGU LOGR L +16DB;AL # RUNIC LETTER DOTTED-L +16DC;AL # RUNIC LETTER INGWAZ +16DD;AL # RUNIC LETTER ING +16DE;AL # RUNIC LETTER DAGAZ DAEG D +16DF;AL # RUNIC LETTER OTHALAN ETHEL O +16E0;AL # RUNIC LETTER EAR +16E1;AL # RUNIC LETTER IOR +16E2;AL # RUNIC LETTER CWEORTH +16E3;AL # RUNIC LETTER CALC +16E4;AL # RUNIC LETTER CEALC +16E5;AL # RUNIC LETTER STAN +16E6;AL # RUNIC LETTER LONG-BRANCH-YR +16E7;AL # RUNIC LETTER SHORT-TWIG-YR +16E8;AL # RUNIC LETTER ICELANDIC-YR +16E9;AL # RUNIC LETTER Q +16EA;AL # RUNIC LETTER X +16EB;AL # RUNIC SINGLE PUNCTUATION +16EC;AL # RUNIC MULTIPLE PUNCTUATION +16ED;AL # RUNIC CROSS PUNCTUATION +16EE;AL # RUNIC ARLAUG SYMBOL +16EF;AL # RUNIC TVIMADUR SYMBOL +16F0;AL # RUNIC BELGTHOR SYMBOL +1700;AL # TAGALOG LETTER A +1701;AL # TAGALOG LETTER I +1702;AL # TAGALOG LETTER U +1703;AL # TAGALOG LETTER KA +1704;AL # TAGALOG LETTER GA +1705;AL # TAGALOG LETTER NGA +1706;AL # TAGALOG LETTER TA +1707;AL # TAGALOG LETTER DA +1708;AL # TAGALOG LETTER NA +1709;AL # TAGALOG LETTER PA +170A;AL # TAGALOG LETTER BA +170B;AL # TAGALOG LETTER MA +170C;AL # TAGALOG LETTER YA +170E;AL # TAGALOG LETTER LA +170F;AL # TAGALOG LETTER WA +1710;AL # TAGALOG LETTER SA +1711;AL # TAGALOG LETTER HA +1712;CM # TAGALOG VOWEL SIGN I +1713;CM # TAGALOG VOWEL SIGN U +1714;CM # TAGALOG SIGN VIRAMA +1720;AL # HANUNOO LETTER A +1721;AL # HANUNOO LETTER I +1722;AL # HANUNOO LETTER U +1723;AL # HANUNOO LETTER KA +1724;AL # HANUNOO LETTER GA +1725;AL # HANUNOO LETTER NGA +1726;AL # HANUNOO LETTER TA +1727;AL # HANUNOO LETTER DA +1728;AL # HANUNOO LETTER NA +1729;AL # HANUNOO LETTER PA +172A;AL # HANUNOO LETTER BA +172B;AL # HANUNOO LETTER MA +172C;AL # HANUNOO LETTER YA +172D;AL # HANUNOO LETTER RA +172E;AL # HANUNOO LETTER LA +172F;AL # HANUNOO LETTER WA +1730;AL # HANUNOO LETTER SA +1731;AL # HANUNOO LETTER HA +1732;CM # HANUNOO VOWEL SIGN I +1733;CM # HANUNOO VOWEL SIGN U +1734;CM # HANUNOO SIGN PAMUDPOD +1735;AL # PHILIPPINE SINGLE PUNCTUATION +1736;AL # PHILIPPINE DOUBLE PUNCTUATION +1740;AL # BUHID LETTER A +1741;AL # BUHID LETTER I +1742;AL # BUHID LETTER U +1743;AL # BUHID LETTER KA +1744;AL # BUHID LETTER GA +1745;AL # BUHID LETTER NGA +1746;AL # BUHID LETTER TA +1747;AL # BUHID LETTER DA +1748;AL # BUHID LETTER NA +1749;AL # BUHID LETTER PA +174A;AL # BUHID LETTER BA +174B;AL # BUHID LETTER MA +174C;AL # BUHID LETTER YA +174D;AL # BUHID LETTER RA +174E;AL # BUHID LETTER LA +174F;AL # BUHID LETTER WA +1750;AL # BUHID LETTER SA +1751;AL # BUHID LETTER HA +1752;CM # BUHID VOWEL SIGN I +1753;CM # BUHID VOWEL SIGN U +1760;AL # TAGBANWA LETTER A +1761;AL # TAGBANWA LETTER I +1762;AL # TAGBANWA LETTER U +1763;AL # TAGBANWA LETTER KA +1764;AL # TAGBANWA LETTER GA +1765;AL # TAGBANWA LETTER NGA +1766;AL # TAGBANWA LETTER TA +1767;AL # TAGBANWA LETTER DA +1768;AL # TAGBANWA LETTER NA +1769;AL # TAGBANWA LETTER PA +176A;AL # TAGBANWA LETTER BA +176B;AL # TAGBANWA LETTER MA +176C;AL # TAGBANWA LETTER YA +176E;AL # TAGBANWA LETTER LA +176F;AL # TAGBANWA LETTER WA +1770;AL # TAGBANWA LETTER SA +1772;CM # TAGBANWA VOWEL SIGN I +1773;CM # TAGBANWA VOWEL SIGN U +1780;SA # KHMER LETTER KA +1781;SA # KHMER LETTER KHA +1782;SA # KHMER LETTER KO +1783;SA # KHMER LETTER KHO +1784;SA # KHMER LETTER NGO +1785;SA # KHMER LETTER CA +1786;SA # KHMER LETTER CHA +1787;SA # KHMER LETTER CO +1788;SA # KHMER LETTER CHO +1789;SA # KHMER LETTER NYO +178A;SA # KHMER LETTER DA +178B;SA # KHMER LETTER TTHA +178C;SA # KHMER LETTER DO +178D;SA # KHMER LETTER TTHO +178E;SA # KHMER LETTER NNO +178F;SA # KHMER LETTER TA +1790;SA # KHMER LETTER THA +1791;SA # KHMER LETTER TO +1792;SA # KHMER LETTER THO +1793;SA # KHMER LETTER NO +1794;SA # KHMER LETTER BA +1795;SA # KHMER LETTER PHA +1796;SA # KHMER LETTER PO +1797;SA # KHMER LETTER PHO +1798;SA # KHMER LETTER MO +1799;SA # KHMER LETTER YO +179A;SA # KHMER LETTER RO +179B;SA # KHMER LETTER LO +179C;SA # KHMER LETTER VO +179D;SA # KHMER LETTER SHA +179E;SA # KHMER LETTER SSO +179F;SA # KHMER LETTER SA +17A0;SA # KHMER LETTER HA +17A1;SA # KHMER LETTER LA +17A2;SA # KHMER LETTER QA +17A3;SA # KHMER INDEPENDENT VOWEL QAQ +17A4;SA # KHMER INDEPENDENT VOWEL QAA +17A5;SA # KHMER INDEPENDENT VOWEL QI +17A6;SA # KHMER INDEPENDENT VOWEL QII +17A7;SA # KHMER INDEPENDENT VOWEL QU +17A8;SA # KHMER INDEPENDENT VOWEL QUK +17A9;SA # KHMER INDEPENDENT VOWEL QUU +17AA;SA # KHMER INDEPENDENT VOWEL QUUV +17AB;SA # KHMER INDEPENDENT VOWEL RY +17AC;SA # KHMER INDEPENDENT VOWEL RYY +17AD;SA # KHMER INDEPENDENT VOWEL LY +17AE;SA # KHMER INDEPENDENT VOWEL LYY +17AF;SA # KHMER INDEPENDENT VOWEL QE +17B0;SA # KHMER INDEPENDENT VOWEL QAI +17B1;SA # KHMER INDEPENDENT VOWEL QOO TYPE ONE +17B2;SA # KHMER INDEPENDENT VOWEL QOO TYPE TWO +17B3;SA # KHMER INDEPENDENT VOWEL QAU +17B4;CM # KHMER VOWEL INHERENT AQ +17B5;CM # KHMER VOWEL INHERENT AA +17B6;CM # KHMER VOWEL SIGN AA +17B7;CM # KHMER VOWEL SIGN I +17B8;CM # KHMER VOWEL SIGN II +17B9;CM # KHMER VOWEL SIGN Y +17BA;CM # KHMER VOWEL SIGN YY +17BB;CM # KHMER VOWEL SIGN U +17BC;CM # KHMER VOWEL SIGN UU +17BD;CM # KHMER VOWEL SIGN UA +17BE;CM # KHMER VOWEL SIGN OE +17BF;CM # KHMER VOWEL SIGN YA +17C0;CM # KHMER VOWEL SIGN IE +17C1;CM # KHMER VOWEL SIGN E +17C2;CM # KHMER VOWEL SIGN AE +17C3;CM # KHMER VOWEL SIGN AI +17C4;CM # KHMER VOWEL SIGN OO +17C5;CM # KHMER VOWEL SIGN AU +17C6;CM # KHMER SIGN NIKAHIT +17C7;CM # KHMER SIGN REAHMUK +17C8;CM # KHMER SIGN YUUKALEAPINTU +17C9;CM # KHMER SIGN MUUSIKATOAN +17CA;CM # KHMER SIGN TRIISAP +17CB;CM # KHMER SIGN BANTOC +17CC;CM # KHMER SIGN ROBAT +17CD;CM # KHMER SIGN TOANDAKHIAT +17CE;CM # KHMER SIGN KAKABAT +17CF;CM # KHMER SIGN AHSDA +17D0;CM # KHMER SIGN SAMYOK SANNYA +17D1;CM # KHMER SIGN VIRIAM +17D2;CM # KHMER SIGN COENG +17D3;CM # KHMER SIGN BATHAMASAT +17D4;NS # KHMER SIGN KHAN +17D5;BA # KHMER SIGN BARIYOOSAN +17D6;NS # KHMER SIGN CAMNUC PII KUUH +17D7;NS # KHMER SIGN LEK TOO +17D8;NS # KHMER SIGN BEYYAL +17D9;NS # KHMER SIGN PHNAEK MUAN +17DA;NS # KHMER SIGN KOOMUUT +17DB;PR # KHMER CURRENCY SYMBOL RIEL +17DC;AL # KHMER SIGN AVAKRAHASANYA +17E0;NU # KHMER DIGIT ZERO +17E1;NU # KHMER DIGIT ONE +17E2;NU # KHMER DIGIT TWO +17E3;NU # KHMER DIGIT THREE +17E4;NU # KHMER DIGIT FOUR +17E5;NU # KHMER DIGIT FIVE +17E6;NU # KHMER DIGIT SIX +17E7;NU # KHMER DIGIT SEVEN +17E8;NU # KHMER DIGIT EIGHT +17E9;NU # KHMER DIGIT NINE +1800;AL # MONGOLIAN BIRGA +1801;AL # MONGOLIAN ELLIPSIS +1802;AL # MONGOLIAN COMMA +1803;AL # MONGOLIAN FULL STOP +1804;AL # MONGOLIAN COLON +1805;AL # MONGOLIAN FOUR DOTS +1806;BB # MONGOLIAN TODO SOFT HYPHEN +1807;AL # MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER +1808;AL # MONGOLIAN MANCHU COMMA +1809;AL # MONGOLIAN MANCHU FULL STOP +180A;AL # MONGOLIAN NIRUGU +180B;CM # MONGOLIAN FREE VARIATION SELECTOR ONE +180C;CM # MONGOLIAN FREE VARIATION SELECTOR TWO +180D;CM # MONGOLIAN FREE VARIATION SELECTOR THREE +180E;CM # MONGOLIAN VOWEL SEPARATOR +1810;NU # MONGOLIAN DIGIT ZERO +1811;NU # MONGOLIAN DIGIT ONE +1812;NU # MONGOLIAN DIGIT TWO +1813;NU # MONGOLIAN DIGIT THREE +1814;NU # MONGOLIAN DIGIT FOUR +1815;NU # MONGOLIAN DIGIT FIVE +1816;NU # MONGOLIAN DIGIT SIX +1817;NU # MONGOLIAN DIGIT SEVEN +1818;NU # MONGOLIAN DIGIT EIGHT +1819;NU # MONGOLIAN DIGIT NINE +1820;AL # MONGOLIAN LETTER A +1821;AL # MONGOLIAN LETTER E +1822;AL # MONGOLIAN LETTER I +1823;AL # MONGOLIAN LETTER O +1824;AL # MONGOLIAN LETTER U +1825;AL # MONGOLIAN LETTER OE +1826;AL # MONGOLIAN LETTER UE +1827;AL # MONGOLIAN LETTER EE +1828;AL # MONGOLIAN LETTER NA +1829;AL # MONGOLIAN LETTER ANG +182A;AL # MONGOLIAN LETTER BA +182B;AL # MONGOLIAN LETTER PA +182C;AL # MONGOLIAN LETTER QA +182D;AL # MONGOLIAN LETTER GA +182E;AL # MONGOLIAN LETTER MA +182F;AL # MONGOLIAN LETTER LA +1830;AL # MONGOLIAN LETTER SA +1831;AL # MONGOLIAN LETTER SHA +1832;AL # MONGOLIAN LETTER TA +1833;AL # MONGOLIAN LETTER DA +1834;AL # MONGOLIAN LETTER CHA +1835;AL # MONGOLIAN LETTER JA +1836;AL # MONGOLIAN LETTER YA +1837;AL # MONGOLIAN LETTER RA +1838;AL # MONGOLIAN LETTER WA +1839;AL # MONGOLIAN LETTER FA +183A;AL # MONGOLIAN LETTER KA +183B;AL # MONGOLIAN LETTER KHA +183C;AL # MONGOLIAN LETTER TSA +183D;AL # MONGOLIAN LETTER ZA +183E;AL # MONGOLIAN LETTER HAA +183F;AL # MONGOLIAN LETTER ZRA +1840;AL # MONGOLIAN LETTER LHA +1841;AL # MONGOLIAN LETTER ZHI +1842;AL # MONGOLIAN LETTER CHI +1843;AL # MONGOLIAN LETTER TODO LONG VOWEL SIGN +1844;AL # MONGOLIAN LETTER TODO E +1845;AL # MONGOLIAN LETTER TODO I +1846;AL # MONGOLIAN LETTER TODO O +1847;AL # MONGOLIAN LETTER TODO U +1848;AL # MONGOLIAN LETTER TODO OE +1849;AL # MONGOLIAN LETTER TODO UE +184A;AL # MONGOLIAN LETTER TODO ANG +184B;AL # MONGOLIAN LETTER TODO BA +184C;AL # MONGOLIAN LETTER TODO PA +184D;AL # MONGOLIAN LETTER TODO QA +184E;AL # MONGOLIAN LETTER TODO GA +184F;AL # MONGOLIAN LETTER TODO MA +1850;AL # MONGOLIAN LETTER TODO TA +1851;AL # MONGOLIAN LETTER TODO DA +1852;AL # MONGOLIAN LETTER TODO CHA +1853;AL # MONGOLIAN LETTER TODO JA +1854;AL # MONGOLIAN LETTER TODO TSA +1855;AL # MONGOLIAN LETTER TODO YA +1856;AL # MONGOLIAN LETTER TODO WA +1857;AL # MONGOLIAN LETTER TODO KA +1858;AL # MONGOLIAN LETTER TODO GAA +1859;AL # MONGOLIAN LETTER TODO HAA +185A;AL # MONGOLIAN LETTER TODO JIA +185B;AL # MONGOLIAN LETTER TODO NIA +185C;AL # MONGOLIAN LETTER TODO DZA +185D;AL # MONGOLIAN LETTER SIBE E +185E;AL # MONGOLIAN LETTER SIBE I +185F;AL # MONGOLIAN LETTER SIBE IY +1860;AL # MONGOLIAN LETTER SIBE UE +1861;AL # MONGOLIAN LETTER SIBE U +1862;AL # MONGOLIAN LETTER SIBE ANG +1863;AL # MONGOLIAN LETTER SIBE KA +1864;AL # MONGOLIAN LETTER SIBE GA +1865;AL # MONGOLIAN LETTER SIBE HA +1866;AL # MONGOLIAN LETTER SIBE PA +1867;AL # MONGOLIAN LETTER SIBE SHA +1868;AL # MONGOLIAN LETTER SIBE TA +1869;AL # MONGOLIAN LETTER SIBE DA +186A;AL # MONGOLIAN LETTER SIBE JA +186B;AL # MONGOLIAN LETTER SIBE FA +186C;AL # MONGOLIAN LETTER SIBE GAA +186D;AL # MONGOLIAN LETTER SIBE HAA +186E;AL # MONGOLIAN LETTER SIBE TSA +186F;AL # MONGOLIAN LETTER SIBE ZA +1870;AL # MONGOLIAN LETTER SIBE RAA +1871;AL # MONGOLIAN LETTER SIBE CHA +1872;AL # MONGOLIAN LETTER SIBE ZHA +1873;AL # MONGOLIAN LETTER MANCHU I +1874;AL # MONGOLIAN LETTER MANCHU KA +1875;AL # MONGOLIAN LETTER MANCHU RA +1876;AL # MONGOLIAN LETTER MANCHU FA +1877;AL # MONGOLIAN LETTER MANCHU ZHA +1880;AL # MONGOLIAN LETTER ALI GALI ANUSVARA ONE +1881;AL # MONGOLIAN LETTER ALI GALI VISARGA ONE +1882;AL # MONGOLIAN LETTER ALI GALI DAMARU +1883;AL # MONGOLIAN LETTER ALI GALI UBADAMA +1884;AL # MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1885;AL # MONGOLIAN LETTER ALI GALI BALUDA +1886;AL # MONGOLIAN LETTER ALI GALI THREE BALUDA +1887;AL # MONGOLIAN LETTER ALI GALI A +1888;AL # MONGOLIAN LETTER ALI GALI I +1889;AL # MONGOLIAN LETTER ALI GALI KA +188A;AL # MONGOLIAN LETTER ALI GALI NGA +188B;AL # MONGOLIAN LETTER ALI GALI CA +188C;AL # MONGOLIAN LETTER ALI GALI TTA +188D;AL # MONGOLIAN LETTER ALI GALI TTHA +188E;AL # MONGOLIAN LETTER ALI GALI DDA +188F;AL # MONGOLIAN LETTER ALI GALI NNA +1890;AL # MONGOLIAN LETTER ALI GALI TA +1891;AL # MONGOLIAN LETTER ALI GALI DA +1892;AL # MONGOLIAN LETTER ALI GALI PA +1893;AL # MONGOLIAN LETTER ALI GALI PHA +1894;AL # MONGOLIAN LETTER ALI GALI SSA +1895;AL # MONGOLIAN LETTER ALI GALI ZHA +1896;AL # MONGOLIAN LETTER ALI GALI ZA +1897;AL # MONGOLIAN LETTER ALI GALI AH +1898;AL # MONGOLIAN LETTER TODO ALI GALI TA +1899;AL # MONGOLIAN LETTER TODO ALI GALI ZHA +189A;AL # MONGOLIAN LETTER MANCHU ALI GALI GHA +189B;AL # MONGOLIAN LETTER MANCHU ALI GALI NGA +189C;AL # MONGOLIAN LETTER MANCHU ALI GALI CA +189D;AL # MONGOLIAN LETTER MANCHU ALI GALI JHA +189E;AL # MONGOLIAN LETTER MANCHU ALI GALI TTA +189F;AL # MONGOLIAN LETTER MANCHU ALI GALI DDHA +18A0;AL # MONGOLIAN LETTER MANCHU ALI GALI TA +18A1;AL # MONGOLIAN LETTER MANCHU ALI GALI DHA +18A2;AL # MONGOLIAN LETTER MANCHU ALI GALI SSA +18A3;AL # MONGOLIAN LETTER MANCHU ALI GALI CYA +18A4;AL # MONGOLIAN LETTER MANCHU ALI GALI ZHA +18A5;AL # MONGOLIAN LETTER MANCHU ALI GALI ZA +18A6;AL # MONGOLIAN LETTER ALI GALI HALF U +18A7;AL # MONGOLIAN LETTER ALI GALI HALF YA +18A8;AL # MONGOLIAN LETTER MANCHU ALI GALI BHA +18A9;CM # MONGOLIAN LETTER ALI GALI DAGALGA +1E00;AL # LATIN CAPITAL LETTER A WITH RING BELOW +1E01;AL # LATIN SMALL LETTER A WITH RING BELOW +1E02;AL # LATIN CAPITAL LETTER B WITH DOT ABOVE +1E03;AL # LATIN SMALL LETTER B WITH DOT ABOVE +1E04;AL # LATIN CAPITAL LETTER B WITH DOT BELOW +1E05;AL # LATIN SMALL LETTER B WITH DOT BELOW +1E06;AL # LATIN CAPITAL LETTER B WITH LINE BELOW +1E07;AL # LATIN SMALL LETTER B WITH LINE BELOW +1E08;AL # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +1E09;AL # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE +1E0A;AL # LATIN CAPITAL LETTER D WITH DOT ABOVE +1E0B;AL # LATIN SMALL LETTER D WITH DOT ABOVE +1E0C;AL # LATIN CAPITAL LETTER D WITH DOT BELOW +1E0D;AL # LATIN SMALL LETTER D WITH DOT BELOW +1E0E;AL # LATIN CAPITAL LETTER D WITH LINE BELOW +1E0F;AL # LATIN SMALL LETTER D WITH LINE BELOW +1E10;AL # LATIN CAPITAL LETTER D WITH CEDILLA +1E11;AL # LATIN SMALL LETTER D WITH CEDILLA +1E12;AL # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +1E13;AL # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW +1E14;AL # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +1E15;AL # LATIN SMALL LETTER E WITH MACRON AND GRAVE +1E16;AL # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +1E17;AL # LATIN SMALL LETTER E WITH MACRON AND ACUTE +1E18;AL # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +1E19;AL # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW +1E1A;AL # LATIN CAPITAL LETTER E WITH TILDE BELOW +1E1B;AL # LATIN SMALL LETTER E WITH TILDE BELOW +1E1C;AL # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +1E1D;AL # LATIN SMALL LETTER E WITH CEDILLA AND BREVE +1E1E;AL # LATIN CAPITAL LETTER F WITH DOT ABOVE +1E1F;AL # LATIN SMALL LETTER F WITH DOT ABOVE +1E20;AL # LATIN CAPITAL LETTER G WITH MACRON +1E21;AL # LATIN SMALL LETTER G WITH MACRON +1E22;AL # LATIN CAPITAL LETTER H WITH DOT ABOVE +1E23;AL # LATIN SMALL LETTER H WITH DOT ABOVE +1E24;AL # LATIN CAPITAL LETTER H WITH DOT BELOW +1E25;AL # LATIN SMALL LETTER H WITH DOT BELOW +1E26;AL # LATIN CAPITAL LETTER H WITH DIAERESIS +1E27;AL # LATIN SMALL LETTER H WITH DIAERESIS +1E28;AL # LATIN CAPITAL LETTER H WITH CEDILLA +1E29;AL # LATIN SMALL LETTER H WITH CEDILLA +1E2A;AL # LATIN CAPITAL LETTER H WITH BREVE BELOW +1E2B;AL # LATIN SMALL LETTER H WITH BREVE BELOW +1E2C;AL # LATIN CAPITAL LETTER I WITH TILDE BELOW +1E2D;AL # LATIN SMALL LETTER I WITH TILDE BELOW +1E2E;AL # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +1E2F;AL # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE +1E30;AL # LATIN CAPITAL LETTER K WITH ACUTE +1E31;AL # LATIN SMALL LETTER K WITH ACUTE +1E32;AL # LATIN CAPITAL LETTER K WITH DOT BELOW +1E33;AL # LATIN SMALL LETTER K WITH DOT BELOW +1E34;AL # LATIN CAPITAL LETTER K WITH LINE BELOW +1E35;AL # LATIN SMALL LETTER K WITH LINE BELOW +1E36;AL # LATIN CAPITAL LETTER L WITH DOT BELOW +1E37;AL # LATIN SMALL LETTER L WITH DOT BELOW +1E38;AL # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +1E39;AL # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON +1E3A;AL # LATIN CAPITAL LETTER L WITH LINE BELOW +1E3B;AL # LATIN SMALL LETTER L WITH LINE BELOW +1E3C;AL # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +1E3D;AL # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW +1E3E;AL # LATIN CAPITAL LETTER M WITH ACUTE +1E3F;AL # LATIN SMALL LETTER M WITH ACUTE +1E40;AL # LATIN CAPITAL LETTER M WITH DOT ABOVE +1E41;AL # LATIN SMALL LETTER M WITH DOT ABOVE +1E42;AL # LATIN CAPITAL LETTER M WITH DOT BELOW +1E43;AL # LATIN SMALL LETTER M WITH DOT BELOW +1E44;AL # LATIN CAPITAL LETTER N WITH DOT ABOVE +1E45;AL # LATIN SMALL LETTER N WITH DOT ABOVE +1E46;AL # LATIN CAPITAL LETTER N WITH DOT BELOW +1E47;AL # LATIN SMALL LETTER N WITH DOT BELOW +1E48;AL # LATIN CAPITAL LETTER N WITH LINE BELOW +1E49;AL # LATIN SMALL LETTER N WITH LINE BELOW +1E4A;AL # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +1E4B;AL # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW +1E4C;AL # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +1E4D;AL # LATIN SMALL LETTER O WITH TILDE AND ACUTE +1E4E;AL # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +1E4F;AL # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS +1E50;AL # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +1E51;AL # LATIN SMALL LETTER O WITH MACRON AND GRAVE +1E52;AL # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +1E53;AL # LATIN SMALL LETTER O WITH MACRON AND ACUTE +1E54;AL # LATIN CAPITAL LETTER P WITH ACUTE +1E55;AL # LATIN SMALL LETTER P WITH ACUTE +1E56;AL # LATIN CAPITAL LETTER P WITH DOT ABOVE +1E57;AL # LATIN SMALL LETTER P WITH DOT ABOVE +1E58;AL # LATIN CAPITAL LETTER R WITH DOT ABOVE +1E59;AL # LATIN SMALL LETTER R WITH DOT ABOVE +1E5A;AL # LATIN CAPITAL LETTER R WITH DOT BELOW +1E5B;AL # LATIN SMALL LETTER R WITH DOT BELOW +1E5C;AL # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +1E5D;AL # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON +1E5E;AL # LATIN CAPITAL LETTER R WITH LINE BELOW +1E5F;AL # LATIN SMALL LETTER R WITH LINE BELOW +1E60;AL # LATIN CAPITAL LETTER S WITH DOT ABOVE +1E61;AL # LATIN SMALL LETTER S WITH DOT ABOVE +1E62;AL # LATIN CAPITAL LETTER S WITH DOT BELOW +1E63;AL # LATIN SMALL LETTER S WITH DOT BELOW +1E64;AL # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +1E65;AL # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE +1E66;AL # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +1E67;AL # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE +1E68;AL # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +1E69;AL # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE +1E6A;AL # LATIN CAPITAL LETTER T WITH DOT ABOVE +1E6B;AL # LATIN SMALL LETTER T WITH DOT ABOVE +1E6C;AL # LATIN CAPITAL LETTER T WITH DOT BELOW +1E6D;AL # LATIN SMALL LETTER T WITH DOT BELOW +1E6E;AL # LATIN CAPITAL LETTER T WITH LINE BELOW +1E6F;AL # LATIN SMALL LETTER T WITH LINE BELOW +1E70;AL # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +1E71;AL # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW +1E72;AL # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +1E73;AL # LATIN SMALL LETTER U WITH DIAERESIS BELOW +1E74;AL # LATIN CAPITAL LETTER U WITH TILDE BELOW +1E75;AL # LATIN SMALL LETTER U WITH TILDE BELOW +1E76;AL # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +1E77;AL # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW +1E78;AL # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +1E79;AL # LATIN SMALL LETTER U WITH TILDE AND ACUTE +1E7A;AL # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +1E7B;AL # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS +1E7C;AL # LATIN CAPITAL LETTER V WITH TILDE +1E7D;AL # LATIN SMALL LETTER V WITH TILDE +1E7E;AL # LATIN CAPITAL LETTER V WITH DOT BELOW +1E7F;AL # LATIN SMALL LETTER V WITH DOT BELOW +1E80;AL # LATIN CAPITAL LETTER W WITH GRAVE +1E81;AL # LATIN SMALL LETTER W WITH GRAVE +1E82;AL # LATIN CAPITAL LETTER W WITH ACUTE +1E83;AL # LATIN SMALL LETTER W WITH ACUTE +1E84;AL # LATIN CAPITAL LETTER W WITH DIAERESIS +1E85;AL # LATIN SMALL LETTER W WITH DIAERESIS +1E86;AL # LATIN CAPITAL LETTER W WITH DOT ABOVE +1E87;AL # LATIN SMALL LETTER W WITH DOT ABOVE +1E88;AL # LATIN CAPITAL LETTER W WITH DOT BELOW +1E89;AL # LATIN SMALL LETTER W WITH DOT BELOW +1E8A;AL # LATIN CAPITAL LETTER X WITH DOT ABOVE +1E8B;AL # LATIN SMALL LETTER X WITH DOT ABOVE +1E8C;AL # LATIN CAPITAL LETTER X WITH DIAERESIS +1E8D;AL # LATIN SMALL LETTER X WITH DIAERESIS +1E8E;AL # LATIN CAPITAL LETTER Y WITH DOT ABOVE +1E8F;AL # LATIN SMALL LETTER Y WITH DOT ABOVE +1E90;AL # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +1E91;AL # LATIN SMALL LETTER Z WITH CIRCUMFLEX +1E92;AL # LATIN CAPITAL LETTER Z WITH DOT BELOW +1E93;AL # LATIN SMALL LETTER Z WITH DOT BELOW +1E94;AL # LATIN CAPITAL LETTER Z WITH LINE BELOW +1E95;AL # LATIN SMALL LETTER Z WITH LINE BELOW +1E96;AL # LATIN SMALL LETTER H WITH LINE BELOW +1E97;AL # LATIN SMALL LETTER T WITH DIAERESIS +1E98;AL # LATIN SMALL LETTER W WITH RING ABOVE +1E99;AL # LATIN SMALL LETTER Y WITH RING ABOVE +1E9A;AL # LATIN SMALL LETTER A WITH RIGHT HALF RING +1E9B;AL # LATIN SMALL LETTER LONG S WITH DOT ABOVE +1EA0;AL # LATIN CAPITAL LETTER A WITH DOT BELOW +1EA1;AL # LATIN SMALL LETTER A WITH DOT BELOW +1EA2;AL # LATIN CAPITAL LETTER A WITH HOOK ABOVE +1EA3;AL # LATIN SMALL LETTER A WITH HOOK ABOVE +1EA4;AL # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA5;AL # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA6;AL # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA7;AL # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA8;AL # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EA9;AL # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EAA;AL # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +1EAB;AL # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE +1EAC;AL # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAD;AL # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAE;AL # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +1EAF;AL # LATIN SMALL LETTER A WITH BREVE AND ACUTE +1EB0;AL # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +1EB1;AL # LATIN SMALL LETTER A WITH BREVE AND GRAVE +1EB2;AL # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +1EB3;AL # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE +1EB4;AL # LATIN CAPITAL LETTER A WITH BREVE AND TILDE +1EB5;AL # LATIN SMALL LETTER A WITH BREVE AND TILDE +1EB6;AL # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +1EB7;AL # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW +1EB8;AL # LATIN CAPITAL LETTER E WITH DOT BELOW +1EB9;AL # LATIN SMALL LETTER E WITH DOT BELOW +1EBA;AL # LATIN CAPITAL LETTER E WITH HOOK ABOVE +1EBB;AL # LATIN SMALL LETTER E WITH HOOK ABOVE +1EBC;AL # LATIN CAPITAL LETTER E WITH TILDE +1EBD;AL # LATIN SMALL LETTER E WITH TILDE +1EBE;AL # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +1EBF;AL # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE +1EC0;AL # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC1;AL # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC2;AL # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC3;AL # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC4;AL # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +1EC5;AL # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE +1EC6;AL # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC7;AL # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC8;AL # LATIN CAPITAL LETTER I WITH HOOK ABOVE +1EC9;AL # LATIN SMALL LETTER I WITH HOOK ABOVE +1ECA;AL # LATIN CAPITAL LETTER I WITH DOT BELOW +1ECB;AL # LATIN SMALL LETTER I WITH DOT BELOW +1ECC;AL # LATIN CAPITAL LETTER O WITH DOT BELOW +1ECD;AL # LATIN SMALL LETTER O WITH DOT BELOW +1ECE;AL # LATIN CAPITAL LETTER O WITH HOOK ABOVE +1ECF;AL # LATIN SMALL LETTER O WITH HOOK ABOVE +1ED0;AL # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED1;AL # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED2;AL # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED3;AL # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED4;AL # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED5;AL # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED6;AL # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +1ED7;AL # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE +1ED8;AL # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1ED9;AL # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1EDA;AL # LATIN CAPITAL LETTER O WITH HORN AND ACUTE +1EDB;AL # LATIN SMALL LETTER O WITH HORN AND ACUTE +1EDC;AL # LATIN CAPITAL LETTER O WITH HORN AND GRAVE +1EDD;AL # LATIN SMALL LETTER O WITH HORN AND GRAVE +1EDE;AL # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +1EDF;AL # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE +1EE0;AL # LATIN CAPITAL LETTER O WITH HORN AND TILDE +1EE1;AL # LATIN SMALL LETTER O WITH HORN AND TILDE +1EE2;AL # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +1EE3;AL # LATIN SMALL LETTER O WITH HORN AND DOT BELOW +1EE4;AL # LATIN CAPITAL LETTER U WITH DOT BELOW +1EE5;AL # LATIN SMALL LETTER U WITH DOT BELOW +1EE6;AL # LATIN CAPITAL LETTER U WITH HOOK ABOVE +1EE7;AL # LATIN SMALL LETTER U WITH HOOK ABOVE +1EE8;AL # LATIN CAPITAL LETTER U WITH HORN AND ACUTE +1EE9;AL # LATIN SMALL LETTER U WITH HORN AND ACUTE +1EEA;AL # LATIN CAPITAL LETTER U WITH HORN AND GRAVE +1EEB;AL # LATIN SMALL LETTER U WITH HORN AND GRAVE +1EEC;AL # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +1EED;AL # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE +1EEE;AL # LATIN CAPITAL LETTER U WITH HORN AND TILDE +1EEF;AL # LATIN SMALL LETTER U WITH HORN AND TILDE +1EF0;AL # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +1EF1;AL # LATIN SMALL LETTER U WITH HORN AND DOT BELOW +1EF2;AL # LATIN CAPITAL LETTER Y WITH GRAVE +1EF3;AL # LATIN SMALL LETTER Y WITH GRAVE +1EF4;AL # LATIN CAPITAL LETTER Y WITH DOT BELOW +1EF5;AL # LATIN SMALL LETTER Y WITH DOT BELOW +1EF6;AL # LATIN CAPITAL LETTER Y WITH HOOK ABOVE +1EF7;AL # LATIN SMALL LETTER Y WITH HOOK ABOVE +1EF8;AL # LATIN CAPITAL LETTER Y WITH TILDE +1EF9;AL # LATIN SMALL LETTER Y WITH TILDE +1F00;AL # GREEK SMALL LETTER ALPHA WITH PSILI +1F01;AL # GREEK SMALL LETTER ALPHA WITH DASIA +1F02;AL # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA +1F03;AL # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA +1F04;AL # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA +1F05;AL # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA +1F06;AL # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI +1F07;AL # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F08;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI +1F09;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA +1F0A;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA +1F0B;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA +1F0C;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA +1F0D;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA +1F0E;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI +1F0F;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F10;AL # GREEK SMALL LETTER EPSILON WITH PSILI +1F11;AL # GREEK SMALL LETTER EPSILON WITH DASIA +1F12;AL # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA +1F13;AL # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA +1F14;AL # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA +1F15;AL # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18;AL # GREEK CAPITAL LETTER EPSILON WITH PSILI +1F19;AL # GREEK CAPITAL LETTER EPSILON WITH DASIA +1F1A;AL # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA +1F1B;AL # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA +1F1C;AL # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA +1F1D;AL # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20;AL # GREEK SMALL LETTER ETA WITH PSILI +1F21;AL # GREEK SMALL LETTER ETA WITH DASIA +1F22;AL # GREEK SMALL LETTER ETA WITH PSILI AND VARIA +1F23;AL # GREEK SMALL LETTER ETA WITH DASIA AND VARIA +1F24;AL # GREEK SMALL LETTER ETA WITH PSILI AND OXIA +1F25;AL # GREEK SMALL LETTER ETA WITH DASIA AND OXIA +1F26;AL # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI +1F27;AL # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI +1F28;AL # GREEK CAPITAL LETTER ETA WITH PSILI +1F29;AL # GREEK CAPITAL LETTER ETA WITH DASIA +1F2A;AL # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA +1F2B;AL # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA +1F2C;AL # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA +1F2D;AL # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA +1F2E;AL # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI +1F2F;AL # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI +1F30;AL # GREEK SMALL LETTER IOTA WITH PSILI +1F31;AL # GREEK SMALL LETTER IOTA WITH DASIA +1F32;AL # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA +1F33;AL # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA +1F34;AL # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA +1F35;AL # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA +1F36;AL # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI +1F37;AL # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI +1F38;AL # GREEK CAPITAL LETTER IOTA WITH PSILI +1F39;AL # GREEK CAPITAL LETTER IOTA WITH DASIA +1F3A;AL # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA +1F3B;AL # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA +1F3C;AL # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA +1F3D;AL # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA +1F3E;AL # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI +1F3F;AL # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI +1F40;AL # GREEK SMALL LETTER OMICRON WITH PSILI +1F41;AL # GREEK SMALL LETTER OMICRON WITH DASIA +1F42;AL # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA +1F43;AL # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA +1F44;AL # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA +1F45;AL # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48;AL # GREEK CAPITAL LETTER OMICRON WITH PSILI +1F49;AL # GREEK CAPITAL LETTER OMICRON WITH DASIA +1F4A;AL # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA +1F4B;AL # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA +1F4C;AL # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA +1F4D;AL # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50;AL # GREEK SMALL LETTER UPSILON WITH PSILI +1F51;AL # GREEK SMALL LETTER UPSILON WITH DASIA +1F52;AL # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA +1F53;AL # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA +1F54;AL # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA +1F55;AL # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA +1F56;AL # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI +1F57;AL # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59;AL # GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B;AL # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D;AL # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F;AL # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F60;AL # GREEK SMALL LETTER OMEGA WITH PSILI +1F61;AL # GREEK SMALL LETTER OMEGA WITH DASIA +1F62;AL # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA +1F63;AL # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA +1F64;AL # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA +1F65;AL # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA +1F66;AL # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI +1F67;AL # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F68;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI +1F69;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA +1F6A;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA +1F6B;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA +1F6C;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA +1F6D;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA +1F6E;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI +1F6F;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F70;AL # GREEK SMALL LETTER ALPHA WITH VARIA +1F71;AL # GREEK SMALL LETTER ALPHA WITH OXIA +1F72;AL # GREEK SMALL LETTER EPSILON WITH VARIA +1F73;AL # GREEK SMALL LETTER EPSILON WITH OXIA +1F74;AL # GREEK SMALL LETTER ETA WITH VARIA +1F75;AL # GREEK SMALL LETTER ETA WITH OXIA +1F76;AL # GREEK SMALL LETTER IOTA WITH VARIA +1F77;AL # GREEK SMALL LETTER IOTA WITH OXIA +1F78;AL # GREEK SMALL LETTER OMICRON WITH VARIA +1F79;AL # GREEK SMALL LETTER OMICRON WITH OXIA +1F7A;AL # GREEK SMALL LETTER UPSILON WITH VARIA +1F7B;AL # GREEK SMALL LETTER UPSILON WITH OXIA +1F7C;AL # GREEK SMALL LETTER OMEGA WITH VARIA +1F7D;AL # GREEK SMALL LETTER OMEGA WITH OXIA +1F80;AL # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +1F81;AL # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +1F82;AL # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F83;AL # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F84;AL # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F85;AL # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F86;AL # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F87;AL # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F88;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F89;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +1F8A;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F8B;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F8C;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F8D;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F8E;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F8F;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F90;AL # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +1F91;AL # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +1F92;AL # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F93;AL # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F94;AL # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F95;AL # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F96;AL # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F97;AL # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F98;AL # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F99;AL # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +1F9A;AL # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F9B;AL # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F9C;AL # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F9D;AL # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F9E;AL # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F9F;AL # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FA0;AL # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +1FA1;AL # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +1FA2;AL # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1FA3;AL # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1FA4;AL # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1FA5;AL # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1FA6;AL # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1FA7;AL # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1FA8;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1FA9;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +1FAA;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1FAB;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1FAC;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1FAD;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1FAE;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FAF;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FB0;AL # GREEK SMALL LETTER ALPHA WITH VRACHY +1FB1;AL # GREEK SMALL LETTER ALPHA WITH MACRON +1FB2;AL # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +1FB3;AL # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +1FB4;AL # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6;AL # GREEK SMALL LETTER ALPHA WITH PERISPOMENI +1FB7;AL # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +1FB8;AL # GREEK CAPITAL LETTER ALPHA WITH VRACHY +1FB9;AL # GREEK CAPITAL LETTER ALPHA WITH MACRON +1FBA;AL # GREEK CAPITAL LETTER ALPHA WITH VARIA +1FBB;AL # GREEK CAPITAL LETTER ALPHA WITH OXIA +1FBC;AL # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBD;AL # GREEK KORONIS +1FBE;AL # GREEK PROSGEGRAMMENI +1FBF;AL # GREEK PSILI +1FC0;AL # GREEK PERISPOMENI +1FC1;AL # GREEK DIALYTIKA AND PERISPOMENI +1FC2;AL # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +1FC3;AL # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +1FC4;AL # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6;AL # GREEK SMALL LETTER ETA WITH PERISPOMENI +1FC7;AL # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +1FC8;AL # GREEK CAPITAL LETTER EPSILON WITH VARIA +1FC9;AL # GREEK CAPITAL LETTER EPSILON WITH OXIA +1FCA;AL # GREEK CAPITAL LETTER ETA WITH VARIA +1FCB;AL # GREEK CAPITAL LETTER ETA WITH OXIA +1FCC;AL # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCD;AL # GREEK PSILI AND VARIA +1FCE;AL # GREEK PSILI AND OXIA +1FCF;AL # GREEK PSILI AND PERISPOMENI +1FD0;AL # GREEK SMALL LETTER IOTA WITH VRACHY +1FD1;AL # GREEK SMALL LETTER IOTA WITH MACRON +1FD2;AL # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +1FD3;AL # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6;AL # GREEK SMALL LETTER IOTA WITH PERISPOMENI +1FD7;AL # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +1FD8;AL # GREEK CAPITAL LETTER IOTA WITH VRACHY +1FD9;AL # GREEK CAPITAL LETTER IOTA WITH MACRON +1FDA;AL # GREEK CAPITAL LETTER IOTA WITH VARIA +1FDB;AL # GREEK CAPITAL LETTER IOTA WITH OXIA +1FDD;AL # GREEK DASIA AND VARIA +1FDE;AL # GREEK DASIA AND OXIA +1FDF;AL # GREEK DASIA AND PERISPOMENI +1FE0;AL # GREEK SMALL LETTER UPSILON WITH VRACHY +1FE1;AL # GREEK SMALL LETTER UPSILON WITH MACRON +1FE2;AL # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +1FE3;AL # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +1FE4;AL # GREEK SMALL LETTER RHO WITH PSILI +1FE5;AL # GREEK SMALL LETTER RHO WITH DASIA +1FE6;AL # GREEK SMALL LETTER UPSILON WITH PERISPOMENI +1FE7;AL # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +1FE8;AL # GREEK CAPITAL LETTER UPSILON WITH VRACHY +1FE9;AL # GREEK CAPITAL LETTER UPSILON WITH MACRON +1FEA;AL # GREEK CAPITAL LETTER UPSILON WITH VARIA +1FEB;AL # GREEK CAPITAL LETTER UPSILON WITH OXIA +1FEC;AL # GREEK CAPITAL LETTER RHO WITH DASIA +1FED;AL # GREEK DIALYTIKA AND VARIA +1FEE;AL # GREEK DIALYTIKA AND OXIA +1FEF;AL # GREEK VARIA +1FF2;AL # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +1FF3;AL # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +1FF4;AL # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6;AL # GREEK SMALL LETTER OMEGA WITH PERISPOMENI +1FF7;AL # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +1FF8;AL # GREEK CAPITAL LETTER OMICRON WITH VARIA +1FF9;AL # GREEK CAPITAL LETTER OMICRON WITH OXIA +1FFA;AL # GREEK CAPITAL LETTER OMEGA WITH VARIA +1FFB;AL # GREEK CAPITAL LETTER OMEGA WITH OXIA +1FFC;AL # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFD;AL # GREEK OXIA +1FFE;AL # GREEK DASIA +2000;BA # EN QUAD +2001;BA # EM QUAD +2002;BA # EN SPACE +2003;BA # EM SPACE +2004;BA # THREE-PER-EM SPACE +2005;BA # FOUR-PER-EM SPACE +2006;BA # SIX-PER-EM SPACE +2007;GL # FIGURE SPACE +2008;BA # PUNCTUATION SPACE +2009;BA # THIN SPACE +200A;BA # HAIR SPACE +200B;ZW # ZERO WIDTH SPACE +200C;CM # ZERO WIDTH NON-JOINER +200D;CM # ZERO WIDTH JOINER +200E;CM # LEFT-TO-RIGHT MARK +200F;CM # RIGHT-TO-LEFT MARK +2010;BA # HYPHEN +2011;GL # NON-BREAKING HYPHEN +2012;BA # FIGURE DASH +2013;BA # EN DASH +2014;B2 # EM DASH +2015;AI # HORIZONTAL BAR +2016;AI # DOUBLE VERTICAL LINE +2017;AL # DOUBLE LOW LINE +2018;QU # LEFT SINGLE QUOTATION MARK +2019;QU # RIGHT SINGLE QUOTATION MARK +201A;OP # SINGLE LOW-9 QUOTATION MARK +201B;QU # SINGLE HIGH-REVERSED-9 QUOTATION MARK +201C;QU # LEFT DOUBLE QUOTATION MARK +201D;QU # RIGHT DOUBLE QUOTATION MARK +201E;OP # DOUBLE LOW-9 QUOTATION MARK +201F;QU # DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2020;AI # DAGGER +2021;AI # DOUBLE DAGGER +2022;AL # BULLET +2023;AL # TRIANGULAR BULLET +2024;IN # ONE DOT LEADER +2025;IN # TWO DOT LEADER +2026;IN # HORIZONTAL ELLIPSIS +2027;BA # HYPHENATION POINT +2028;BK # LINE SEPARATOR +2029;BK # PARAGRAPH SEPARATOR +202A;CM # LEFT-TO-RIGHT EMBEDDING +202B;CM # RIGHT-TO-LEFT EMBEDDING +202C;CM # POP DIRECTIONAL FORMATTING +202D;CM # LEFT-TO-RIGHT OVERRIDE +202E;CM # RIGHT-TO-LEFT OVERRIDE +202F;GL # NARROW NO-BREAK SPACE +2030;PO # PER MILLE SIGN +2031;PO # PER TEN THOUSAND SIGN +2032;PO # PRIME +2033;PO # DOUBLE PRIME +2034;PO # TRIPLE PRIME +2035;PO # REVERSED PRIME +2036;PO # REVERSED DOUBLE PRIME +2037;PO # REVERSED TRIPLE PRIME +2038;AL # CARET +2039;QU # SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A;QU # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +203B;AI # REFERENCE MARK +203C;NS # DOUBLE EXCLAMATION MARK +203D;AL # INTERROBANG +203E;AL # OVERLINE +203F;AL # UNDERTIE +2040;AL # CHARACTER TIE +2041;AL # CARET INSERTION POINT +2042;AL # ASTERISM +2043;AL # HYPHEN BULLET +2044;NS # FRACTION SLASH +2045;OP # LEFT SQUARE BRACKET WITH QUILL +2046;CL # RIGHT SQUARE BRACKET WITH QUILL +2047;AL # DOUBLE QUESTION MARK +2048;AL # QUESTION EXCLAMATION MARK +2049;AL # EXCLAMATION QUESTION MARK +204A;AL # TIRONIAN SIGN ET +204B;AL # REVERSED PILCROW SIGN +204C;AL # BLACK LEFTWARDS BULLET +204D;AL # BLACK RIGHTWARDS BULLET +204E;AL # LOW ASTERISK +204F;AL # REVERSED SEMICOLON +2050;AL # CLOSE UP +2051;AL # TWO ASTERISKS ALIGNED VERTICALLY +2052;AL # COMMERCIAL MINUS SIGN +2057;AL # QUADRUPLE PRIME +205F;BA # MEDIUM MATHEMATICAL SPACE +2060;GL # WORD JOINER +2061;AL # FUNCTION APPLICATION +2062;AL # INVISIBLE TIMES +2063;AL # INVISIBLE SEPARATOR +206A;CM # INHIBIT SYMMETRIC SWAPPING +206B;CM # ACTIVATE SYMMETRIC SWAPPING +206C;CM # INHIBIT ARABIC FORM SHAPING +206D;CM # ACTIVATE ARABIC FORM SHAPING +206E;CM # NATIONAL DIGIT SHAPES +206F;CM # NOMINAL DIGIT SHAPES +2070;AL # SUPERSCRIPT ZERO +2071;AL # SUPERSCRIPT LATIN SMALL LETTER I +2074;AI # SUPERSCRIPT FOUR +2075;AL # SUPERSCRIPT FIVE +2076;AL # SUPERSCRIPT SIX +2077;AL # SUPERSCRIPT SEVEN +2078;AL # SUPERSCRIPT EIGHT +2079;AL # SUPERSCRIPT NINE +207A;AL # SUPERSCRIPT PLUS SIGN +207B;AL # SUPERSCRIPT MINUS +207C;AL # SUPERSCRIPT EQUALS SIGN +207D;OP # SUPERSCRIPT LEFT PARENTHESIS +207E;CL # SUPERSCRIPT RIGHT PARENTHESIS +207F;AI # SUPERSCRIPT LATIN SMALL LETTER N +2080;AL # SUBSCRIPT ZERO +2081;AI # SUBSCRIPT ONE +2082;AI # SUBSCRIPT TWO +2083;AI # SUBSCRIPT THREE +2084;AI # SUBSCRIPT FOUR +2085;AL # SUBSCRIPT FIVE +2086;AL # SUBSCRIPT SIX +2087;AL # SUBSCRIPT SEVEN +2088;AL # SUBSCRIPT EIGHT +2089;AL # SUBSCRIPT NINE +208A;AL # SUBSCRIPT PLUS SIGN +208B;AL # SUBSCRIPT MINUS +208C;AL # SUBSCRIPT EQUALS SIGN +208D;OP # SUBSCRIPT LEFT PARENTHESIS +208E;CL # SUBSCRIPT RIGHT PARENTHESIS +20A0;PR # EURO-CURRENCY SIGN +20A1;PR # COLON SIGN +20A2;PR # CRUZEIRO SIGN +20A3;PR # FRENCH FRANC SIGN +20A4;PR # LIRA SIGN +20A5;PR # MILL SIGN +20A6;PR # NAIRA SIGN +20A7;PO # PESETA SIGN +20A8;PR # RUPEE SIGN +20A9;PR # WON SIGN +20AA;PR # NEW SHEQEL SIGN +20AB;PR # DONG SIGN +20AC;PR # EURO SIGN +20AD;PR # KIP SIGN +20AE;PR # TUGRIK SIGN +20AF;PR # DRACHMA SIGN +20B0;PR # GERMAN PENNY SIGN +20B1;PR # PESO SIGN +20D0;CM # COMBINING LEFT HARPOON ABOVE +20D1;CM # COMBINING RIGHT HARPOON ABOVE +20D2;CM # COMBINING LONG VERTICAL LINE OVERLAY +20D3;CM # COMBINING SHORT VERTICAL LINE OVERLAY +20D4;CM # COMBINING ANTICLOCKWISE ARROW ABOVE +20D5;CM # COMBINING CLOCKWISE ARROW ABOVE +20D6;CM # COMBINING LEFT ARROW ABOVE +20D7;CM # COMBINING RIGHT ARROW ABOVE +20D8;CM # COMBINING RING OVERLAY +20D9;CM # COMBINING CLOCKWISE RING OVERLAY +20DA;CM # COMBINING ANTICLOCKWISE RING OVERLAY +20DB;CM # COMBINING THREE DOTS ABOVE +20DC;CM # COMBINING FOUR DOTS ABOVE +20DD;CM # COMBINING ENCLOSING CIRCLE +20DE;CM # COMBINING ENCLOSING SQUARE +20DF;CM # COMBINING ENCLOSING DIAMOND +20E0;CM # COMBINING ENCLOSING CIRCLE BACKSLASH +20E1;CM # COMBINING LEFT RIGHT ARROW ABOVE +20E2;CM # COMBINING ENCLOSING SCREEN +20E3;CM # COMBINING ENCLOSING KEYCAP +20E4;CM # COMBINING ENCLOSING UPWARD POINTING TRIANGLE +20E5;CM # COMBINING REVERSE SOLIDUS OVERLAY +20E6;CM # COMBINING DOUBLE VERTICAL STROKE OVERLAY +20E7;CM # COMBINING ANNUITY SYMBOL +20E8;CM # COMBINING TRIPLE UNDERDOT +20E9;CM # COMBINING WIDE BRIDGE ABOVE +20EA;CM # COMBINING LEFTWARDS ARROW OVERLAY +2100;AL # ACCOUNT OF +2101;AL # ADDRESSED TO THE SUBJECT +2102;AL # DOUBLE-STRUCK CAPITAL C +2103;PO # DEGREE CELSIUS +2104;AL # CENTRE LINE SYMBOL +2105;AI # CARE OF +2106;AL # CADA UNA +2107;AL # EULER CONSTANT +2108;AL # SCRUPLE +2109;PO # DEGREE FAHRENHEIT +210A;AL # SCRIPT SMALL G +210B;AL # SCRIPT CAPITAL H +210C;AL # BLACK-LETTER CAPITAL H +210D;AL # DOUBLE-STRUCK CAPITAL H +210E;AL # PLANCK CONSTANT +210F;AL # PLANCK CONSTANT OVER TWO PI +2110;AL # SCRIPT CAPITAL I +2111;AL # BLACK-LETTER CAPITAL I +2112;AL # SCRIPT CAPITAL L +2113;AI # SCRIPT SMALL L +2114;AL # L B BAR SYMBOL +2115;AL # DOUBLE-STRUCK CAPITAL N +2116;PR # NUMERO SIGN +2117;AL # SOUND RECORDING COPYRIGHT +2118;AL # SCRIPT CAPITAL P +2119;AL # DOUBLE-STRUCK CAPITAL P +211A;AL # DOUBLE-STRUCK CAPITAL Q +211B;AL # SCRIPT CAPITAL R +211C;AL # BLACK-LETTER CAPITAL R +211D;AL # DOUBLE-STRUCK CAPITAL R +211E;AL # PRESCRIPTION TAKE +211F;AL # RESPONSE +2120;AL # SERVICE MARK +2121;AI # TELEPHONE SIGN +2122;AI # TRADE MARK SIGN +2123;AL # VERSICLE +2124;AL # DOUBLE-STRUCK CAPITAL Z +2125;AL # OUNCE SIGN +2126;PO # OHM SIGN +2127;AL # INVERTED OHM SIGN +2128;AL # BLACK-LETTER CAPITAL Z +2129;AL # TURNED GREEK SMALL LETTER IOTA +212A;AL # KELVIN SIGN +212B;AI # ANGSTROM SIGN +212C;AL # SCRIPT CAPITAL B +212D;AL # BLACK-LETTER CAPITAL C +212E;AL # ESTIMATED SYMBOL +212F;AL # SCRIPT SMALL E +2130;AL # SCRIPT CAPITAL E +2131;AL # SCRIPT CAPITAL F +2132;AL # TURNED CAPITAL F +2133;AL # SCRIPT CAPITAL M +2134;AL # SCRIPT SMALL O +2135;AL # ALEF SYMBOL +2136;AL # BET SYMBOL +2137;AL # GIMEL SYMBOL +2138;AL # DALET SYMBOL +2139;AL # INFORMATION SOURCE +213A;AL # ROTATED CAPITAL Q +213D;AL # DOUBLE-STRUCK SMALL GAMMA +213E;AL # DOUBLE-STRUCK CAPITAL GAMMA +213F;AL # DOUBLE-STRUCK CAPITAL PI +2140;AI # DOUBLE-STRUCK N-ARY SUMMATION +2141;AL # TURNED SANS-SERIF CAPITAL G +2142;AL # TURNED SANS-SERIF CAPITAL L +2143;AL # REVERSED SANS-SERIF CAPITAL L +2144;AL # TURNED SANS-SERIF CAPITAL Y +2145;AL # DOUBLE-STRUCK ITALIC CAPITAL D +2146;AL # DOUBLE-STRUCK ITALIC SMALL D +2147;AL # DOUBLE-STRUCK ITALIC SMALL E +2148;AL # DOUBLE-STRUCK ITALIC SMALL I +2149;AL # DOUBLE-STRUCK ITALIC SMALL J +214A;AL # PROPERTY LINE +214B;AL # TURNED AMPERSAND +2153;AL # VULGAR FRACTION ONE THIRD +2154;AI # VULGAR FRACTION TWO THIRDS +2155;AI # VULGAR FRACTION ONE FIFTH +2156;AL # VULGAR FRACTION TWO FIFTHS +2157;AL # VULGAR FRACTION THREE FIFTHS +2158;AL # VULGAR FRACTION FOUR FIFTHS +2159;AL # VULGAR FRACTION ONE SIXTH +215A;AL # VULGAR FRACTION FIVE SIXTHS +215B;AI # VULGAR FRACTION ONE EIGHTH +215C;AL # VULGAR FRACTION THREE EIGHTHS +215D;AL # VULGAR FRACTION FIVE EIGHTHS +215E;AI # VULGAR FRACTION SEVEN EIGHTHS +215F;AL # FRACTION NUMERATOR ONE +2160;AI # ROMAN NUMERAL ONE +2161;AI # ROMAN NUMERAL TWO +2162;AI # ROMAN NUMERAL THREE +2163;AI # ROMAN NUMERAL FOUR +2164;AI # ROMAN NUMERAL FIVE +2165;AI # ROMAN NUMERAL SIX +2166;AI # ROMAN NUMERAL SEVEN +2167;AI # ROMAN NUMERAL EIGHT +2168;AI # ROMAN NUMERAL NINE +2169;AI # ROMAN NUMERAL TEN +216A;AI # ROMAN NUMERAL ELEVEN +216B;AI # ROMAN NUMERAL TWELVE +216C;AL # ROMAN NUMERAL FIFTY +216D;AL # ROMAN NUMERAL ONE HUNDRED +216E;AL # ROMAN NUMERAL FIVE HUNDRED +216F;AL # ROMAN NUMERAL ONE THOUSAND +2170;AI # SMALL ROMAN NUMERAL ONE +2171;AI # SMALL ROMAN NUMERAL TWO +2172;AI # SMALL ROMAN NUMERAL THREE +2173;AI # SMALL ROMAN NUMERAL FOUR +2174;AI # SMALL ROMAN NUMERAL FIVE +2175;AI # SMALL ROMAN NUMERAL SIX +2176;AI # SMALL ROMAN NUMERAL SEVEN +2177;AI # SMALL ROMAN NUMERAL EIGHT +2178;AI # SMALL ROMAN NUMERAL NINE +2179;AI # SMALL ROMAN NUMERAL TEN +217A;AL # SMALL ROMAN NUMERAL ELEVEN +217B;AL # SMALL ROMAN NUMERAL TWELVE +217C;AL # SMALL ROMAN NUMERAL FIFTY +217D;AL # SMALL ROMAN NUMERAL ONE HUNDRED +217E;AL # SMALL ROMAN NUMERAL FIVE HUNDRED +217F;AL # SMALL ROMAN NUMERAL ONE THOUSAND +2180;AL # ROMAN NUMERAL ONE THOUSAND C D +2181;AL # ROMAN NUMERAL FIVE THOUSAND +2182;AL # ROMAN NUMERAL TEN THOUSAND +2183;AL # ROMAN NUMERAL REVERSED ONE HUNDRED +2190;AI # LEFTWARDS ARROW +2191;AI # UPWARDS ARROW +2192;AI # RIGHTWARDS ARROW +2193;AI # DOWNWARDS ARROW +2194;AI # LEFT RIGHT ARROW +2195;AI # UP DOWN ARROW +2196;AI # NORTH WEST ARROW +2197;AI # NORTH EAST ARROW +2198;AI # SOUTH EAST ARROW +2199;AI # SOUTH WEST ARROW +219A;AL # LEFTWARDS ARROW WITH STROKE +219B;AL # RIGHTWARDS ARROW WITH STROKE +219C;AL # LEFTWARDS WAVE ARROW +219D;AL # RIGHTWARDS WAVE ARROW +219E;AL # LEFTWARDS TWO HEADED ARROW +219F;AL # UPWARDS TWO HEADED ARROW +21A0;AL # RIGHTWARDS TWO HEADED ARROW +21A1;AL # DOWNWARDS TWO HEADED ARROW +21A2;AL # LEFTWARDS ARROW WITH TAIL +21A3;AL # RIGHTWARDS ARROW WITH TAIL +21A4;AL # LEFTWARDS ARROW FROM BAR +21A5;AL # UPWARDS ARROW FROM BAR +21A6;AL # RIGHTWARDS ARROW FROM BAR +21A7;AL # DOWNWARDS ARROW FROM BAR +21A8;AL # UP DOWN ARROW WITH BASE +21A9;AL # LEFTWARDS ARROW WITH HOOK +21AA;AL # RIGHTWARDS ARROW WITH HOOK +21AB;AL # LEFTWARDS ARROW WITH LOOP +21AC;AL # RIGHTWARDS ARROW WITH LOOP +21AD;AL # LEFT RIGHT WAVE ARROW +21AE;AL # LEFT RIGHT ARROW WITH STROKE +21AF;AL # DOWNWARDS ZIGZAG ARROW +21B0;AL # UPWARDS ARROW WITH TIP LEFTWARDS +21B1;AL # UPWARDS ARROW WITH TIP RIGHTWARDS +21B2;AL # DOWNWARDS ARROW WITH TIP LEFTWARDS +21B3;AL # DOWNWARDS ARROW WITH TIP RIGHTWARDS +21B4;AL # RIGHTWARDS ARROW WITH CORNER DOWNWARDS +21B5;AL # DOWNWARDS ARROW WITH CORNER LEFTWARDS +21B6;AL # ANTICLOCKWISE TOP SEMICIRCLE ARROW +21B7;AL # CLOCKWISE TOP SEMICIRCLE ARROW +21B8;AL # NORTH WEST ARROW TO LONG BAR +21B9;AL # LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR +21BA;AL # ANTICLOCKWISE OPEN CIRCLE ARROW +21BB;AL # CLOCKWISE OPEN CIRCLE ARROW +21BC;AL # LEFTWARDS HARPOON WITH BARB UPWARDS +21BD;AL # LEFTWARDS HARPOON WITH BARB DOWNWARDS +21BE;AL # UPWARDS HARPOON WITH BARB RIGHTWARDS +21BF;AL # UPWARDS HARPOON WITH BARB LEFTWARDS +21C0;AL # RIGHTWARDS HARPOON WITH BARB UPWARDS +21C1;AL # RIGHTWARDS HARPOON WITH BARB DOWNWARDS +21C2;AL # DOWNWARDS HARPOON WITH BARB RIGHTWARDS +21C3;AL # DOWNWARDS HARPOON WITH BARB LEFTWARDS +21C4;AL # RIGHTWARDS ARROW OVER LEFTWARDS ARROW +21C5;AL # UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW +21C6;AL # LEFTWARDS ARROW OVER RIGHTWARDS ARROW +21C7;AL # LEFTWARDS PAIRED ARROWS +21C8;AL # UPWARDS PAIRED ARROWS +21C9;AL # RIGHTWARDS PAIRED ARROWS +21CA;AL # DOWNWARDS PAIRED ARROWS +21CB;AL # LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON +21CC;AL # RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON +21CD;AL # LEFTWARDS DOUBLE ARROW WITH STROKE +21CE;AL # LEFT RIGHT DOUBLE ARROW WITH STROKE +21CF;AL # RIGHTWARDS DOUBLE ARROW WITH STROKE +21D0;AL # LEFTWARDS DOUBLE ARROW +21D1;AL # UPWARDS DOUBLE ARROW +21D2;AI # RIGHTWARDS DOUBLE ARROW +21D3;AL # DOWNWARDS DOUBLE ARROW +21D4;AI # LEFT RIGHT DOUBLE ARROW +21D5;AL # UP DOWN DOUBLE ARROW +21D6;AL # NORTH WEST DOUBLE ARROW +21D7;AL # NORTH EAST DOUBLE ARROW +21D8;AL # SOUTH EAST DOUBLE ARROW +21D9;AL # SOUTH WEST DOUBLE ARROW +21DA;AL # LEFTWARDS TRIPLE ARROW +21DB;AL # RIGHTWARDS TRIPLE ARROW +21DC;AL # LEFTWARDS SQUIGGLE ARROW +21DD;AL # RIGHTWARDS SQUIGGLE ARROW +21DE;AL # UPWARDS ARROW WITH DOUBLE STROKE +21DF;AL # DOWNWARDS ARROW WITH DOUBLE STROKE +21E0;AL # LEFTWARDS DASHED ARROW +21E1;AL # UPWARDS DASHED ARROW +21E2;AL # RIGHTWARDS DASHED ARROW +21E3;AL # DOWNWARDS DASHED ARROW +21E4;AL # LEFTWARDS ARROW TO BAR +21E5;AL # RIGHTWARDS ARROW TO BAR +21E6;AL # LEFTWARDS WHITE ARROW +21E7;AL # UPWARDS WHITE ARROW +21E8;AL # RIGHTWARDS WHITE ARROW +21E9;AL # DOWNWARDS WHITE ARROW +21EA;AL # UPWARDS WHITE ARROW FROM BAR +21EB;AL # UPWARDS WHITE ARROW ON PEDESTAL +21EC;AL # UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR +21ED;AL # UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR +21EE;AL # UPWARDS WHITE DOUBLE ARROW +21EF;AL # UPWARDS WHITE DOUBLE ARROW ON PEDESTAL +21F0;AL # RIGHTWARDS WHITE ARROW FROM WALL +21F1;AL # NORTH WEST ARROW TO CORNER +21F2;AL # SOUTH EAST ARROW TO CORNER +21F3;AL # UP DOWN WHITE ARROW +21F4;AL # RIGHT ARROW WITH SMALL CIRCLE +21F5;AL # DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW +21F6;AL # THREE RIGHTWARDS ARROWS +21F7;AL # LEFTWARDS ARROW WITH VERTICAL STROKE +21F8;AL # RIGHTWARDS ARROW WITH VERTICAL STROKE +21F9;AL # LEFT RIGHT ARROW WITH VERTICAL STROKE +21FA;AL # LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE +21FB;AL # RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE +21FC;AL # LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE +21FD;AL # LEFTWARDS OPEN-HEADED ARROW +21FE;AL # RIGHTWARDS OPEN-HEADED ARROW +21FF;AL # LEFT RIGHT OPEN-HEADED ARROW +2200;AI # FOR ALL +2201;AL # COMPLEMENT +2202;AI # PARTIAL DIFFERENTIAL +2203;AI # THERE EXISTS +2204;AL # THERE DOES NOT EXIST +2205;AL # EMPTY SET +2206;AL # INCREMENT +2207;AI # NABLA +2208;AI # ELEMENT OF +2209;AL # NOT AN ELEMENT OF +220A;AL # SMALL ELEMENT OF +220B;AI # CONTAINS AS MEMBER +220C;AL # DOES NOT CONTAIN AS MEMBER +220D;AL # SMALL CONTAINS AS MEMBER +220E;AL # END OF PROOF +220F;AI # N-ARY PRODUCT +2210;AL # N-ARY COPRODUCT +2211;AI # N-ARY SUMMATION +2212;PR # MINUS SIGN +2213;PR # MINUS-OR-PLUS SIGN +2214;AL # DOT PLUS +2215;AI # DIVISION SLASH +2216;AL # SET MINUS +2217;AL # ASTERISK OPERATOR +2218;AL # RING OPERATOR +2219;AL # BULLET OPERATOR +221A;AI # SQUARE ROOT +221B;AL # CUBE ROOT +221C;AL # FOURTH ROOT +221D;AI # PROPORTIONAL TO +221E;AI # INFINITY +221F;AI # RIGHT ANGLE +2220;AI # ANGLE +2221;AL # MEASURED ANGLE +2222;AL # SPHERICAL ANGLE +2223;AI # DIVIDES +2224;AL # DOES NOT DIVIDE +2225;AI # PARALLEL TO +2226;AL # NOT PARALLEL TO +2227;AI # LOGICAL AND +2228;AI # LOGICAL OR +2229;AI # INTERSECTION +222A;AI # UNION +222B;AI # INTEGRAL +222C;AI # DOUBLE INTEGRAL +222D;AL # TRIPLE INTEGRAL +222E;AI # CONTOUR INTEGRAL +222F;AL # SURFACE INTEGRAL +2230;AL # VOLUME INTEGRAL +2231;AL # CLOCKWISE INTEGRAL +2232;AL # CLOCKWISE CONTOUR INTEGRAL +2233;AL # ANTICLOCKWISE CONTOUR INTEGRAL +2234;AI # THEREFORE +2235;AI # BECAUSE +2236;AI # RATIO +2237;AI # PROPORTION +2238;AL # DOT MINUS +2239;AL # EXCESS +223A;AL # GEOMETRIC PROPORTION +223B;AL # HOMOTHETIC +223C;AI # TILDE OPERATOR +223D;AI # REVERSED TILDE +223E;AL # INVERTED LAZY S +223F;AL # SINE WAVE +2240;AL # WREATH PRODUCT +2241;AL # NOT TILDE +2242;AL # MINUS TILDE +2243;AL # ASYMPTOTICALLY EQUAL TO +2244;AL # NOT ASYMPTOTICALLY EQUAL TO +2245;AL # APPROXIMATELY EQUAL TO +2246;AL # APPROXIMATELY BUT NOT ACTUALLY EQUAL TO +2247;AL # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +2248;AI # ALMOST EQUAL TO +2249;AL # NOT ALMOST EQUAL TO +224A;AL # ALMOST EQUAL OR EQUAL TO +224B;AL # TRIPLE TILDE +224C;AI # ALL EQUAL TO +224D;AL # EQUIVALENT TO +224E;AL # GEOMETRICALLY EQUIVALENT TO +224F;AL # DIFFERENCE BETWEEN +2250;AL # APPROACHES THE LIMIT +2251;AL # GEOMETRICALLY EQUAL TO +2252;AI # APPROXIMATELY EQUAL TO OR THE IMAGE OF +2253;AL # IMAGE OF OR APPROXIMATELY EQUAL TO +2254;AL # COLON EQUALS +2255;AL # EQUALS COLON +2256;AL # RING IN EQUAL TO +2257;AL # RING EQUAL TO +2258;AL # CORRESPONDS TO +2259;AL # ESTIMATES +225A;AL # EQUIANGULAR TO +225B;AL # STAR EQUALS +225C;AL # DELTA EQUAL TO +225D;AL # EQUAL TO BY DEFINITION +225E;AL # MEASURED BY +225F;AL # QUESTIONED EQUAL TO +2260;AI # NOT EQUAL TO +2261;AI # IDENTICAL TO +2262;AL # NOT IDENTICAL TO +2263;AL # STRICTLY EQUIVALENT TO +2264;AI # LESS-THAN OR EQUAL TO +2265;AI # GREATER-THAN OR EQUAL TO +2266;AI # LESS-THAN OVER EQUAL TO +2267;AI # GREATER-THAN OVER EQUAL TO +2268;AL # LESS-THAN BUT NOT EQUAL TO +2269;AL # GREATER-THAN BUT NOT EQUAL TO +226A;AI # MUCH LESS-THAN +226B;AI # MUCH GREATER-THAN +226C;AL # BETWEEN +226D;AL # NOT EQUIVALENT TO +226E;AI # NOT LESS-THAN +226F;AI # NOT GREATER-THAN +2270;AL # NEITHER LESS-THAN NOR EQUAL TO +2271;AL # NEITHER GREATER-THAN NOR EQUAL TO +2272;AL # LESS-THAN OR EQUIVALENT TO +2273;AL # GREATER-THAN OR EQUIVALENT TO +2274;AL # NEITHER LESS-THAN NOR EQUIVALENT TO +2275;AL # NEITHER GREATER-THAN NOR EQUIVALENT TO +2276;AL # LESS-THAN OR GREATER-THAN +2277;AL # GREATER-THAN OR LESS-THAN +2278;AL # NEITHER LESS-THAN NOR GREATER-THAN +2279;AL # NEITHER GREATER-THAN NOR LESS-THAN +227A;AL # PRECEDES +227B;AL # SUCCEEDS +227C;AL # PRECEDES OR EQUAL TO +227D;AL # SUCCEEDS OR EQUAL TO +227E;AL # PRECEDES OR EQUIVALENT TO +227F;AL # SUCCEEDS OR EQUIVALENT TO +2280;AL # DOES NOT PRECEDE +2281;AL # DOES NOT SUCCEED +2282;AI # SUBSET OF +2283;AI # SUPERSET OF +2284;AL # NOT A SUBSET OF +2285;AL # NOT A SUPERSET OF +2286;AI # SUBSET OF OR EQUAL TO +2287;AI # SUPERSET OF OR EQUAL TO +2288;AL # NEITHER A SUBSET OF NOR EQUAL TO +2289;AL # NEITHER A SUPERSET OF NOR EQUAL TO +228A;AL # SUBSET OF WITH NOT EQUAL TO +228B;AL # SUPERSET OF WITH NOT EQUAL TO +228C;AL # MULTISET +228D;AL # MULTISET MULTIPLICATION +228E;AL # MULTISET UNION +228F;AL # SQUARE IMAGE OF +2290;AL # SQUARE ORIGINAL OF +2291;AL # SQUARE IMAGE OF OR EQUAL TO +2292;AL # SQUARE ORIGINAL OF OR EQUAL TO +2293;AL # SQUARE CAP +2294;AL # SQUARE CUP +2295;AI # CIRCLED PLUS +2296;AL # CIRCLED MINUS +2297;AL # CIRCLED TIMES +2298;AL # CIRCLED DIVISION SLASH +2299;AI # CIRCLED DOT OPERATOR +229A;AL # CIRCLED RING OPERATOR +229B;AL # CIRCLED ASTERISK OPERATOR +229C;AL # CIRCLED EQUALS +229D;AL # CIRCLED DASH +229E;AL # SQUARED PLUS +229F;AL # SQUARED MINUS +22A0;AL # SQUARED TIMES +22A1;AL # SQUARED DOT OPERATOR +22A2;AL # RIGHT TACK +22A3;AL # LEFT TACK +22A4;AL # DOWN TACK +22A5;AI # UP TACK +22A6;AL # ASSERTION +22A7;AL # MODELS +22A8;AL # TRUE +22A9;AL # FORCES +22AA;AL # TRIPLE VERTICAL BAR RIGHT TURNSTILE +22AB;AL # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +22AC;AL # DOES NOT PROVE +22AD;AL # NOT TRUE +22AE;AL # DOES NOT FORCE +22AF;AL # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +22B0;AL # PRECEDES UNDER RELATION +22B1;AL # SUCCEEDS UNDER RELATION +22B2;AL # NORMAL SUBGROUP OF +22B3;AL # CONTAINS AS NORMAL SUBGROUP +22B4;AL # NORMAL SUBGROUP OF OR EQUAL TO +22B5;AL # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO +22B6;AL # ORIGINAL OF +22B7;AL # IMAGE OF +22B8;AL # MULTIMAP +22B9;AL # HERMITIAN CONJUGATE MATRIX +22BA;AL # INTERCALATE +22BB;AL # XOR +22BC;AL # NAND +22BD;AL # NOR +22BE;AL # RIGHT ANGLE WITH ARC +22BF;AI # RIGHT TRIANGLE +22C0;AL # N-ARY LOGICAL AND +22C1;AL # N-ARY LOGICAL OR +22C2;AL # N-ARY INTERSECTION +22C3;AL # N-ARY UNION +22C4;AL # DIAMOND OPERATOR +22C5;AL # DOT OPERATOR +22C6;AL # STAR OPERATOR +22C7;AL # DIVISION TIMES +22C8;AL # BOWTIE +22C9;AL # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT +22CA;AL # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT +22CB;AL # LEFT SEMIDIRECT PRODUCT +22CC;AL # RIGHT SEMIDIRECT PRODUCT +22CD;AL # REVERSED TILDE EQUALS +22CE;AL # CURLY LOGICAL OR +22CF;AL # CURLY LOGICAL AND +22D0;AL # DOUBLE SUBSET +22D1;AL # DOUBLE SUPERSET +22D2;AL # DOUBLE INTERSECTION +22D3;AL # DOUBLE UNION +22D4;AL # PITCHFORK +22D5;AL # EQUAL AND PARALLEL TO +22D6;AL # LESS-THAN WITH DOT +22D7;AL # GREATER-THAN WITH DOT +22D8;AL # VERY MUCH LESS-THAN +22D9;AL # VERY MUCH GREATER-THAN +22DA;AL # LESS-THAN EQUAL TO OR GREATER-THAN +22DB;AL # GREATER-THAN EQUAL TO OR LESS-THAN +22DC;AL # EQUAL TO OR LESS-THAN +22DD;AL # EQUAL TO OR GREATER-THAN +22DE;AL # EQUAL TO OR PRECEDES +22DF;AL # EQUAL TO OR SUCCEEDS +22E0;AL # DOES NOT PRECEDE OR EQUAL +22E1;AL # DOES NOT SUCCEED OR EQUAL +22E2;AL # NOT SQUARE IMAGE OF OR EQUAL TO +22E3;AL # NOT SQUARE ORIGINAL OF OR EQUAL TO +22E4;AL # SQUARE IMAGE OF OR NOT EQUAL TO +22E5;AL # SQUARE ORIGINAL OF OR NOT EQUAL TO +22E6;AL # LESS-THAN BUT NOT EQUIVALENT TO +22E7;AL # GREATER-THAN BUT NOT EQUIVALENT TO +22E8;AL # PRECEDES BUT NOT EQUIVALENT TO +22E9;AL # SUCCEEDS BUT NOT EQUIVALENT TO +22EA;AL # NOT NORMAL SUBGROUP OF +22EB;AL # DOES NOT CONTAIN AS NORMAL SUBGROUP +22EC;AL # NOT NORMAL SUBGROUP OF OR EQUAL TO +22ED;AL # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL +22EE;AL # VERTICAL ELLIPSIS +22EF;AL # MIDLINE HORIZONTAL ELLIPSIS +22F0;AL # UP RIGHT DIAGONAL ELLIPSIS +22F1;AL # DOWN RIGHT DIAGONAL ELLIPSIS +22F2;AL # ELEMENT OF WITH LONG HORIZONTAL STROKE +22F3;AL # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22F4;AL # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22F5;AL # ELEMENT OF WITH DOT ABOVE +22F6;AL # ELEMENT OF WITH OVERBAR +22F7;AL # SMALL ELEMENT OF WITH OVERBAR +22F8;AL # ELEMENT OF WITH UNDERBAR +22F9;AL # ELEMENT OF WITH TWO HORIZONTAL STROKES +22FA;AL # CONTAINS WITH LONG HORIZONTAL STROKE +22FB;AL # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22FC;AL # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22FD;AL # CONTAINS WITH OVERBAR +22FE;AL # SMALL CONTAINS WITH OVERBAR +22FF;AL # Z NOTATION BAG MEMBERSHIP +2300;AL # DIAMETER SIGN +2301;AL # ELECTRIC ARROW +2302;AL # HOUSE +2303;AL # UP ARROWHEAD +2304;AL # DOWN ARROWHEAD +2305;AL # PROJECTIVE +2306;AL # PERSPECTIVE +2307;AL # WAVY LINE +2308;AL # LEFT CEILING +2309;AL # RIGHT CEILING +230A;AL # LEFT FLOOR +230B;AL # RIGHT FLOOR +230C;AL # BOTTOM RIGHT CROP +230D;AL # BOTTOM LEFT CROP +230E;AL # TOP RIGHT CROP +230F;AL # TOP LEFT CROP +2310;AL # REVERSED NOT SIGN +2311;AL # SQUARE LOZENGE +2312;AI # ARC +2313;AL # SEGMENT +2314;AL # SECTOR +2315;AL # TELEPHONE RECORDER +2316;AL # POSITION INDICATOR +2317;AL # VIEWDATA SQUARE +2318;AL # PLACE OF INTEREST SIGN +2319;AL # TURNED NOT SIGN +231A;AL # WATCH +231B;AL # HOURGLASS +231C;AL # TOP LEFT CORNER +231D;AL # TOP RIGHT CORNER +231E;AL # BOTTOM LEFT CORNER +231F;AL # BOTTOM RIGHT CORNER +2320;AL # TOP HALF INTEGRAL +2321;AL # BOTTOM HALF INTEGRAL +2322;AL # FROWN +2323;AL # SMILE +2324;AL # UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS +2325;AL # OPTION KEY +2326;AL # ERASE TO THE RIGHT +2327;AL # X IN A RECTANGLE BOX +2328;AL # KEYBOARD +2329;OP # LEFT-POINTING ANGLE BRACKET +232A;CL # RIGHT-POINTING ANGLE BRACKET +232B;AL # ERASE TO THE LEFT +232C;AL # BENZENE RING +232D;AL # CYLINDRICITY +232E;AL # ALL AROUND-PROFILE +232F;AL # SYMMETRY +2330;AL # TOTAL RUNOUT +2331;AL # DIMENSION ORIGIN +2332;AL # CONICAL TAPER +2333;AL # SLOPE +2334;AL # COUNTERBORE +2335;AL # COUNTERSINK +2336;AL # APL FUNCTIONAL SYMBOL I-BEAM +2337;AL # APL FUNCTIONAL SYMBOL SQUISH QUAD +2338;AL # APL FUNCTIONAL SYMBOL QUAD EQUAL +2339;AL # APL FUNCTIONAL SYMBOL QUAD DIVIDE +233A;AL # APL FUNCTIONAL SYMBOL QUAD DIAMOND +233B;AL # APL FUNCTIONAL SYMBOL QUAD JOT +233C;AL # APL FUNCTIONAL SYMBOL QUAD CIRCLE +233D;AL # APL FUNCTIONAL SYMBOL CIRCLE STILE +233E;AL # APL FUNCTIONAL SYMBOL CIRCLE JOT +233F;AL # APL FUNCTIONAL SYMBOL SLASH BAR +2340;AL # APL FUNCTIONAL SYMBOL BACKSLASH BAR +2341;AL # APL FUNCTIONAL SYMBOL QUAD SLASH +2342;AL # APL FUNCTIONAL SYMBOL QUAD BACKSLASH +2343;AL # APL FUNCTIONAL SYMBOL QUAD LESS-THAN +2344;AL # APL FUNCTIONAL SYMBOL QUAD GREATER-THAN +2345;AL # APL FUNCTIONAL SYMBOL LEFTWARDS VANE +2346;AL # APL FUNCTIONAL SYMBOL RIGHTWARDS VANE +2347;AL # APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW +2348;AL # APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW +2349;AL # APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH +234A;AL # APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR +234B;AL # APL FUNCTIONAL SYMBOL DELTA STILE +234C;AL # APL FUNCTIONAL SYMBOL QUAD DOWN CARET +234D;AL # APL FUNCTIONAL SYMBOL QUAD DELTA +234E;AL # APL FUNCTIONAL SYMBOL DOWN TACK JOT +234F;AL # APL FUNCTIONAL SYMBOL UPWARDS VANE +2350;AL # APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW +2351;AL # APL FUNCTIONAL SYMBOL UP TACK OVERBAR +2352;AL # APL FUNCTIONAL SYMBOL DEL STILE +2353;AL # APL FUNCTIONAL SYMBOL QUAD UP CARET +2354;AL # APL FUNCTIONAL SYMBOL QUAD DEL +2355;AL # APL FUNCTIONAL SYMBOL UP TACK JOT +2356;AL # APL FUNCTIONAL SYMBOL DOWNWARDS VANE +2357;AL # APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW +2358;AL # APL FUNCTIONAL SYMBOL QUOTE UNDERBAR +2359;AL # APL FUNCTIONAL SYMBOL DELTA UNDERBAR +235A;AL # APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR +235B;AL # APL FUNCTIONAL SYMBOL JOT UNDERBAR +235C;AL # APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR +235D;AL # APL FUNCTIONAL SYMBOL UP SHOE JOT +235E;AL # APL FUNCTIONAL SYMBOL QUOTE QUAD +235F;AL # APL FUNCTIONAL SYMBOL CIRCLE STAR +2360;AL # APL FUNCTIONAL SYMBOL QUAD COLON +2361;AL # APL FUNCTIONAL SYMBOL UP TACK DIAERESIS +2362;AL # APL FUNCTIONAL SYMBOL DEL DIAERESIS +2363;AL # APL FUNCTIONAL SYMBOL STAR DIAERESIS +2364;AL # APL FUNCTIONAL SYMBOL JOT DIAERESIS +2365;AL # APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS +2366;AL # APL FUNCTIONAL SYMBOL DOWN SHOE STILE +2367;AL # APL FUNCTIONAL SYMBOL LEFT SHOE STILE +2368;AL # APL FUNCTIONAL SYMBOL TILDE DIAERESIS +2369;AL # APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS +236A;AL # APL FUNCTIONAL SYMBOL COMMA BAR +236B;AL # APL FUNCTIONAL SYMBOL DEL TILDE +236C;AL # APL FUNCTIONAL SYMBOL ZILDE +236D;AL # APL FUNCTIONAL SYMBOL STILE TILDE +236E;AL # APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR +236F;AL # APL FUNCTIONAL SYMBOL QUAD NOT EQUAL +2370;AL # APL FUNCTIONAL SYMBOL QUAD QUESTION +2371;AL # APL FUNCTIONAL SYMBOL DOWN CARET TILDE +2372;AL # APL FUNCTIONAL SYMBOL UP CARET TILDE +2373;AL # APL FUNCTIONAL SYMBOL IOTA +2374;AL # APL FUNCTIONAL SYMBOL RHO +2375;AL # APL FUNCTIONAL SYMBOL OMEGA +2376;AL # APL FUNCTIONAL SYMBOL ALPHA UNDERBAR +2377;AL # APL FUNCTIONAL SYMBOL EPSILON UNDERBAR +2378;AL # APL FUNCTIONAL SYMBOL IOTA UNDERBAR +2379;AL # APL FUNCTIONAL SYMBOL OMEGA UNDERBAR +237A;AL # APL FUNCTIONAL SYMBOL ALPHA +237B;AL # NOT CHECK MARK +237C;AL # RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +237D;AL # SHOULDERED OPEN BOX +237E;AL # BELL SYMBOL +237F;AL # VERTICAL LINE WITH MIDDLE DOT +2380;AL # INSERTION SYMBOL +2381;AL # CONTINUOUS UNDERLINE SYMBOL +2382;AL # DISCONTINUOUS UNDERLINE SYMBOL +2383;AL # EMPHASIS SYMBOL +2384;AL # COMPOSITION SYMBOL +2385;AL # WHITE SQUARE WITH CENTRE VERTICAL LINE +2386;AL # ENTER SYMBOL +2387;AL # ALTERNATIVE KEY SYMBOL +2388;AL # HELM SYMBOL +2389;AL # CIRCLED HORIZONTAL BAR WITH NOTCH +238A;AL # CIRCLED TRIANGLE DOWN +238B;AL # BROKEN CIRCLE WITH NORTHWEST ARROW +238C;AL # UNDO SYMBOL +238D;AL # MONOSTABLE SYMBOL +238E;AL # HYSTERESIS SYMBOL +238F;AL # OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL +2390;AL # OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL +2391;AL # PASSIVE-PULL-DOWN-OUTPUT SYMBOL +2392;AL # PASSIVE-PULL-UP-OUTPUT SYMBOL +2393;AL # DIRECT CURRENT SYMBOL FORM TWO +2394;AL # SOFTWARE-FUNCTION SYMBOL +2395;AL # APL FUNCTIONAL SYMBOL QUAD +2396;AL # DECIMAL SEPARATOR KEY SYMBOL +2397;AL # PREVIOUS PAGE +2398;AL # NEXT PAGE +2399;AL # PRINT SCREEN SYMBOL +239A;AL # CLEAR SCREEN SYMBOL +239B;AL # LEFT PARENTHESIS UPPER HOOK +239C;AL # LEFT PARENTHESIS EXTENSION +239D;AL # LEFT PARENTHESIS LOWER HOOK +239E;AL # RIGHT PARENTHESIS UPPER HOOK +239F;AL # RIGHT PARENTHESIS EXTENSION +23A0;AL # RIGHT PARENTHESIS LOWER HOOK +23A1;AL # LEFT SQUARE BRACKET UPPER CORNER +23A2;AL # LEFT SQUARE BRACKET EXTENSION +23A3;AL # LEFT SQUARE BRACKET LOWER CORNER +23A4;AL # RIGHT SQUARE BRACKET UPPER CORNER +23A5;AL # RIGHT SQUARE BRACKET EXTENSION +23A6;AL # RIGHT SQUARE BRACKET LOWER CORNER +23A7;AL # LEFT CURLY BRACKET UPPER HOOK +23A8;AL # LEFT CURLY BRACKET MIDDLE PIECE +23A9;AL # LEFT CURLY BRACKET LOWER HOOK +23AA;AL # CURLY BRACKET EXTENSION +23AB;AL # RIGHT CURLY BRACKET UPPER HOOK +23AC;AL # RIGHT CURLY BRACKET MIDDLE PIECE +23AD;AL # RIGHT CURLY BRACKET LOWER HOOK +23AE;AL # INTEGRAL EXTENSION +23AF;AL # HORIZONTAL LINE EXTENSION +23B0;AL # UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION +23B1;AL # UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION +23B2;AL # SUMMATION TOP +23B3;AL # SUMMATION BOTTOM +23B4;OP # TOP SQUARE BRACKET +23B5;CL # BOTTOM SQUARE BRACKET +23B6;QU # BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET +23B7;AL # RADICAL SYMBOL BOTTOM +23B8;AL # LEFT VERTICAL BOX LINE +23B9;AL # RIGHT VERTICAL BOX LINE +23BA;AL # HORIZONTAL SCAN LINE-1 +23BB;AL # HORIZONTAL SCAN LINE-3 +23BC;AL # HORIZONTAL SCAN LINE-7 +23BD;AL # HORIZONTAL SCAN LINE-9 +23BE;AL # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT +23BF;AL # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT +23C0;AL # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE +23C1;AL # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE +23C2;AL # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE +23C3;AL # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE +23C4;AL # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE +23C5;AL # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE +23C6;AL # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE +23C7;AL # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE +23C8;AL # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE +23C9;AL # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL +23CA;AL # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL +23CB;AL # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT +23CC;AL # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT +23CD;AL # SQUARE FOOT +23CE;AL # RETURN SYMBOL +2400;AL # SYMBOL FOR NULL +2401;AL # SYMBOL FOR START OF HEADING +2402;AL # SYMBOL FOR START OF TEXT +2403;AL # SYMBOL FOR END OF TEXT +2404;AL # SYMBOL FOR END OF TRANSMISSION +2405;AL # SYMBOL FOR ENQUIRY +2406;AL # SYMBOL FOR ACKNOWLEDGE +2407;AL # SYMBOL FOR BELL +2408;AL # SYMBOL FOR BACKSPACE +2409;AL # SYMBOL FOR HORIZONTAL TABULATION +240A;AL # SYMBOL FOR LINE FEED +240B;AL # SYMBOL FOR VERTICAL TABULATION +240C;AL # SYMBOL FOR FORM FEED +240D;AL # SYMBOL FOR CARRIAGE RETURN +240E;AL # SYMBOL FOR SHIFT OUT +240F;AL # SYMBOL FOR SHIFT IN +2410;AL # SYMBOL FOR DATA LINK ESCAPE +2411;AL # SYMBOL FOR DEVICE CONTROL ONE +2412;AL # SYMBOL FOR DEVICE CONTROL TWO +2413;AL # SYMBOL FOR DEVICE CONTROL THREE +2414;AL # SYMBOL FOR DEVICE CONTROL FOUR +2415;AL # SYMBOL FOR NEGATIVE ACKNOWLEDGE +2416;AL # SYMBOL FOR SYNCHRONOUS IDLE +2417;AL # SYMBOL FOR END OF TRANSMISSION BLOCK +2418;AL # SYMBOL FOR CANCEL +2419;AL # SYMBOL FOR END OF MEDIUM +241A;AL # SYMBOL FOR SUBSTITUTE +241B;AL # SYMBOL FOR ESCAPE +241C;AL # SYMBOL FOR FILE SEPARATOR +241D;AL # SYMBOL FOR GROUP SEPARATOR +241E;AL # SYMBOL FOR RECORD SEPARATOR +241F;AL # SYMBOL FOR UNIT SEPARATOR +2420;AL # SYMBOL FOR SPACE +2421;AL # SYMBOL FOR DELETE +2422;AL # BLANK SYMBOL +2423;AL # OPEN BOX +2424;AL # SYMBOL FOR NEWLINE +2425;AL # SYMBOL FOR DELETE FORM TWO +2426;AL # SYMBOL FOR SUBSTITUTE FORM TWO +2440;AL # OCR HOOK +2441;AL # OCR CHAIR +2442;AL # OCR FORK +2443;AL # OCR INVERTED FORK +2444;AL # OCR BELT BUCKLE +2445;AL # OCR BOW TIE +2446;AL # OCR BRANCH BANK IDENTIFICATION +2447;AL # OCR AMOUNT OF CHECK +2448;AL # OCR DASH +2449;AL # OCR CUSTOMER ACCOUNT NUMBER +244A;AL # OCR DOUBLE BACKSLASH +2460;AI # CIRCLED DIGIT ONE +2461;AI # CIRCLED DIGIT TWO +2462;AI # CIRCLED DIGIT THREE +2463;AI # CIRCLED DIGIT FOUR +2464;AI # CIRCLED DIGIT FIVE +2465;AI # CIRCLED DIGIT SIX +2466;AI # CIRCLED DIGIT SEVEN +2467;AI # CIRCLED DIGIT EIGHT +2468;AI # CIRCLED DIGIT NINE +2469;AI # CIRCLED NUMBER TEN +246A;AI # CIRCLED NUMBER ELEVEN +246B;AI # CIRCLED NUMBER TWELVE +246C;AI # CIRCLED NUMBER THIRTEEN +246D;AI # CIRCLED NUMBER FOURTEEN +246E;AI # CIRCLED NUMBER FIFTEEN +246F;AI # CIRCLED NUMBER SIXTEEN +2470;AI # CIRCLED NUMBER SEVENTEEN +2471;AI # CIRCLED NUMBER EIGHTEEN +2472;AI # CIRCLED NUMBER NINETEEN +2473;AI # CIRCLED NUMBER TWENTY +2474;AI # PARENTHESIZED DIGIT ONE +2475;AI # PARENTHESIZED DIGIT TWO +2476;AI # PARENTHESIZED DIGIT THREE +2477;AI # PARENTHESIZED DIGIT FOUR +2478;AI # PARENTHESIZED DIGIT FIVE +2479;AI # PARENTHESIZED DIGIT SIX +247A;AI # PARENTHESIZED DIGIT SEVEN +247B;AI # PARENTHESIZED DIGIT EIGHT +247C;AI # PARENTHESIZED DIGIT NINE +247D;AI # PARENTHESIZED NUMBER TEN +247E;AI # PARENTHESIZED NUMBER ELEVEN +247F;AI # PARENTHESIZED NUMBER TWELVE +2480;AI # PARENTHESIZED NUMBER THIRTEEN +2481;AI # PARENTHESIZED NUMBER FOURTEEN +2482;AI # PARENTHESIZED NUMBER FIFTEEN +2483;AI # PARENTHESIZED NUMBER SIXTEEN +2484;AI # PARENTHESIZED NUMBER SEVENTEEN +2485;AI # PARENTHESIZED NUMBER EIGHTEEN +2486;AI # PARENTHESIZED NUMBER NINETEEN +2487;AI # PARENTHESIZED NUMBER TWENTY +2488;AI # DIGIT ONE FULL STOP +2489;AI # DIGIT TWO FULL STOP +248A;AI # DIGIT THREE FULL STOP +248B;AI # DIGIT FOUR FULL STOP +248C;AI # DIGIT FIVE FULL STOP +248D;AI # DIGIT SIX FULL STOP +248E;AI # DIGIT SEVEN FULL STOP +248F;AI # DIGIT EIGHT FULL STOP +2490;AI # DIGIT NINE FULL STOP +2491;AI # NUMBER TEN FULL STOP +2492;AI # NUMBER ELEVEN FULL STOP +2493;AI # NUMBER TWELVE FULL STOP +2494;AI # NUMBER THIRTEEN FULL STOP +2495;AI # NUMBER FOURTEEN FULL STOP +2496;AI # NUMBER FIFTEEN FULL STOP +2497;AI # NUMBER SIXTEEN FULL STOP +2498;AI # NUMBER SEVENTEEN FULL STOP +2499;AI # NUMBER EIGHTEEN FULL STOP +249A;AI # NUMBER NINETEEN FULL STOP +249B;AI # NUMBER TWENTY FULL STOP +249C;AI # PARENTHESIZED LATIN SMALL LETTER A +249D;AI # PARENTHESIZED LATIN SMALL LETTER B +249E;AI # PARENTHESIZED LATIN SMALL LETTER C +249F;AI # PARENTHESIZED LATIN SMALL LETTER D +24A0;AI # PARENTHESIZED LATIN SMALL LETTER E +24A1;AI # PARENTHESIZED LATIN SMALL LETTER F +24A2;AI # PARENTHESIZED LATIN SMALL LETTER G +24A3;AI # PARENTHESIZED LATIN SMALL LETTER H +24A4;AI # PARENTHESIZED LATIN SMALL LETTER I +24A5;AI # PARENTHESIZED LATIN SMALL LETTER J +24A6;AI # PARENTHESIZED LATIN SMALL LETTER K +24A7;AI # PARENTHESIZED LATIN SMALL LETTER L +24A8;AI # PARENTHESIZED LATIN SMALL LETTER M +24A9;AI # PARENTHESIZED LATIN SMALL LETTER N +24AA;AI # PARENTHESIZED LATIN SMALL LETTER O +24AB;AI # PARENTHESIZED LATIN SMALL LETTER P +24AC;AI # PARENTHESIZED LATIN SMALL LETTER Q +24AD;AI # PARENTHESIZED LATIN SMALL LETTER R +24AE;AI # PARENTHESIZED LATIN SMALL LETTER S +24AF;AI # PARENTHESIZED LATIN SMALL LETTER T +24B0;AI # PARENTHESIZED LATIN SMALL LETTER U +24B1;AI # PARENTHESIZED LATIN SMALL LETTER V +24B2;AI # PARENTHESIZED LATIN SMALL LETTER W +24B3;AI # PARENTHESIZED LATIN SMALL LETTER X +24B4;AI # PARENTHESIZED LATIN SMALL LETTER Y +24B5;AI # PARENTHESIZED LATIN SMALL LETTER Z +24B6;AI # CIRCLED LATIN CAPITAL LETTER A +24B7;AI # CIRCLED LATIN CAPITAL LETTER B +24B8;AI # CIRCLED LATIN CAPITAL LETTER C +24B9;AI # CIRCLED LATIN CAPITAL LETTER D +24BA;AI # CIRCLED LATIN CAPITAL LETTER E +24BB;AI # CIRCLED LATIN CAPITAL LETTER F +24BC;AI # CIRCLED LATIN CAPITAL LETTER G +24BD;AI # CIRCLED LATIN CAPITAL LETTER H +24BE;AI # CIRCLED LATIN CAPITAL LETTER I +24BF;AI # CIRCLED LATIN CAPITAL LETTER J +24C0;AL # CIRCLED LATIN CAPITAL LETTER K +24C1;AL # CIRCLED LATIN CAPITAL LETTER L +24C2;AL # CIRCLED LATIN CAPITAL LETTER M +24C3;AL # CIRCLED LATIN CAPITAL LETTER N +24C4;AL # CIRCLED LATIN CAPITAL LETTER O +24C5;AL # CIRCLED LATIN CAPITAL LETTER P +24C6;AL # CIRCLED LATIN CAPITAL LETTER Q +24C7;AL # CIRCLED LATIN CAPITAL LETTER R +24C8;AL # CIRCLED LATIN CAPITAL LETTER S +24C9;AL # CIRCLED LATIN CAPITAL LETTER T +24CA;AL # CIRCLED LATIN CAPITAL LETTER U +24CB;AL # CIRCLED LATIN CAPITAL LETTER V +24CC;AL # CIRCLED LATIN CAPITAL LETTER W +24CD;AL # CIRCLED LATIN CAPITAL LETTER X +24CE;AL # CIRCLED LATIN CAPITAL LETTER Y +24CF;AL # CIRCLED LATIN CAPITAL LETTER Z +24D0;AI # CIRCLED LATIN SMALL LETTER A +24D1;AI # CIRCLED LATIN SMALL LETTER B +24D2;AI # CIRCLED LATIN SMALL LETTER C +24D3;AI # CIRCLED LATIN SMALL LETTER D +24D4;AI # CIRCLED LATIN SMALL LETTER E +24D5;AI # CIRCLED LATIN SMALL LETTER F +24D6;AI # CIRCLED LATIN SMALL LETTER G +24D7;AI # CIRCLED LATIN SMALL LETTER H +24D8;AI # CIRCLED LATIN SMALL LETTER I +24D9;AI # CIRCLED LATIN SMALL LETTER J +24DA;AI # CIRCLED LATIN SMALL LETTER K +24DB;AI # CIRCLED LATIN SMALL LETTER L +24DC;AI # CIRCLED LATIN SMALL LETTER M +24DD;AI # CIRCLED LATIN SMALL LETTER N +24DE;AI # CIRCLED LATIN SMALL LETTER O +24DF;AI # CIRCLED LATIN SMALL LETTER P +24E0;AI # CIRCLED LATIN SMALL LETTER Q +24E1;AI # CIRCLED LATIN SMALL LETTER R +24E2;AI # CIRCLED LATIN SMALL LETTER S +24E3;AI # CIRCLED LATIN SMALL LETTER T +24E4;AI # CIRCLED LATIN SMALL LETTER U +24E5;AI # CIRCLED LATIN SMALL LETTER V +24E6;AI # CIRCLED LATIN SMALL LETTER W +24E7;AI # CIRCLED LATIN SMALL LETTER X +24E8;AI # CIRCLED LATIN SMALL LETTER Y +24E9;AI # CIRCLED LATIN SMALL LETTER Z +24EA;AL # CIRCLED DIGIT ZERO +24EB;AI # NEGATIVE CIRCLED NUMBER ELEVEN +24EC;AI # NEGATIVE CIRCLED NUMBER TWELVE +24ED;AI # NEGATIVE CIRCLED NUMBER THIRTEEN +24EE;AI # NEGATIVE CIRCLED NUMBER FOURTEEN +24EF;AI # NEGATIVE CIRCLED NUMBER FIFTEEN +24F0;AI # NEGATIVE CIRCLED NUMBER SIXTEEN +24F1;AI # NEGATIVE CIRCLED NUMBER SEVENTEEN +24F2;AI # NEGATIVE CIRCLED NUMBER EIGHTEEN +24F3;AI # NEGATIVE CIRCLED NUMBER NINETEEN +24F4;AI # NEGATIVE CIRCLED NUMBER TWENTY +24F5;AI # DOUBLE CIRCLED DIGIT ONE +24F6;AI # DOUBLE CIRCLED DIGIT TWO +24F7;AI # DOUBLE CIRCLED DIGIT THREE +24F8;AI # DOUBLE CIRCLED DIGIT FOUR +24F9;AI # DOUBLE CIRCLED DIGIT FIVE +24FA;AI # DOUBLE CIRCLED DIGIT SIX +24FB;AI # DOUBLE CIRCLED DIGIT SEVEN +24FC;AI # DOUBLE CIRCLED DIGIT EIGHT +24FD;AI # DOUBLE CIRCLED DIGIT NINE +24FE;AI # DOUBLE CIRCLED NUMBER TEN +2500;AI # BOX DRAWINGS LIGHT HORIZONTAL +2501;AI # BOX DRAWINGS HEAVY HORIZONTAL +2502;AI # BOX DRAWINGS LIGHT VERTICAL +2503;AI # BOX DRAWINGS HEAVY VERTICAL +2504;AI # BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL +2505;AI # BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL +2506;AI # BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL +2507;AI # BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL +2508;AI # BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL +2509;AI # BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL +250A;AI # BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL +250B;AI # BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL +250C;AI # BOX DRAWINGS LIGHT DOWN AND RIGHT +250D;AI # BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY +250E;AI # BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT +250F;AI # BOX DRAWINGS HEAVY DOWN AND RIGHT +2510;AI # BOX DRAWINGS LIGHT DOWN AND LEFT +2511;AI # BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY +2512;AI # BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT +2513;AI # BOX DRAWINGS HEAVY DOWN AND LEFT +2514;AI # BOX DRAWINGS LIGHT UP AND RIGHT +2515;AI # BOX DRAWINGS UP LIGHT AND RIGHT HEAVY +2516;AI # BOX DRAWINGS UP HEAVY AND RIGHT LIGHT +2517;AI # BOX DRAWINGS HEAVY UP AND RIGHT +2518;AI # BOX DRAWINGS LIGHT UP AND LEFT +2519;AI # BOX DRAWINGS UP LIGHT AND LEFT HEAVY +251A;AI # BOX DRAWINGS UP HEAVY AND LEFT LIGHT +251B;AI # BOX DRAWINGS HEAVY UP AND LEFT +251C;AI # BOX DRAWINGS LIGHT VERTICAL AND RIGHT +251D;AI # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY +251E;AI # BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT +251F;AI # BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT +2520;AI # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT +2521;AI # BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY +2522;AI # BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY +2523;AI # BOX DRAWINGS HEAVY VERTICAL AND RIGHT +2524;AI # BOX DRAWINGS LIGHT VERTICAL AND LEFT +2525;AI # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY +2526;AI # BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT +2527;AI # BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT +2528;AI # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT +2529;AI # BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY +252A;AI # BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY +252B;AI # BOX DRAWINGS HEAVY VERTICAL AND LEFT +252C;AI # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +252D;AI # BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT +252E;AI # BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT +252F;AI # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY +2530;AI # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT +2531;AI # BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY +2532;AI # BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY +2533;AI # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL +2534;AI # BOX DRAWINGS LIGHT UP AND HORIZONTAL +2535;AI # BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT +2536;AI # BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT +2537;AI # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY +2538;AI # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT +2539;AI # BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY +253A;AI # BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY +253B;AI # BOX DRAWINGS HEAVY UP AND HORIZONTAL +253C;AI # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +253D;AI # BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT +253E;AI # BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT +253F;AI # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY +2540;AI # BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT +2541;AI # BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT +2542;AI # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT +2543;AI # BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT +2544;AI # BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT +2545;AI # BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT +2546;AI # BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT +2547;AI # BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY +2548;AI # BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY +2549;AI # BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY +254A;AI # BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY +254B;AI # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +254C;AL # BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL +254D;AL # BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL +254E;AL # BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL +254F;AL # BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL +2550;AI # BOX DRAWINGS DOUBLE HORIZONTAL +2551;AI # BOX DRAWINGS DOUBLE VERTICAL +2552;AI # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +2553;AI # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +2554;AI # BOX DRAWINGS DOUBLE DOWN AND RIGHT +2555;AI # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +2556;AI # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +2557;AI # BOX DRAWINGS DOUBLE DOWN AND LEFT +2558;AI # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +2559;AI # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +255A;AI # BOX DRAWINGS DOUBLE UP AND RIGHT +255B;AI # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +255C;AI # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +255D;AI # BOX DRAWINGS DOUBLE UP AND LEFT +255E;AI # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +255F;AI # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +2560;AI # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +2561;AI # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +2562;AI # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +2563;AI # BOX DRAWINGS DOUBLE VERTICAL AND LEFT +2564;AI # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +2565;AI # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +2566;AI # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +2567;AI # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +2568;AI # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +2569;AI # BOX DRAWINGS DOUBLE UP AND HORIZONTAL +256A;AI # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +256B;AI # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +256C;AI # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +256D;AI # BOX DRAWINGS LIGHT ARC DOWN AND RIGHT +256E;AI # BOX DRAWINGS LIGHT ARC DOWN AND LEFT +256F;AI # BOX DRAWINGS LIGHT ARC UP AND LEFT +2570;AI # BOX DRAWINGS LIGHT ARC UP AND RIGHT +2571;AI # BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT +2572;AI # BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT +2573;AI # BOX DRAWINGS LIGHT DIAGONAL CROSS +2574;AI # BOX DRAWINGS LIGHT LEFT +2575;AL # BOX DRAWINGS LIGHT UP +2576;AL # BOX DRAWINGS LIGHT RIGHT +2577;AL # BOX DRAWINGS LIGHT DOWN +2578;AL # BOX DRAWINGS HEAVY LEFT +2579;AL # BOX DRAWINGS HEAVY UP +257A;AL # BOX DRAWINGS HEAVY RIGHT +257B;AL # BOX DRAWINGS HEAVY DOWN +257C;AL # BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT +257D;AL # BOX DRAWINGS LIGHT UP AND HEAVY DOWN +257E;AL # BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT +257F;AL # BOX DRAWINGS HEAVY UP AND LIGHT DOWN +2580;AI # UPPER HALF BLOCK +2581;AI # LOWER ONE EIGHTH BLOCK +2582;AI # LOWER ONE QUARTER BLOCK +2583;AI # LOWER THREE EIGHTHS BLOCK +2584;AI # LOWER HALF BLOCK +2585;AI # LOWER FIVE EIGHTHS BLOCK +2586;AI # LOWER THREE QUARTERS BLOCK +2587;AI # LOWER SEVEN EIGHTHS BLOCK +2588;AI # FULL BLOCK +2589;AI # LEFT SEVEN EIGHTHS BLOCK +258A;AI # LEFT THREE QUARTERS BLOCK +258B;AI # LEFT FIVE EIGHTHS BLOCK +258C;AI # LEFT HALF BLOCK +258D;AI # LEFT THREE EIGHTHS BLOCK +258E;AI # LEFT ONE QUARTER BLOCK +258F;AI # LEFT ONE EIGHTH BLOCK +2590;AL # RIGHT HALF BLOCK +2591;AL # LIGHT SHADE +2592;AI # MEDIUM SHADE +2593;AI # DARK SHADE +2594;AI # UPPER ONE EIGHTH BLOCK +2595;AI # RIGHT ONE EIGHTH BLOCK +2596;AL # QUADRANT LOWER LEFT +2597;AL # QUADRANT LOWER RIGHT +2598;AL # QUADRANT UPPER LEFT +2599;AL # QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT +259A;AL # QUADRANT UPPER LEFT AND LOWER RIGHT +259B;AL # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT +259C;AL # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT +259D;AL # QUADRANT UPPER RIGHT +259E;AL # QUADRANT UPPER RIGHT AND LOWER LEFT +259F;AL # QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT +25A0;AI # BLACK SQUARE +25A1;AI # WHITE SQUARE +25A2;AL # WHITE SQUARE WITH ROUNDED CORNERS +25A3;AI # WHITE SQUARE CONTAINING BLACK SMALL SQUARE +25A4;AI # SQUARE WITH HORIZONTAL FILL +25A5;AI # SQUARE WITH VERTICAL FILL +25A6;AI # SQUARE WITH ORTHOGONAL CROSSHATCH FILL +25A7;AI # SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL +25A8;AI # SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL +25A9;AI # SQUARE WITH DIAGONAL CROSSHATCH FILL +25AA;AL # BLACK SMALL SQUARE +25AB;AL # WHITE SMALL SQUARE +25AC;AL # BLACK RECTANGLE +25AD;AL # WHITE RECTANGLE +25AE;AL # BLACK VERTICAL RECTANGLE +25AF;AL # WHITE VERTICAL RECTANGLE +25B0;AL # BLACK PARALLELOGRAM +25B1;AL # WHITE PARALLELOGRAM +25B2;AI # BLACK UP-POINTING TRIANGLE +25B3;AI # WHITE UP-POINTING TRIANGLE +25B4;AL # BLACK UP-POINTING SMALL TRIANGLE +25B5;AL # WHITE UP-POINTING SMALL TRIANGLE +25B6;AI # BLACK RIGHT-POINTING TRIANGLE +25B7;AI # WHITE RIGHT-POINTING TRIANGLE +25B8;AL # BLACK RIGHT-POINTING SMALL TRIANGLE +25B9;AL # WHITE RIGHT-POINTING SMALL TRIANGLE +25BA;AL # BLACK RIGHT-POINTING POINTER +25BB;AL # WHITE RIGHT-POINTING POINTER +25BC;AI # BLACK DOWN-POINTING TRIANGLE +25BD;AI # WHITE DOWN-POINTING TRIANGLE +25BE;AL # BLACK DOWN-POINTING SMALL TRIANGLE +25BF;AL # WHITE DOWN-POINTING SMALL TRIANGLE +25C0;AI # BLACK LEFT-POINTING TRIANGLE +25C1;AI # WHITE LEFT-POINTING TRIANGLE +25C2;AL # BLACK LEFT-POINTING SMALL TRIANGLE +25C3;AL # WHITE LEFT-POINTING SMALL TRIANGLE +25C4;AL # BLACK LEFT-POINTING POINTER +25C5;AL # WHITE LEFT-POINTING POINTER +25C6;AI # BLACK DIAMOND +25C7;AI # WHITE DIAMOND +25C8;AI # WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND +25C9;AL # FISHEYE +25CA;AL # LOZENGE +25CB;AI # WHITE CIRCLE +25CC;AL # DOTTED CIRCLE +25CD;AL # CIRCLE WITH VERTICAL FILL +25CE;AI # BULLSEYE +25CF;AI # BLACK CIRCLE +25D0;AI # CIRCLE WITH LEFT HALF BLACK +25D1;AI # CIRCLE WITH RIGHT HALF BLACK +25D2;AL # CIRCLE WITH LOWER HALF BLACK +25D3;AL # CIRCLE WITH UPPER HALF BLACK +25D4;AL # CIRCLE WITH UPPER RIGHT QUADRANT BLACK +25D5;AL # CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK +25D6;AL # LEFT HALF BLACK CIRCLE +25D7;AL # RIGHT HALF BLACK CIRCLE +25D8;AL # INVERSE BULLET +25D9;AL # INVERSE WHITE CIRCLE +25DA;AL # UPPER HALF INVERSE WHITE CIRCLE +25DB;AL # LOWER HALF INVERSE WHITE CIRCLE +25DC;AL # UPPER LEFT QUADRANT CIRCULAR ARC +25DD;AL # UPPER RIGHT QUADRANT CIRCULAR ARC +25DE;AL # LOWER RIGHT QUADRANT CIRCULAR ARC +25DF;AL # LOWER LEFT QUADRANT CIRCULAR ARC +25E0;AL # UPPER HALF CIRCLE +25E1;AL # LOWER HALF CIRCLE +25E2;AI # BLACK LOWER RIGHT TRIANGLE +25E3;AI # BLACK LOWER LEFT TRIANGLE +25E4;AI # BLACK UPPER LEFT TRIANGLE +25E5;AI # BLACK UPPER RIGHT TRIANGLE +25E6;AL # WHITE BULLET +25E7;AL # SQUARE WITH LEFT HALF BLACK +25E8;AL # SQUARE WITH RIGHT HALF BLACK +25E9;AL # SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK +25EA;AL # SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK +25EB;AL # WHITE SQUARE WITH VERTICAL BISECTING LINE +25EC;AL # WHITE UP-POINTING TRIANGLE WITH DOT +25ED;AL # UP-POINTING TRIANGLE WITH LEFT HALF BLACK +25EE;AL # UP-POINTING TRIANGLE WITH RIGHT HALF BLACK +25EF;AI # LARGE CIRCLE +25F0;AL # WHITE SQUARE WITH UPPER LEFT QUADRANT +25F1;AL # WHITE SQUARE WITH LOWER LEFT QUADRANT +25F2;AL # WHITE SQUARE WITH LOWER RIGHT QUADRANT +25F3;AL # WHITE SQUARE WITH UPPER RIGHT QUADRANT +25F4;AL # WHITE CIRCLE WITH UPPER LEFT QUADRANT +25F5;AL # WHITE CIRCLE WITH LOWER LEFT QUADRANT +25F6;AL # WHITE CIRCLE WITH LOWER RIGHT QUADRANT +25F7;AL # WHITE CIRCLE WITH UPPER RIGHT QUADRANT +25F8;AL # UPPER LEFT TRIANGLE +25F9;AL # UPPER RIGHT TRIANGLE +25FA;AL # LOWER LEFT TRIANGLE +25FB;AL # WHITE MEDIUM SQUARE +25FC;AL # BLACK MEDIUM SQUARE +25FD;AL # WHITE MEDIUM SMALL SQUARE +25FE;AL # BLACK MEDIUM SMALL SQUARE +25FF;AL # LOWER RIGHT TRIANGLE +2600;AL # BLACK SUN WITH RAYS +2601;AL # CLOUD +2602;AL # UMBRELLA +2603;AL # SNOWMAN +2604;AL # COMET +2605;AI # BLACK STAR +2606;AI # WHITE STAR +2607;AL # LIGHTNING +2608;AL # THUNDERSTORM +2609;AI # SUN +260A;AL # ASCENDING NODE +260B;AL # DESCENDING NODE +260C;AL # CONJUNCTION +260D;AL # OPPOSITION +260E;AI # BLACK TELEPHONE +260F;AI # WHITE TELEPHONE +2610;AL # BALLOT BOX +2611;AL # BALLOT BOX WITH CHECK +2612;AL # BALLOT BOX WITH X +2613;AL # SALTIRE +2616;AI # WHITE SHOGI PIECE +2617;AI # BLACK SHOGI PIECE +2619;AL # REVERSED ROTATED FLORAL HEART BULLET +261A;AL # BLACK LEFT POINTING INDEX +261B;AL # BLACK RIGHT POINTING INDEX +261C;AI # WHITE LEFT POINTING INDEX +261D;AL # WHITE UP POINTING INDEX +261E;AI # WHITE RIGHT POINTING INDEX +261F;AL # WHITE DOWN POINTING INDEX +2620;AL # SKULL AND CROSSBONES +2621;AL # CAUTION SIGN +2622;AL # RADIOACTIVE SIGN +2623;AL # BIOHAZARD SIGN +2624;AL # CADUCEUS +2625;AL # ANKH +2626;AL # ORTHODOX CROSS +2627;AL # CHI RHO +2628;AL # CROSS OF LORRAINE +2629;AL # CROSS OF JERUSALEM +262A;AL # STAR AND CRESCENT +262B;AL # FARSI SYMBOL +262C;AL # ADI SHAKTI +262D;AL # HAMMER AND SICKLE +262E;AL # PEACE SYMBOL +262F;AL # YIN YANG +2630;AL # TRIGRAM FOR HEAVEN +2631;AL # TRIGRAM FOR LAKE +2632;AL # TRIGRAM FOR FIRE +2633;AL # TRIGRAM FOR THUNDER +2634;AL # TRIGRAM FOR WIND +2635;AL # TRIGRAM FOR WATER +2636;AL # TRIGRAM FOR MOUNTAIN +2637;AL # TRIGRAM FOR EARTH +2638;AL # WHEEL OF DHARMA +2639;AL # WHITE FROWNING FACE +263A;AL # WHITE SMILING FACE +263B;AL # BLACK SMILING FACE +263C;AL # WHITE SUN WITH RAYS +263D;AL # FIRST QUARTER MOON +263E;AL # LAST QUARTER MOON +263F;AL # MERCURY +2640;AI # FEMALE SIGN +2641;AL # EARTH +2642;AI # MALE SIGN +2643;AL # JUPITER +2644;AL # SATURN +2645;AL # URANUS +2646;AL # NEPTUNE +2647;AL # PLUTO +2648;AL # ARIES +2649;AL # TAURUS +264A;AL # GEMINI +264B;AL # CANCER +264C;AL # LEO +264D;AL # VIRGO +264E;AL # LIBRA +264F;AL # SCORPIUS +2650;AL # SAGITTARIUS +2651;AL # CAPRICORN +2652;AL # AQUARIUS +2653;AL # PISCES +2654;AL # WHITE CHESS KING +2655;AL # WHITE CHESS QUEEN +2656;AL # WHITE CHESS ROOK +2657;AL # WHITE CHESS BISHOP +2658;AL # WHITE CHESS KNIGHT +2659;AL # WHITE CHESS PAWN +265A;AL # BLACK CHESS KING +265B;AL # BLACK CHESS QUEEN +265C;AL # BLACK CHESS ROOK +265D;AL # BLACK CHESS BISHOP +265E;AL # BLACK CHESS KNIGHT +265F;AL # BLACK CHESS PAWN +2660;AI # BLACK SPADE SUIT +2661;AI # WHITE HEART SUIT +2662;AL # WHITE DIAMOND SUIT +2663;AI # BLACK CLUB SUIT +2664;AI # WHITE SPADE SUIT +2665;AI # BLACK HEART SUIT +2666;AL # BLACK DIAMOND SUIT +2667;AI # WHITE CLUB SUIT +2668;AI # HOT SPRINGS +2669;AI # QUARTER NOTE +266A;AI # EIGHTH NOTE +266B;AL # BEAMED EIGHTH NOTES +266C;AI # BEAMED SIXTEENTH NOTES +266D;AI # MUSIC FLAT SIGN +266E;AL # MUSIC NATURAL SIGN +266F;AI # MUSIC SHARP SIGN +2670;AL # WEST SYRIAC CROSS +2671;AL # EAST SYRIAC CROSS +2672;AL # UNIVERSAL RECYCLING SYMBOL +2673;AL # RECYCLING SYMBOL FOR TYPE-1 PLASTICS +2674;AL # RECYCLING SYMBOL FOR TYPE-2 PLASTICS +2675;AL # RECYCLING SYMBOL FOR TYPE-3 PLASTICS +2676;AL # RECYCLING SYMBOL FOR TYPE-4 PLASTICS +2677;AL # RECYCLING SYMBOL FOR TYPE-5 PLASTICS +2678;AL # RECYCLING SYMBOL FOR TYPE-6 PLASTICS +2679;AL # RECYCLING SYMBOL FOR TYPE-7 PLASTICS +267A;AL # RECYCLING SYMBOL FOR GENERIC MATERIALS +267B;AL # BLACK UNIVERSAL RECYCLING SYMBOL +267C;AL # RECYCLED PAPER SYMBOL +267D;AL # PARTIALLY-RECYCLED PAPER SYMBOL +2680;AL # DIE FACE-1 +2681;AL # DIE FACE-2 +2682;AL # DIE FACE-3 +2683;AL # DIE FACE-4 +2684;AL # DIE FACE-5 +2685;AL # DIE FACE-6 +2686;AL # WHITE CIRCLE WITH DOT RIGHT +2687;AL # WHITE CIRCLE WITH TWO DOTS +2688;AL # BLACK CIRCLE WITH WHITE DOT RIGHT +2689;AL # BLACK CIRCLE WITH TWO WHITE DOTS +2701;AL # UPPER BLADE SCISSORS +2702;AL # BLACK SCISSORS +2703;AL # LOWER BLADE SCISSORS +2704;AL # WHITE SCISSORS +2706;AL # TELEPHONE LOCATION SIGN +2707;AL # TAPE DRIVE +2708;AL # AIRPLANE +2709;AL # ENVELOPE +270C;AL # VICTORY HAND +270D;AL # WRITING HAND +270E;AL # LOWER RIGHT PENCIL +270F;AL # PENCIL +2710;AL # UPPER RIGHT PENCIL +2711;AL # WHITE NIB +2712;AL # BLACK NIB +2713;AL # CHECK MARK +2714;AL # HEAVY CHECK MARK +2715;AL # MULTIPLICATION X +2716;AL # HEAVY MULTIPLICATION X +2717;AL # BALLOT X +2718;AL # HEAVY BALLOT X +2719;AL # OUTLINED GREEK CROSS +271A;AL # HEAVY GREEK CROSS +271B;AL # OPEN CENTRE CROSS +271C;AL # HEAVY OPEN CENTRE CROSS +271D;AL # LATIN CROSS +271E;AL # SHADOWED WHITE LATIN CROSS +271F;AL # OUTLINED LATIN CROSS +2720;AL # MALTESE CROSS +2721;AL # STAR OF DAVID +2722;AL # FOUR TEARDROP-SPOKED ASTERISK +2723;AL # FOUR BALLOON-SPOKED ASTERISK +2724;AL # HEAVY FOUR BALLOON-SPOKED ASTERISK +2725;AL # FOUR CLUB-SPOKED ASTERISK +2726;AL # BLACK FOUR POINTED STAR +2727;AL # WHITE FOUR POINTED STAR +2729;AL # STRESS OUTLINED WHITE STAR +272A;AL # CIRCLED WHITE STAR +272B;AL # OPEN CENTRE BLACK STAR +272C;AL # BLACK CENTRE WHITE STAR +272D;AL # OUTLINED BLACK STAR +272E;AL # HEAVY OUTLINED BLACK STAR +272F;AL # PINWHEEL STAR +2730;AL # SHADOWED WHITE STAR +2731;AL # HEAVY ASTERISK +2732;AL # OPEN CENTRE ASTERISK +2733;AL # EIGHT SPOKED ASTERISK +2734;AL # EIGHT POINTED BLACK STAR +2735;AL # EIGHT POINTED PINWHEEL STAR +2736;AL # SIX POINTED BLACK STAR +2737;AL # EIGHT POINTED RECTILINEAR BLACK STAR +2738;AL # HEAVY EIGHT POINTED RECTILINEAR BLACK STAR +2739;AL # TWELVE POINTED BLACK STAR +273A;AL # SIXTEEN POINTED ASTERISK +273B;AL # TEARDROP-SPOKED ASTERISK +273C;AL # OPEN CENTRE TEARDROP-SPOKED ASTERISK +273D;AL # HEAVY TEARDROP-SPOKED ASTERISK +273E;AL # SIX PETALLED BLACK AND WHITE FLORETTE +273F;AL # BLACK FLORETTE +2740;AL # WHITE FLORETTE +2741;AL # EIGHT PETALLED OUTLINED BLACK FLORETTE +2742;AL # CIRCLED OPEN CENTRE EIGHT POINTED STAR +2743;AL # HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK +2744;AL # SNOWFLAKE +2745;AL # TIGHT TRIFOLIATE SNOWFLAKE +2746;AL # HEAVY CHEVRON SNOWFLAKE +2747;AL # SPARKLE +2748;AL # HEAVY SPARKLE +2749;AL # BALLOON-SPOKED ASTERISK +274A;AL # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +274B;AL # HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +274D;AL # SHADOWED WHITE CIRCLE +274F;AL # LOWER RIGHT DROP-SHADOWED WHITE SQUARE +2750;AL # UPPER RIGHT DROP-SHADOWED WHITE SQUARE +2751;AL # LOWER RIGHT SHADOWED WHITE SQUARE +2752;AL # UPPER RIGHT SHADOWED WHITE SQUARE +2756;AL # BLACK DIAMOND MINUS WHITE X +2758;AL # LIGHT VERTICAL BAR +2759;AL # MEDIUM VERTICAL BAR +275A;AL # HEAVY VERTICAL BAR +275B;QU # HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT +275C;QU # HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT +275D;QU # HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT +275E;QU # HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT +2761;AL # CURVED STEM PARAGRAPH SIGN ORNAMENT +2762;EX # HEAVY EXCLAMATION MARK ORNAMENT +2763;EX # HEAVY HEART EXCLAMATION MARK ORNAMENT +2764;AL # HEAVY BLACK HEART +2765;AL # ROTATED HEAVY BLACK HEART BULLET +2766;AL # FLORAL HEART +2767;AL # ROTATED FLORAL HEART BULLET +2768;OP # MEDIUM LEFT PARENTHESIS ORNAMENT +2769;CL # MEDIUM RIGHT PARENTHESIS ORNAMENT +276A;OP # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B;CL # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C;OP # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D;CL # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E;OP # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F;CL # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770;OP # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771;CL # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772;OP # LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +2773;CL # LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +2774;OP # MEDIUM LEFT CURLY BRACKET ORNAMENT +2775;CL # MEDIUM RIGHT CURLY BRACKET ORNAMENT +2776;AL # DINGBAT NEGATIVE CIRCLED DIGIT ONE +2777;AL # DINGBAT NEGATIVE CIRCLED DIGIT TWO +2778;AL # DINGBAT NEGATIVE CIRCLED DIGIT THREE +2779;AL # DINGBAT NEGATIVE CIRCLED DIGIT FOUR +277A;AL # DINGBAT NEGATIVE CIRCLED DIGIT FIVE +277B;AL # DINGBAT NEGATIVE CIRCLED DIGIT SIX +277C;AL # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN +277D;AL # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT +277E;AL # DINGBAT NEGATIVE CIRCLED DIGIT NINE +277F;AL # DINGBAT NEGATIVE CIRCLED NUMBER TEN +2780;AL # DINGBAT CIRCLED SANS-SERIF DIGIT ONE +2781;AL # DINGBAT CIRCLED SANS-SERIF DIGIT TWO +2782;AL # DINGBAT CIRCLED SANS-SERIF DIGIT THREE +2783;AL # DINGBAT CIRCLED SANS-SERIF DIGIT FOUR +2784;AL # DINGBAT CIRCLED SANS-SERIF DIGIT FIVE +2785;AL # DINGBAT CIRCLED SANS-SERIF DIGIT SIX +2786;AL # DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN +2787;AL # DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT +2788;AL # DINGBAT CIRCLED SANS-SERIF DIGIT NINE +2789;AL # DINGBAT CIRCLED SANS-SERIF NUMBER TEN +278A;AL # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE +278B;AL # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO +278C;AL # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE +278D;AL # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR +278E;AL # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE +278F;AL # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX +2790;AL # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN +2791;AL # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT +2792;AL # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE +2793;AL # DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN +2794;AL # HEAVY WIDE-HEADED RIGHTWARDS ARROW +2798;AL # HEAVY SOUTH EAST ARROW +2799;AL # HEAVY RIGHTWARDS ARROW +279A;AL # HEAVY NORTH EAST ARROW +279B;AL # DRAFTING POINT RIGHTWARDS ARROW +279C;AL # HEAVY ROUND-TIPPED RIGHTWARDS ARROW +279D;AL # TRIANGLE-HEADED RIGHTWARDS ARROW +279E;AL # HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW +279F;AL # DASHED TRIANGLE-HEADED RIGHTWARDS ARROW +27A0;AL # HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW +27A1;AL # BLACK RIGHTWARDS ARROW +27A2;AL # THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD +27A3;AL # THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD +27A4;AL # BLACK RIGHTWARDS ARROWHEAD +27A5;AL # HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW +27A6;AL # HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW +27A7;AL # SQUAT BLACK RIGHTWARDS ARROW +27A8;AL # HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW +27A9;AL # RIGHT-SHADED WHITE RIGHTWARDS ARROW +27AA;AL # LEFT-SHADED WHITE RIGHTWARDS ARROW +27AB;AL # BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW +27AC;AL # FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW +27AD;AL # HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27AE;AL # HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27AF;AL # NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B1;AL # NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B2;AL # CIRCLED HEAVY WHITE RIGHTWARDS ARROW +27B3;AL # WHITE-FEATHERED RIGHTWARDS ARROW +27B4;AL # BLACK-FEATHERED SOUTH EAST ARROW +27B5;AL # BLACK-FEATHERED RIGHTWARDS ARROW +27B6;AL # BLACK-FEATHERED NORTH EAST ARROW +27B7;AL # HEAVY BLACK-FEATHERED SOUTH EAST ARROW +27B8;AL # HEAVY BLACK-FEATHERED RIGHTWARDS ARROW +27B9;AL # HEAVY BLACK-FEATHERED NORTH EAST ARROW +27BA;AL # TEARDROP-BARBED RIGHTWARDS ARROW +27BB;AL # HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW +27BC;AL # WEDGE-TAILED RIGHTWARDS ARROW +27BD;AL # HEAVY WEDGE-TAILED RIGHTWARDS ARROW +27BE;AL # OPEN-OUTLINED RIGHTWARDS ARROW +27D0;AL # WHITE DIAMOND WITH CENTRED DOT +27D1;AL # AND WITH DOT +27D2;AL # ELEMENT OF OPENING UPWARDS +27D3;AL # LOWER RIGHT CORNER WITH DOT +27D4;AL # UPPER LEFT CORNER WITH DOT +27D5;AL # LEFT OUTER JOIN +27D6;AL # RIGHT OUTER JOIN +27D7;AL # FULL OUTER JOIN +27D8;AL # LARGE UP TACK +27D9;AL # LARGE DOWN TACK +27DA;AL # LEFT AND RIGHT DOUBLE TURNSTILE +27DB;AL # LEFT AND RIGHT TACK +27DC;AL # LEFT MULTIMAP +27DD;AL # LONG RIGHT TACK +27DE;AL # LONG LEFT TACK +27DF;AL # UP TACK WITH CIRCLE ABOVE +27E0;AL # LOZENGE DIVIDED BY HORIZONTAL RULE +27E1;AL # WHITE CONCAVE-SIDED DIAMOND +27E2;AL # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK +27E3;AL # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK +27E4;AL # WHITE SQUARE WITH LEFTWARDS TICK +27E5;AL # WHITE SQUARE WITH RIGHTWARDS TICK +27E6;OP # MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7;CL # MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8;OP # MATHEMATICAL LEFT ANGLE BRACKET +27E9;CL # MATHEMATICAL RIGHT ANGLE BRACKET +27EA;OP # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB;CL # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27F0;AL # UPWARDS QUADRUPLE ARROW +27F1;AL # DOWNWARDS QUADRUPLE ARROW +27F2;AL # ANTICLOCKWISE GAPPED CIRCLE ARROW +27F3;AL # CLOCKWISE GAPPED CIRCLE ARROW +27F4;AL # RIGHT ARROW WITH CIRCLED PLUS +27F5;AL # LONG LEFTWARDS ARROW +27F6;AL # LONG RIGHTWARDS ARROW +27F7;AL # LONG LEFT RIGHT ARROW +27F8;AL # LONG LEFTWARDS DOUBLE ARROW +27F9;AL # LONG RIGHTWARDS DOUBLE ARROW +27FA;AL # LONG LEFT RIGHT DOUBLE ARROW +27FB;AL # LONG LEFTWARDS ARROW FROM BAR +27FC;AL # LONG RIGHTWARDS ARROW FROM BAR +27FD;AL # LONG LEFTWARDS DOUBLE ARROW FROM BAR +27FE;AL # LONG RIGHTWARDS DOUBLE ARROW FROM BAR +27FF;AL # LONG RIGHTWARDS SQUIGGLE ARROW +2800;AL # BRAILLE PATTERN BLANK +2801;AL # BRAILLE PATTERN DOTS-1 +2802;AL # BRAILLE PATTERN DOTS-2 +2803;AL # BRAILLE PATTERN DOTS-12 +2804;AL # BRAILLE PATTERN DOTS-3 +2805;AL # BRAILLE PATTERN DOTS-13 +2806;AL # BRAILLE PATTERN DOTS-23 +2807;AL # BRAILLE PATTERN DOTS-123 +2808;AL # BRAILLE PATTERN DOTS-4 +2809;AL # BRAILLE PATTERN DOTS-14 +280A;AL # BRAILLE PATTERN DOTS-24 +280B;AL # BRAILLE PATTERN DOTS-124 +280C;AL # BRAILLE PATTERN DOTS-34 +280D;AL # BRAILLE PATTERN DOTS-134 +280E;AL # BRAILLE PATTERN DOTS-234 +280F;AL # BRAILLE PATTERN DOTS-1234 +2810;AL # BRAILLE PATTERN DOTS-5 +2811;AL # BRAILLE PATTERN DOTS-15 +2812;AL # BRAILLE PATTERN DOTS-25 +2813;AL # BRAILLE PATTERN DOTS-125 +2814;AL # BRAILLE PATTERN DOTS-35 +2815;AL # BRAILLE PATTERN DOTS-135 +2816;AL # BRAILLE PATTERN DOTS-235 +2817;AL # BRAILLE PATTERN DOTS-1235 +2818;AL # BRAILLE PATTERN DOTS-45 +2819;AL # BRAILLE PATTERN DOTS-145 +281A;AL # BRAILLE PATTERN DOTS-245 +281B;AL # BRAILLE PATTERN DOTS-1245 +281C;AL # BRAILLE PATTERN DOTS-345 +281D;AL # BRAILLE PATTERN DOTS-1345 +281E;AL # BRAILLE PATTERN DOTS-2345 +281F;AL # BRAILLE PATTERN DOTS-12345 +2820;AL # BRAILLE PATTERN DOTS-6 +2821;AL # BRAILLE PATTERN DOTS-16 +2822;AL # BRAILLE PATTERN DOTS-26 +2823;AL # BRAILLE PATTERN DOTS-126 +2824;AL # BRAILLE PATTERN DOTS-36 +2825;AL # BRAILLE PATTERN DOTS-136 +2826;AL # BRAILLE PATTERN DOTS-236 +2827;AL # BRAILLE PATTERN DOTS-1236 +2828;AL # BRAILLE PATTERN DOTS-46 +2829;AL # BRAILLE PATTERN DOTS-146 +282A;AL # BRAILLE PATTERN DOTS-246 +282B;AL # BRAILLE PATTERN DOTS-1246 +282C;AL # BRAILLE PATTERN DOTS-346 +282D;AL # BRAILLE PATTERN DOTS-1346 +282E;AL # BRAILLE PATTERN DOTS-2346 +282F;AL # BRAILLE PATTERN DOTS-12346 +2830;AL # BRAILLE PATTERN DOTS-56 +2831;AL # BRAILLE PATTERN DOTS-156 +2832;AL # BRAILLE PATTERN DOTS-256 +2833;AL # BRAILLE PATTERN DOTS-1256 +2834;AL # BRAILLE PATTERN DOTS-356 +2835;AL # BRAILLE PATTERN DOTS-1356 +2836;AL # BRAILLE PATTERN DOTS-2356 +2837;AL # BRAILLE PATTERN DOTS-12356 +2838;AL # BRAILLE PATTERN DOTS-456 +2839;AL # BRAILLE PATTERN DOTS-1456 +283A;AL # BRAILLE PATTERN DOTS-2456 +283B;AL # BRAILLE PATTERN DOTS-12456 +283C;AL # BRAILLE PATTERN DOTS-3456 +283D;AL # BRAILLE PATTERN DOTS-13456 +283E;AL # BRAILLE PATTERN DOTS-23456 +283F;AL # BRAILLE PATTERN DOTS-123456 +2840;AL # BRAILLE PATTERN DOTS-7 +2841;AL # BRAILLE PATTERN DOTS-17 +2842;AL # BRAILLE PATTERN DOTS-27 +2843;AL # BRAILLE PATTERN DOTS-127 +2844;AL # BRAILLE PATTERN DOTS-37 +2845;AL # BRAILLE PATTERN DOTS-137 +2846;AL # BRAILLE PATTERN DOTS-237 +2847;AL # BRAILLE PATTERN DOTS-1237 +2848;AL # BRAILLE PATTERN DOTS-47 +2849;AL # BRAILLE PATTERN DOTS-147 +284A;AL # BRAILLE PATTERN DOTS-247 +284B;AL # BRAILLE PATTERN DOTS-1247 +284C;AL # BRAILLE PATTERN DOTS-347 +284D;AL # BRAILLE PATTERN DOTS-1347 +284E;AL # BRAILLE PATTERN DOTS-2347 +284F;AL # BRAILLE PATTERN DOTS-12347 +2850;AL # BRAILLE PATTERN DOTS-57 +2851;AL # BRAILLE PATTERN DOTS-157 +2852;AL # BRAILLE PATTERN DOTS-257 +2853;AL # BRAILLE PATTERN DOTS-1257 +2854;AL # BRAILLE PATTERN DOTS-357 +2855;AL # BRAILLE PATTERN DOTS-1357 +2856;AL # BRAILLE PATTERN DOTS-2357 +2857;AL # BRAILLE PATTERN DOTS-12357 +2858;AL # BRAILLE PATTERN DOTS-457 +2859;AL # BRAILLE PATTERN DOTS-1457 +285A;AL # BRAILLE PATTERN DOTS-2457 +285B;AL # BRAILLE PATTERN DOTS-12457 +285C;AL # BRAILLE PATTERN DOTS-3457 +285D;AL # BRAILLE PATTERN DOTS-13457 +285E;AL # BRAILLE PATTERN DOTS-23457 +285F;AL # BRAILLE PATTERN DOTS-123457 +2860;AL # BRAILLE PATTERN DOTS-67 +2861;AL # BRAILLE PATTERN DOTS-167 +2862;AL # BRAILLE PATTERN DOTS-267 +2863;AL # BRAILLE PATTERN DOTS-1267 +2864;AL # BRAILLE PATTERN DOTS-367 +2865;AL # BRAILLE PATTERN DOTS-1367 +2866;AL # BRAILLE PATTERN DOTS-2367 +2867;AL # BRAILLE PATTERN DOTS-12367 +2868;AL # BRAILLE PATTERN DOTS-467 +2869;AL # BRAILLE PATTERN DOTS-1467 +286A;AL # BRAILLE PATTERN DOTS-2467 +286B;AL # BRAILLE PATTERN DOTS-12467 +286C;AL # BRAILLE PATTERN DOTS-3467 +286D;AL # BRAILLE PATTERN DOTS-13467 +286E;AL # BRAILLE PATTERN DOTS-23467 +286F;AL # BRAILLE PATTERN DOTS-123467 +2870;AL # BRAILLE PATTERN DOTS-567 +2871;AL # BRAILLE PATTERN DOTS-1567 +2872;AL # BRAILLE PATTERN DOTS-2567 +2873;AL # BRAILLE PATTERN DOTS-12567 +2874;AL # BRAILLE PATTERN DOTS-3567 +2875;AL # BRAILLE PATTERN DOTS-13567 +2876;AL # BRAILLE PATTERN DOTS-23567 +2877;AL # BRAILLE PATTERN DOTS-123567 +2878;AL # BRAILLE PATTERN DOTS-4567 +2879;AL # BRAILLE PATTERN DOTS-14567 +287A;AL # BRAILLE PATTERN DOTS-24567 +287B;AL # BRAILLE PATTERN DOTS-124567 +287C;AL # BRAILLE PATTERN DOTS-34567 +287D;AL # BRAILLE PATTERN DOTS-134567 +287E;AL # BRAILLE PATTERN DOTS-234567 +287F;AL # BRAILLE PATTERN DOTS-1234567 +2880;AL # BRAILLE PATTERN DOTS-8 +2881;AL # BRAILLE PATTERN DOTS-18 +2882;AL # BRAILLE PATTERN DOTS-28 +2883;AL # BRAILLE PATTERN DOTS-128 +2884;AL # BRAILLE PATTERN DOTS-38 +2885;AL # BRAILLE PATTERN DOTS-138 +2886;AL # BRAILLE PATTERN DOTS-238 +2887;AL # BRAILLE PATTERN DOTS-1238 +2888;AL # BRAILLE PATTERN DOTS-48 +2889;AL # BRAILLE PATTERN DOTS-148 +288A;AL # BRAILLE PATTERN DOTS-248 +288B;AL # BRAILLE PATTERN DOTS-1248 +288C;AL # BRAILLE PATTERN DOTS-348 +288D;AL # BRAILLE PATTERN DOTS-1348 +288E;AL # BRAILLE PATTERN DOTS-2348 +288F;AL # BRAILLE PATTERN DOTS-12348 +2890;AL # BRAILLE PATTERN DOTS-58 +2891;AL # BRAILLE PATTERN DOTS-158 +2892;AL # BRAILLE PATTERN DOTS-258 +2893;AL # BRAILLE PATTERN DOTS-1258 +2894;AL # BRAILLE PATTERN DOTS-358 +2895;AL # BRAILLE PATTERN DOTS-1358 +2896;AL # BRAILLE PATTERN DOTS-2358 +2897;AL # BRAILLE PATTERN DOTS-12358 +2898;AL # BRAILLE PATTERN DOTS-458 +2899;AL # BRAILLE PATTERN DOTS-1458 +289A;AL # BRAILLE PATTERN DOTS-2458 +289B;AL # BRAILLE PATTERN DOTS-12458 +289C;AL # BRAILLE PATTERN DOTS-3458 +289D;AL # BRAILLE PATTERN DOTS-13458 +289E;AL # BRAILLE PATTERN DOTS-23458 +289F;AL # BRAILLE PATTERN DOTS-123458 +28A0;AL # BRAILLE PATTERN DOTS-68 +28A1;AL # BRAILLE PATTERN DOTS-168 +28A2;AL # BRAILLE PATTERN DOTS-268 +28A3;AL # BRAILLE PATTERN DOTS-1268 +28A4;AL # BRAILLE PATTERN DOTS-368 +28A5;AL # BRAILLE PATTERN DOTS-1368 +28A6;AL # BRAILLE PATTERN DOTS-2368 +28A7;AL # BRAILLE PATTERN DOTS-12368 +28A8;AL # BRAILLE PATTERN DOTS-468 +28A9;AL # BRAILLE PATTERN DOTS-1468 +28AA;AL # BRAILLE PATTERN DOTS-2468 +28AB;AL # BRAILLE PATTERN DOTS-12468 +28AC;AL # BRAILLE PATTERN DOTS-3468 +28AD;AL # BRAILLE PATTERN DOTS-13468 +28AE;AL # BRAILLE PATTERN DOTS-23468 +28AF;AL # BRAILLE PATTERN DOTS-123468 +28B0;AL # BRAILLE PATTERN DOTS-568 +28B1;AL # BRAILLE PATTERN DOTS-1568 +28B2;AL # BRAILLE PATTERN DOTS-2568 +28B3;AL # BRAILLE PATTERN DOTS-12568 +28B4;AL # BRAILLE PATTERN DOTS-3568 +28B5;AL # BRAILLE PATTERN DOTS-13568 +28B6;AL # BRAILLE PATTERN DOTS-23568 +28B7;AL # BRAILLE PATTERN DOTS-123568 +28B8;AL # BRAILLE PATTERN DOTS-4568 +28B9;AL # BRAILLE PATTERN DOTS-14568 +28BA;AL # BRAILLE PATTERN DOTS-24568 +28BB;AL # BRAILLE PATTERN DOTS-124568 +28BC;AL # BRAILLE PATTERN DOTS-34568 +28BD;AL # BRAILLE PATTERN DOTS-134568 +28BE;AL # BRAILLE PATTERN DOTS-234568 +28BF;AL # BRAILLE PATTERN DOTS-1234568 +28C0;AL # BRAILLE PATTERN DOTS-78 +28C1;AL # BRAILLE PATTERN DOTS-178 +28C2;AL # BRAILLE PATTERN DOTS-278 +28C3;AL # BRAILLE PATTERN DOTS-1278 +28C4;AL # BRAILLE PATTERN DOTS-378 +28C5;AL # BRAILLE PATTERN DOTS-1378 +28C6;AL # BRAILLE PATTERN DOTS-2378 +28C7;AL # BRAILLE PATTERN DOTS-12378 +28C8;AL # BRAILLE PATTERN DOTS-478 +28C9;AL # BRAILLE PATTERN DOTS-1478 +28CA;AL # BRAILLE PATTERN DOTS-2478 +28CB;AL # BRAILLE PATTERN DOTS-12478 +28CC;AL # BRAILLE PATTERN DOTS-3478 +28CD;AL # BRAILLE PATTERN DOTS-13478 +28CE;AL # BRAILLE PATTERN DOTS-23478 +28CF;AL # BRAILLE PATTERN DOTS-123478 +28D0;AL # BRAILLE PATTERN DOTS-578 +28D1;AL # BRAILLE PATTERN DOTS-1578 +28D2;AL # BRAILLE PATTERN DOTS-2578 +28D3;AL # BRAILLE PATTERN DOTS-12578 +28D4;AL # BRAILLE PATTERN DOTS-3578 +28D5;AL # BRAILLE PATTERN DOTS-13578 +28D6;AL # BRAILLE PATTERN DOTS-23578 +28D7;AL # BRAILLE PATTERN DOTS-123578 +28D8;AL # BRAILLE PATTERN DOTS-4578 +28D9;AL # BRAILLE PATTERN DOTS-14578 +28DA;AL # BRAILLE PATTERN DOTS-24578 +28DB;AL # BRAILLE PATTERN DOTS-124578 +28DC;AL # BRAILLE PATTERN DOTS-34578 +28DD;AL # BRAILLE PATTERN DOTS-134578 +28DE;AL # BRAILLE PATTERN DOTS-234578 +28DF;AL # BRAILLE PATTERN DOTS-1234578 +28E0;AL # BRAILLE PATTERN DOTS-678 +28E1;AL # BRAILLE PATTERN DOTS-1678 +28E2;AL # BRAILLE PATTERN DOTS-2678 +28E3;AL # BRAILLE PATTERN DOTS-12678 +28E4;AL # BRAILLE PATTERN DOTS-3678 +28E5;AL # BRAILLE PATTERN DOTS-13678 +28E6;AL # BRAILLE PATTERN DOTS-23678 +28E7;AL # BRAILLE PATTERN DOTS-123678 +28E8;AL # BRAILLE PATTERN DOTS-4678 +28E9;AL # BRAILLE PATTERN DOTS-14678 +28EA;AL # BRAILLE PATTERN DOTS-24678 +28EB;AL # BRAILLE PATTERN DOTS-124678 +28EC;AL # BRAILLE PATTERN DOTS-34678 +28ED;AL # BRAILLE PATTERN DOTS-134678 +28EE;AL # BRAILLE PATTERN DOTS-234678 +28EF;AL # BRAILLE PATTERN DOTS-1234678 +28F0;AL # BRAILLE PATTERN DOTS-5678 +28F1;AL # BRAILLE PATTERN DOTS-15678 +28F2;AL # BRAILLE PATTERN DOTS-25678 +28F3;AL # BRAILLE PATTERN DOTS-125678 +28F4;AL # BRAILLE PATTERN DOTS-35678 +28F5;AL # BRAILLE PATTERN DOTS-135678 +28F6;AL # BRAILLE PATTERN DOTS-235678 +28F7;AL # BRAILLE PATTERN DOTS-1235678 +28F8;AL # BRAILLE PATTERN DOTS-45678 +28F9;AL # BRAILLE PATTERN DOTS-145678 +28FA;AL # BRAILLE PATTERN DOTS-245678 +28FB;AL # BRAILLE PATTERN DOTS-1245678 +28FC;AL # BRAILLE PATTERN DOTS-345678 +28FD;AL # BRAILLE PATTERN DOTS-1345678 +28FE;AL # BRAILLE PATTERN DOTS-2345678 +28FF;AL # BRAILLE PATTERN DOTS-12345678 +2900;AL # RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE +2901;AL # RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE +2902;AL # LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE +2903;AL # RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE +2904;AL # LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE +2905;AL # RIGHTWARDS TWO-HEADED ARROW FROM BAR +2906;AL # LEFTWARDS DOUBLE ARROW FROM BAR +2907;AL # RIGHTWARDS DOUBLE ARROW FROM BAR +2908;AL # DOWNWARDS ARROW WITH HORIZONTAL STROKE +2909;AL # UPWARDS ARROW WITH HORIZONTAL STROKE +290A;AL # UPWARDS TRIPLE ARROW +290B;AL # DOWNWARDS TRIPLE ARROW +290C;AL # LEFTWARDS DOUBLE DASH ARROW +290D;AL # RIGHTWARDS DOUBLE DASH ARROW +290E;AL # LEFTWARDS TRIPLE DASH ARROW +290F;AL # RIGHTWARDS TRIPLE DASH ARROW +2910;AL # RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW +2911;AL # RIGHTWARDS ARROW WITH DOTTED STEM +2912;AL # UPWARDS ARROW TO BAR +2913;AL # DOWNWARDS ARROW TO BAR +2914;AL # RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE +2915;AL # RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE +2916;AL # RIGHTWARDS TWO-HEADED ARROW WITH TAIL +2917;AL # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE +2918;AL # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE +2919;AL # LEFTWARDS ARROW-TAIL +291A;AL # RIGHTWARDS ARROW-TAIL +291B;AL # LEFTWARDS DOUBLE ARROW-TAIL +291C;AL # RIGHTWARDS DOUBLE ARROW-TAIL +291D;AL # LEFTWARDS ARROW TO BLACK DIAMOND +291E;AL # RIGHTWARDS ARROW TO BLACK DIAMOND +291F;AL # LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND +2920;AL # RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND +2921;AL # NORTH WEST AND SOUTH EAST ARROW +2922;AL # NORTH EAST AND SOUTH WEST ARROW +2923;AL # NORTH WEST ARROW WITH HOOK +2924;AL # NORTH EAST ARROW WITH HOOK +2925;AL # SOUTH EAST ARROW WITH HOOK +2926;AL # SOUTH WEST ARROW WITH HOOK +2927;AL # NORTH WEST ARROW AND NORTH EAST ARROW +2928;AL # NORTH EAST ARROW AND SOUTH EAST ARROW +2929;AL # SOUTH EAST ARROW AND SOUTH WEST ARROW +292A;AL # SOUTH WEST ARROW AND NORTH WEST ARROW +292B;AL # RISING DIAGONAL CROSSING FALLING DIAGONAL +292C;AL # FALLING DIAGONAL CROSSING RISING DIAGONAL +292D;AL # SOUTH EAST ARROW CROSSING NORTH EAST ARROW +292E;AL # NORTH EAST ARROW CROSSING SOUTH EAST ARROW +292F;AL # FALLING DIAGONAL CROSSING NORTH EAST ARROW +2930;AL # RISING DIAGONAL CROSSING SOUTH EAST ARROW +2931;AL # NORTH EAST ARROW CROSSING NORTH WEST ARROW +2932;AL # NORTH WEST ARROW CROSSING NORTH EAST ARROW +2933;AL # WAVE ARROW POINTING DIRECTLY RIGHT +2934;AL # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS +2935;AL # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS +2936;AL # ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS +2937;AL # ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS +2938;AL # RIGHT-SIDE ARC CLOCKWISE ARROW +2939;AL # LEFT-SIDE ARC ANTICLOCKWISE ARROW +293A;AL # TOP ARC ANTICLOCKWISE ARROW +293B;AL # BOTTOM ARC ANTICLOCKWISE ARROW +293C;AL # TOP ARC CLOCKWISE ARROW WITH MINUS +293D;AL # TOP ARC ANTICLOCKWISE ARROW WITH PLUS +293E;AL # LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW +293F;AL # LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW +2940;AL # ANTICLOCKWISE CLOSED CIRCLE ARROW +2941;AL # CLOCKWISE CLOSED CIRCLE ARROW +2942;AL # RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW +2943;AL # LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW +2944;AL # SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW +2945;AL # RIGHTWARDS ARROW WITH PLUS BELOW +2946;AL # LEFTWARDS ARROW WITH PLUS BELOW +2947;AL # RIGHTWARDS ARROW THROUGH X +2948;AL # LEFT RIGHT ARROW THROUGH SMALL CIRCLE +2949;AL # UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE +294A;AL # LEFT BARB UP RIGHT BARB DOWN HARPOON +294B;AL # LEFT BARB DOWN RIGHT BARB UP HARPOON +294C;AL # UP BARB RIGHT DOWN BARB LEFT HARPOON +294D;AL # UP BARB LEFT DOWN BARB RIGHT HARPOON +294E;AL # LEFT BARB UP RIGHT BARB UP HARPOON +294F;AL # UP BARB RIGHT DOWN BARB RIGHT HARPOON +2950;AL # LEFT BARB DOWN RIGHT BARB DOWN HARPOON +2951;AL # UP BARB LEFT DOWN BARB LEFT HARPOON +2952;AL # LEFTWARDS HARPOON WITH BARB UP TO BAR +2953;AL # RIGHTWARDS HARPOON WITH BARB UP TO BAR +2954;AL # UPWARDS HARPOON WITH BARB RIGHT TO BAR +2955;AL # DOWNWARDS HARPOON WITH BARB RIGHT TO BAR +2956;AL # LEFTWARDS HARPOON WITH BARB DOWN TO BAR +2957;AL # RIGHTWARDS HARPOON WITH BARB DOWN TO BAR +2958;AL # UPWARDS HARPOON WITH BARB LEFT TO BAR +2959;AL # DOWNWARDS HARPOON WITH BARB LEFT TO BAR +295A;AL # LEFTWARDS HARPOON WITH BARB UP FROM BAR +295B;AL # RIGHTWARDS HARPOON WITH BARB UP FROM BAR +295C;AL # UPWARDS HARPOON WITH BARB RIGHT FROM BAR +295D;AL # DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR +295E;AL # LEFTWARDS HARPOON WITH BARB DOWN FROM BAR +295F;AL # RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR +2960;AL # UPWARDS HARPOON WITH BARB LEFT FROM BAR +2961;AL # DOWNWARDS HARPOON WITH BARB LEFT FROM BAR +2962;AL # LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN +2963;AL # UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT +2964;AL # RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN +2965;AL # DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT +2966;AL # LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP +2967;AL # LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN +2968;AL # RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP +2969;AL # RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN +296A;AL # LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH +296B;AL # LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH +296C;AL # RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH +296D;AL # RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH +296E;AL # UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT +296F;AL # DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT +2970;AL # RIGHT DOUBLE ARROW WITH ROUNDED HEAD +2971;AL # EQUALS SIGN ABOVE RIGHTWARDS ARROW +2972;AL # TILDE OPERATOR ABOVE RIGHTWARDS ARROW +2973;AL # LEFTWARDS ARROW ABOVE TILDE OPERATOR +2974;AL # RIGHTWARDS ARROW ABOVE TILDE OPERATOR +2975;AL # RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO +2976;AL # LESS-THAN ABOVE LEFTWARDS ARROW +2977;AL # LEFTWARDS ARROW THROUGH LESS-THAN +2978;AL # GREATER-THAN ABOVE RIGHTWARDS ARROW +2979;AL # SUBSET ABOVE RIGHTWARDS ARROW +297A;AL # LEFTWARDS ARROW THROUGH SUBSET +297B;AL # SUPERSET ABOVE LEFTWARDS ARROW +297C;AL # LEFT FISH TAIL +297D;AL # RIGHT FISH TAIL +297E;AL # UP FISH TAIL +297F;AL # DOWN FISH TAIL +2980;AL # TRIPLE VERTICAL BAR DELIMITER +2981;AL # Z NOTATION SPOT +2982;AL # Z NOTATION TYPE COLON +2983;OP # LEFT WHITE CURLY BRACKET +2984;CL # RIGHT WHITE CURLY BRACKET +2985;OP # LEFT WHITE PARENTHESIS +2986;CL # RIGHT WHITE PARENTHESIS +2987;OP # Z NOTATION LEFT IMAGE BRACKET +2988;CL # Z NOTATION RIGHT IMAGE BRACKET +2989;OP # Z NOTATION LEFT BINDING BRACKET +298A;CL # Z NOTATION RIGHT BINDING BRACKET +298B;OP # LEFT SQUARE BRACKET WITH UNDERBAR +298C;CL # RIGHT SQUARE BRACKET WITH UNDERBAR +298D;OP # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E;CL # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F;OP # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990;CL # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991;OP # LEFT ANGLE BRACKET WITH DOT +2992;CL # RIGHT ANGLE BRACKET WITH DOT +2993;OP # LEFT ARC LESS-THAN BRACKET +2994;CL # RIGHT ARC GREATER-THAN BRACKET +2995;OP # DOUBLE LEFT ARC GREATER-THAN BRACKET +2996;CL # DOUBLE RIGHT ARC LESS-THAN BRACKET +2997;OP # LEFT BLACK TORTOISE SHELL BRACKET +2998;CL # RIGHT BLACK TORTOISE SHELL BRACKET +2999;AL # DOTTED FENCE +299A;AL # VERTICAL ZIGZAG LINE +299B;AL # MEASURED ANGLE OPENING LEFT +299C;AL # RIGHT ANGLE VARIANT WITH SQUARE +299D;AL # MEASURED RIGHT ANGLE WITH DOT +299E;AL # ANGLE WITH S INSIDE +299F;AL # ACUTE ANGLE +29A0;AL # SPHERICAL ANGLE OPENING LEFT +29A1;AL # SPHERICAL ANGLE OPENING UP +29A2;AL # TURNED ANGLE +29A3;AL # REVERSED ANGLE +29A4;AL # ANGLE WITH UNDERBAR +29A5;AL # REVERSED ANGLE WITH UNDERBAR +29A6;AL # OBLIQUE ANGLE OPENING UP +29A7;AL # OBLIQUE ANGLE OPENING DOWN +29A8;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT +29A9;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT +29AA;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT +29AB;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT +29AC;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP +29AD;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP +29AE;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN +29AF;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN +29B0;AL # REVERSED EMPTY SET +29B1;AL # EMPTY SET WITH OVERBAR +29B2;AL # EMPTY SET WITH SMALL CIRCLE ABOVE +29B3;AL # EMPTY SET WITH RIGHT ARROW ABOVE +29B4;AL # EMPTY SET WITH LEFT ARROW ABOVE +29B5;AL # CIRCLE WITH HORIZONTAL BAR +29B6;AL # CIRCLED VERTICAL BAR +29B7;AL # CIRCLED PARALLEL +29B8;AL # CIRCLED REVERSE SOLIDUS +29B9;AL # CIRCLED PERPENDICULAR +29BA;AL # CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR +29BB;AL # CIRCLE WITH SUPERIMPOSED X +29BC;AL # CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN +29BD;AL # UP ARROW THROUGH CIRCLE +29BE;AL # CIRCLED WHITE BULLET +29BF;AL # CIRCLED BULLET +29C0;AL # CIRCLED LESS-THAN +29C1;AL # CIRCLED GREATER-THAN +29C2;AL # CIRCLE WITH SMALL CIRCLE TO THE RIGHT +29C3;AL # CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT +29C4;AL # SQUARED RISING DIAGONAL SLASH +29C5;AL # SQUARED FALLING DIAGONAL SLASH +29C6;AL # SQUARED ASTERISK +29C7;AL # SQUARED SMALL CIRCLE +29C8;AL # SQUARED SQUARE +29C9;AL # TWO JOINED SQUARES +29CA;AL # TRIANGLE WITH DOT ABOVE +29CB;AL # TRIANGLE WITH UNDERBAR +29CC;AL # S IN TRIANGLE +29CD;AL # TRIANGLE WITH SERIFS AT BOTTOM +29CE;AL # RIGHT TRIANGLE ABOVE LEFT TRIANGLE +29CF;AL # LEFT TRIANGLE BESIDE VERTICAL BAR +29D0;AL # VERTICAL BAR BESIDE RIGHT TRIANGLE +29D1;AL # BOWTIE WITH LEFT HALF BLACK +29D2;AL # BOWTIE WITH RIGHT HALF BLACK +29D3;AL # BLACK BOWTIE +29D4;AL # TIMES WITH LEFT HALF BLACK +29D5;AL # TIMES WITH RIGHT HALF BLACK +29D6;AL # WHITE HOURGLASS +29D7;AL # BLACK HOURGLASS +29D8;OP # LEFT WIGGLY FENCE +29D9;CL # RIGHT WIGGLY FENCE +29DA;OP # LEFT DOUBLE WIGGLY FENCE +29DB;CL # RIGHT DOUBLE WIGGLY FENCE +29DC;AL # INCOMPLETE INFINITY +29DD;AL # TIE OVER INFINITY +29DE;AL # INFINITY NEGATED WITH VERTICAL BAR +29DF;AL # DOUBLE-ENDED MULTIMAP +29E0;AL # SQUARE WITH CONTOURED OUTLINE +29E1;AL # INCREASES AS +29E2;AL # SHUFFLE PRODUCT +29E3;AL # EQUALS SIGN AND SLANTED PARALLEL +29E4;AL # EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE +29E5;AL # IDENTICAL TO AND SLANTED PARALLEL +29E6;AL # GLEICH STARK +29E7;AL # THERMODYNAMIC +29E8;AL # DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK +29E9;AL # DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK +29EA;AL # BLACK DIAMOND WITH DOWN ARROW +29EB;AL # BLACK LOZENGE +29EC;AL # WHITE CIRCLE WITH DOWN ARROW +29ED;AL # BLACK CIRCLE WITH DOWN ARROW +29EE;AL # ERROR-BARRED WHITE SQUARE +29EF;AL # ERROR-BARRED BLACK SQUARE +29F0;AL # ERROR-BARRED WHITE DIAMOND +29F1;AL # ERROR-BARRED BLACK DIAMOND +29F2;AL # ERROR-BARRED WHITE CIRCLE +29F3;AL # ERROR-BARRED BLACK CIRCLE +29F4;AL # RULE-DELAYED +29F5;AL # REVERSE SOLIDUS OPERATOR +29F6;AL # SOLIDUS WITH OVERBAR +29F7;AL # REVERSE SOLIDUS WITH HORIZONTAL STROKE +29F8;AL # BIG SOLIDUS +29F9;AL # BIG REVERSE SOLIDUS +29FA;AL # DOUBLE PLUS +29FB;AL # TRIPLE PLUS +29FC;OP # LEFT-POINTING CURVED ANGLE BRACKET +29FD;CL # RIGHT-POINTING CURVED ANGLE BRACKET +29FE;AL # TINY +29FF;AL # MINY +2A00;AL # N-ARY CIRCLED DOT OPERATOR +2A01;AL # N-ARY CIRCLED PLUS OPERATOR +2A02;AL # N-ARY CIRCLED TIMES OPERATOR +2A03;AL # N-ARY UNION OPERATOR WITH DOT +2A04;AL # N-ARY UNION OPERATOR WITH PLUS +2A05;AL # N-ARY SQUARE INTERSECTION OPERATOR +2A06;AL # N-ARY SQUARE UNION OPERATOR +2A07;AL # TWO LOGICAL AND OPERATOR +2A08;AL # TWO LOGICAL OR OPERATOR +2A09;AL # N-ARY TIMES OPERATOR +2A0A;AL # MODULO TWO SUM +2A0B;AL # SUMMATION WITH INTEGRAL +2A0C;AL # QUADRUPLE INTEGRAL OPERATOR +2A0D;AL # FINITE PART INTEGRAL +2A0E;AL # INTEGRAL WITH DOUBLE STROKE +2A0F;AL # INTEGRAL AVERAGE WITH SLASH +2A10;AL # CIRCULATION FUNCTION +2A11;AL # ANTICLOCKWISE INTEGRATION +2A12;AL # LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE +2A13;AL # LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE +2A14;AL # LINE INTEGRATION NOT INCLUDING THE POLE +2A15;AL # INTEGRAL AROUND A POINT OPERATOR +2A16;AL # QUATERNION INTEGRAL OPERATOR +2A17;AL # INTEGRAL WITH LEFTWARDS ARROW WITH HOOK +2A18;AL # INTEGRAL WITH TIMES SIGN +2A19;AL # INTEGRAL WITH INTERSECTION +2A1A;AL # INTEGRAL WITH UNION +2A1B;AL # INTEGRAL WITH OVERBAR +2A1C;AL # INTEGRAL WITH UNDERBAR +2A1D;AL # JOIN +2A1E;AL # LARGE LEFT TRIANGLE OPERATOR +2A1F;AL # Z NOTATION SCHEMA COMPOSITION +2A20;AL # Z NOTATION SCHEMA PIPING +2A21;AL # Z NOTATION SCHEMA PROJECTION +2A22;AL # PLUS SIGN WITH SMALL CIRCLE ABOVE +2A23;AL # PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE +2A24;AL # PLUS SIGN WITH TILDE ABOVE +2A25;AL # PLUS SIGN WITH DOT BELOW +2A26;AL # PLUS SIGN WITH TILDE BELOW +2A27;AL # PLUS SIGN WITH SUBSCRIPT TWO +2A28;AL # PLUS SIGN WITH BLACK TRIANGLE +2A29;AL # MINUS SIGN WITH COMMA ABOVE +2A2A;AL # MINUS SIGN WITH DOT BELOW +2A2B;AL # MINUS SIGN WITH FALLING DOTS +2A2C;AL # MINUS SIGN WITH RISING DOTS +2A2D;AL # PLUS SIGN IN LEFT HALF CIRCLE +2A2E;AL # PLUS SIGN IN RIGHT HALF CIRCLE +2A2F;AL # VECTOR OR CROSS PRODUCT +2A30;AL # MULTIPLICATION SIGN WITH DOT ABOVE +2A31;AL # MULTIPLICATION SIGN WITH UNDERBAR +2A32;AL # SEMIDIRECT PRODUCT WITH BOTTOM CLOSED +2A33;AL # SMASH PRODUCT +2A34;AL # MULTIPLICATION SIGN IN LEFT HALF CIRCLE +2A35;AL # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE +2A36;AL # CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT +2A37;AL # MULTIPLICATION SIGN IN DOUBLE CIRCLE +2A38;AL # CIRCLED DIVISION SIGN +2A39;AL # PLUS SIGN IN TRIANGLE +2A3A;AL # MINUS SIGN IN TRIANGLE +2A3B;AL # MULTIPLICATION SIGN IN TRIANGLE +2A3C;AL # INTERIOR PRODUCT +2A3D;AL # RIGHTHAND INTERIOR PRODUCT +2A3E;AL # Z NOTATION RELATIONAL COMPOSITION +2A3F;AL # AMALGAMATION OR COPRODUCT +2A40;AL # INTERSECTION WITH DOT +2A41;AL # UNION WITH MINUS SIGN +2A42;AL # UNION WITH OVERBAR +2A43;AL # INTERSECTION WITH OVERBAR +2A44;AL # INTERSECTION WITH LOGICAL AND +2A45;AL # UNION WITH LOGICAL OR +2A46;AL # UNION ABOVE INTERSECTION +2A47;AL # INTERSECTION ABOVE UNION +2A48;AL # UNION ABOVE BAR ABOVE INTERSECTION +2A49;AL # INTERSECTION ABOVE BAR ABOVE UNION +2A4A;AL # UNION BESIDE AND JOINED WITH UNION +2A4B;AL # INTERSECTION BESIDE AND JOINED WITH INTERSECTION +2A4C;AL # CLOSED UNION WITH SERIFS +2A4D;AL # CLOSED INTERSECTION WITH SERIFS +2A4E;AL # DOUBLE SQUARE INTERSECTION +2A4F;AL # DOUBLE SQUARE UNION +2A50;AL # CLOSED UNION WITH SERIFS AND SMASH PRODUCT +2A51;AL # LOGICAL AND WITH DOT ABOVE +2A52;AL # LOGICAL OR WITH DOT ABOVE +2A53;AL # DOUBLE LOGICAL AND +2A54;AL # DOUBLE LOGICAL OR +2A55;AL # TWO INTERSECTING LOGICAL AND +2A56;AL # TWO INTERSECTING LOGICAL OR +2A57;AL # SLOPING LARGE OR +2A58;AL # SLOPING LARGE AND +2A59;AL # LOGICAL OR OVERLAPPING LOGICAL AND +2A5A;AL # LOGICAL AND WITH MIDDLE STEM +2A5B;AL # LOGICAL OR WITH MIDDLE STEM +2A5C;AL # LOGICAL AND WITH HORIZONTAL DASH +2A5D;AL # LOGICAL OR WITH HORIZONTAL DASH +2A5E;AL # LOGICAL AND WITH DOUBLE OVERBAR +2A5F;AL # LOGICAL AND WITH UNDERBAR +2A60;AL # LOGICAL AND WITH DOUBLE UNDERBAR +2A61;AL # SMALL VEE WITH UNDERBAR +2A62;AL # LOGICAL OR WITH DOUBLE OVERBAR +2A63;AL # LOGICAL OR WITH DOUBLE UNDERBAR +2A64;AL # Z NOTATION DOMAIN ANTIRESTRICTION +2A65;AL # Z NOTATION RANGE ANTIRESTRICTION +2A66;AL # EQUALS SIGN WITH DOT BELOW +2A67;AL # IDENTICAL WITH DOT ABOVE +2A68;AL # TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE +2A69;AL # TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE +2A6A;AL # TILDE OPERATOR WITH DOT ABOVE +2A6B;AL # TILDE OPERATOR WITH RISING DOTS +2A6C;AL # SIMILAR MINUS SIMILAR +2A6D;AL # CONGRUENT WITH DOT ABOVE +2A6E;AL # EQUALS WITH ASTERISK +2A6F;AL # ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT +2A70;AL # APPROXIMATELY EQUAL OR EQUAL TO +2A71;AL # EQUALS SIGN ABOVE PLUS SIGN +2A72;AL # PLUS SIGN ABOVE EQUALS SIGN +2A73;AL # EQUALS SIGN ABOVE TILDE OPERATOR +2A74;AL # DOUBLE COLON EQUAL +2A75;AL # TWO CONSECUTIVE EQUALS SIGNS +2A76;AL # THREE CONSECUTIVE EQUALS SIGNS +2A77;AL # EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW +2A78;AL # EQUIVALENT WITH FOUR DOTS ABOVE +2A79;AL # LESS-THAN WITH CIRCLE INSIDE +2A7A;AL # GREATER-THAN WITH CIRCLE INSIDE +2A7B;AL # LESS-THAN WITH QUESTION MARK ABOVE +2A7C;AL # GREATER-THAN WITH QUESTION MARK ABOVE +2A7D;AL # LESS-THAN OR SLANTED EQUAL TO +2A7E;AL # GREATER-THAN OR SLANTED EQUAL TO +2A7F;AL # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +2A80;AL # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +2A81;AL # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +2A82;AL # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +2A83;AL # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT +2A84;AL # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT +2A85;AL # LESS-THAN OR APPROXIMATE +2A86;AL # GREATER-THAN OR APPROXIMATE +2A87;AL # LESS-THAN AND SINGLE-LINE NOT EQUAL TO +2A88;AL # GREATER-THAN AND SINGLE-LINE NOT EQUAL TO +2A89;AL # LESS-THAN AND NOT APPROXIMATE +2A8A;AL # GREATER-THAN AND NOT APPROXIMATE +2A8B;AL # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN +2A8C;AL # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN +2A8D;AL # LESS-THAN ABOVE SIMILAR OR EQUAL +2A8E;AL # GREATER-THAN ABOVE SIMILAR OR EQUAL +2A8F;AL # LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN +2A90;AL # GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN +2A91;AL # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL +2A92;AL # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL +2A93;AL # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL +2A94;AL # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL +2A95;AL # SLANTED EQUAL TO OR LESS-THAN +2A96;AL # SLANTED EQUAL TO OR GREATER-THAN +2A97;AL # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE +2A98;AL # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE +2A99;AL # DOUBLE-LINE EQUAL TO OR LESS-THAN +2A9A;AL # DOUBLE-LINE EQUAL TO OR GREATER-THAN +2A9B;AL # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN +2A9C;AL # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN +2A9D;AL # SIMILAR OR LESS-THAN +2A9E;AL # SIMILAR OR GREATER-THAN +2A9F;AL # SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN +2AA0;AL # SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN +2AA1;AL # DOUBLE NESTED LESS-THAN +2AA2;AL # DOUBLE NESTED GREATER-THAN +2AA3;AL # DOUBLE NESTED LESS-THAN WITH UNDERBAR +2AA4;AL # GREATER-THAN OVERLAPPING LESS-THAN +2AA5;AL # GREATER-THAN BESIDE LESS-THAN +2AA6;AL # LESS-THAN CLOSED BY CURVE +2AA7;AL # GREATER-THAN CLOSED BY CURVE +2AA8;AL # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +2AA9;AL # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +2AAA;AL # SMALLER THAN +2AAB;AL # LARGER THAN +2AAC;AL # SMALLER THAN OR EQUAL TO +2AAD;AL # LARGER THAN OR EQUAL TO +2AAE;AL # EQUALS SIGN WITH BUMPY ABOVE +2AAF;AL # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN +2AB0;AL # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN +2AB1;AL # PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO +2AB2;AL # SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO +2AB3;AL # PRECEDES ABOVE EQUALS SIGN +2AB4;AL # SUCCEEDS ABOVE EQUALS SIGN +2AB5;AL # PRECEDES ABOVE NOT EQUAL TO +2AB6;AL # SUCCEEDS ABOVE NOT EQUAL TO +2AB7;AL # PRECEDES ABOVE ALMOST EQUAL TO +2AB8;AL # SUCCEEDS ABOVE ALMOST EQUAL TO +2AB9;AL # PRECEDES ABOVE NOT ALMOST EQUAL TO +2ABA;AL # SUCCEEDS ABOVE NOT ALMOST EQUAL TO +2ABB;AL # DOUBLE PRECEDES +2ABC;AL # DOUBLE SUCCEEDS +2ABD;AL # SUBSET WITH DOT +2ABE;AL # SUPERSET WITH DOT +2ABF;AL # SUBSET WITH PLUS SIGN BELOW +2AC0;AL # SUPERSET WITH PLUS SIGN BELOW +2AC1;AL # SUBSET WITH MULTIPLICATION SIGN BELOW +2AC2;AL # SUPERSET WITH MULTIPLICATION SIGN BELOW +2AC3;AL # SUBSET OF OR EQUAL TO WITH DOT ABOVE +2AC4;AL # SUPERSET OF OR EQUAL TO WITH DOT ABOVE +2AC5;AL # SUBSET OF ABOVE EQUALS SIGN +2AC6;AL # SUPERSET OF ABOVE EQUALS SIGN +2AC7;AL # SUBSET OF ABOVE TILDE OPERATOR +2AC8;AL # SUPERSET OF ABOVE TILDE OPERATOR +2AC9;AL # SUBSET OF ABOVE ALMOST EQUAL TO +2ACA;AL # SUPERSET OF ABOVE ALMOST EQUAL TO +2ACB;AL # SUBSET OF ABOVE NOT EQUAL TO +2ACC;AL # SUPERSET OF ABOVE NOT EQUAL TO +2ACD;AL # SQUARE LEFT OPEN BOX OPERATOR +2ACE;AL # SQUARE RIGHT OPEN BOX OPERATOR +2ACF;AL # CLOSED SUBSET +2AD0;AL # CLOSED SUPERSET +2AD1;AL # CLOSED SUBSET OR EQUAL TO +2AD2;AL # CLOSED SUPERSET OR EQUAL TO +2AD3;AL # SUBSET ABOVE SUPERSET +2AD4;AL # SUPERSET ABOVE SUBSET +2AD5;AL # SUBSET ABOVE SUBSET +2AD6;AL # SUPERSET ABOVE SUPERSET +2AD7;AL # SUPERSET BESIDE SUBSET +2AD8;AL # SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET +2AD9;AL # ELEMENT OF OPENING DOWNWARDS +2ADA;AL # PITCHFORK WITH TEE TOP +2ADB;AL # TRANSVERSAL INTERSECTION +2ADC;AL # FORKING +2ADD;AL # NONFORKING +2ADE;AL # SHORT LEFT TACK +2ADF;AL # SHORT DOWN TACK +2AE0;AL # SHORT UP TACK +2AE1;AL # PERPENDICULAR WITH S +2AE2;AL # VERTICAL BAR TRIPLE RIGHT TURNSTILE +2AE3;AL # DOUBLE VERTICAL BAR LEFT TURNSTILE +2AE4;AL # VERTICAL BAR DOUBLE LEFT TURNSTILE +2AE5;AL # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE +2AE6;AL # LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL +2AE7;AL # SHORT DOWN TACK WITH OVERBAR +2AE8;AL # SHORT UP TACK WITH UNDERBAR +2AE9;AL # SHORT UP TACK ABOVE SHORT DOWN TACK +2AEA;AL # DOUBLE DOWN TACK +2AEB;AL # DOUBLE UP TACK +2AEC;AL # DOUBLE STROKE NOT SIGN +2AED;AL # REVERSED DOUBLE STROKE NOT SIGN +2AEE;AL # DOES NOT DIVIDE WITH REVERSED NEGATION SLASH +2AEF;AL # VERTICAL LINE WITH CIRCLE ABOVE +2AF0;AL # VERTICAL LINE WITH CIRCLE BELOW +2AF1;AL # DOWN TACK WITH CIRCLE BELOW +2AF2;AL # PARALLEL WITH HORIZONTAL STROKE +2AF3;AL # PARALLEL WITH TILDE OPERATOR +2AF4;AL # TRIPLE VERTICAL BAR BINARY RELATION +2AF5;AL # TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE +2AF6;AL # TRIPLE COLON OPERATOR +2AF7;AL # TRIPLE NESTED LESS-THAN +2AF8;AL # TRIPLE NESTED GREATER-THAN +2AF9;AL # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO +2AFA;AL # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO +2AFB;AL # TRIPLE SOLIDUS BINARY RELATION +2AFC;AL # LARGE TRIPLE VERTICAL BAR OPERATOR +2AFD;AL # DOUBLE SOLIDUS OPERATOR +2AFE;AL # WHITE VERTICAL BAR +2AFF;AL # N-ARY WHITE VERTICAL BAR +2E80;ID # CJK RADICAL REPEAT +2E81;ID # CJK RADICAL CLIFF +2E82;ID # CJK RADICAL SECOND ONE +2E83;ID # CJK RADICAL SECOND TWO +2E84;ID # CJK RADICAL SECOND THREE +2E85;ID # CJK RADICAL PERSON +2E86;ID # CJK RADICAL BOX +2E87;ID # CJK RADICAL TABLE +2E88;ID # CJK RADICAL KNIFE ONE +2E89;ID # CJK RADICAL KNIFE TWO +2E8A;ID # CJK RADICAL DIVINATION +2E8B;ID # CJK RADICAL SEAL +2E8C;ID # CJK RADICAL SMALL ONE +2E8D;ID # CJK RADICAL SMALL TWO +2E8E;ID # CJK RADICAL LAME ONE +2E8F;ID # CJK RADICAL LAME TWO +2E90;ID # CJK RADICAL LAME THREE +2E91;ID # CJK RADICAL LAME FOUR +2E92;ID # CJK RADICAL SNAKE +2E93;ID # CJK RADICAL THREAD +2E94;ID # CJK RADICAL SNOUT ONE +2E95;ID # CJK RADICAL SNOUT TWO +2E96;ID # CJK RADICAL HEART ONE +2E97;ID # CJK RADICAL HEART TWO +2E98;ID # CJK RADICAL HAND +2E99;ID # CJK RADICAL RAP +2E9B;ID # CJK RADICAL CHOKE +2E9C;ID # CJK RADICAL SUN +2E9D;ID # CJK RADICAL MOON +2E9E;ID # CJK RADICAL DEATH +2E9F;ID # CJK RADICAL MOTHER +2EA0;ID # CJK RADICAL CIVILIAN +2EA1;ID # CJK RADICAL WATER ONE +2EA2;ID # CJK RADICAL WATER TWO +2EA3;ID # CJK RADICAL FIRE +2EA4;ID # CJK RADICAL PAW ONE +2EA5;ID # CJK RADICAL PAW TWO +2EA6;ID # CJK RADICAL SIMPLIFIED HALF TREE TRUNK +2EA7;ID # CJK RADICAL COW +2EA8;ID # CJK RADICAL DOG +2EA9;ID # CJK RADICAL JADE +2EAA;ID # CJK RADICAL BOLT OF CLOTH +2EAB;ID # CJK RADICAL EYE +2EAC;ID # CJK RADICAL SPIRIT ONE +2EAD;ID # CJK RADICAL SPIRIT TWO +2EAE;ID # CJK RADICAL BAMBOO +2EAF;ID # CJK RADICAL SILK +2EB0;ID # CJK RADICAL C-SIMPLIFIED SILK +2EB1;ID # CJK RADICAL NET ONE +2EB2;ID # CJK RADICAL NET TWO +2EB3;ID # CJK RADICAL NET THREE +2EB4;ID # CJK RADICAL NET FOUR +2EB5;ID # CJK RADICAL MESH +2EB6;ID # CJK RADICAL SHEEP +2EB7;ID # CJK RADICAL RAM +2EB8;ID # CJK RADICAL EWE +2EB9;ID # CJK RADICAL OLD +2EBA;ID # CJK RADICAL BRUSH ONE +2EBB;ID # CJK RADICAL BRUSH TWO +2EBC;ID # CJK RADICAL MEAT +2EBD;ID # CJK RADICAL MORTAR +2EBE;ID # CJK RADICAL GRASS ONE +2EBF;ID # CJK RADICAL GRASS TWO +2EC0;ID # CJK RADICAL GRASS THREE +2EC1;ID # CJK RADICAL TIGER +2EC2;ID # CJK RADICAL CLOTHES +2EC3;ID # CJK RADICAL WEST ONE +2EC4;ID # CJK RADICAL WEST TWO +2EC5;ID # CJK RADICAL C-SIMPLIFIED SEE +2EC6;ID # CJK RADICAL SIMPLIFIED HORN +2EC7;ID # CJK RADICAL HORN +2EC8;ID # CJK RADICAL C-SIMPLIFIED SPEECH +2EC9;ID # CJK RADICAL C-SIMPLIFIED SHELL +2ECA;ID # CJK RADICAL FOOT +2ECB;ID # CJK RADICAL C-SIMPLIFIED CART +2ECC;ID # CJK RADICAL SIMPLIFIED WALK +2ECD;ID # CJK RADICAL WALK ONE +2ECE;ID # CJK RADICAL WALK TWO +2ECF;ID # CJK RADICAL CITY +2ED0;ID # CJK RADICAL C-SIMPLIFIED GOLD +2ED1;ID # CJK RADICAL LONG ONE +2ED2;ID # CJK RADICAL LONG TWO +2ED3;ID # CJK RADICAL C-SIMPLIFIED LONG +2ED4;ID # CJK RADICAL C-SIMPLIFIED GATE +2ED5;ID # CJK RADICAL MOUND ONE +2ED6;ID # CJK RADICAL MOUND TWO +2ED7;ID # CJK RADICAL RAIN +2ED8;ID # CJK RADICAL BLUE +2ED9;ID # CJK RADICAL C-SIMPLIFIED TANNED LEATHER +2EDA;ID # CJK RADICAL C-SIMPLIFIED LEAF +2EDB;ID # CJK RADICAL C-SIMPLIFIED WIND +2EDC;ID # CJK RADICAL C-SIMPLIFIED FLY +2EDD;ID # CJK RADICAL EAT ONE +2EDE;ID # CJK RADICAL EAT TWO +2EDF;ID # CJK RADICAL EAT THREE +2EE0;ID # CJK RADICAL C-SIMPLIFIED EAT +2EE1;ID # CJK RADICAL HEAD +2EE2;ID # CJK RADICAL C-SIMPLIFIED HORSE +2EE3;ID # CJK RADICAL BONE +2EE4;ID # CJK RADICAL GHOST +2EE5;ID # CJK RADICAL C-SIMPLIFIED FISH +2EE6;ID # CJK RADICAL C-SIMPLIFIED BIRD +2EE7;ID # CJK RADICAL C-SIMPLIFIED SALT +2EE8;ID # CJK RADICAL SIMPLIFIED WHEAT +2EE9;ID # CJK RADICAL SIMPLIFIED YELLOW +2EEA;ID # CJK RADICAL C-SIMPLIFIED FROG +2EEB;ID # CJK RADICAL J-SIMPLIFIED EVEN +2EEC;ID # CJK RADICAL C-SIMPLIFIED EVEN +2EED;ID # CJK RADICAL J-SIMPLIFIED TOOTH +2EEE;ID # CJK RADICAL C-SIMPLIFIED TOOTH +2EEF;ID # CJK RADICAL J-SIMPLIFIED DRAGON +2EF0;ID # CJK RADICAL C-SIMPLIFIED DRAGON +2EF1;ID # CJK RADICAL TURTLE +2EF2;ID # CJK RADICAL J-SIMPLIFIED TURTLE +2EF3;ID # CJK RADICAL C-SIMPLIFIED TURTLE +2F00;ID # KANGXI RADICAL ONE +2F01;ID # KANGXI RADICAL LINE +2F02;ID # KANGXI RADICAL DOT +2F03;ID # KANGXI RADICAL SLASH +2F04;ID # KANGXI RADICAL SECOND +2F05;ID # KANGXI RADICAL HOOK +2F06;ID # KANGXI RADICAL TWO +2F07;ID # KANGXI RADICAL LID +2F08;ID # KANGXI RADICAL MAN +2F09;ID # KANGXI RADICAL LEGS +2F0A;ID # KANGXI RADICAL ENTER +2F0B;ID # KANGXI RADICAL EIGHT +2F0C;ID # KANGXI RADICAL DOWN BOX +2F0D;ID # KANGXI RADICAL COVER +2F0E;ID # KANGXI RADICAL ICE +2F0F;ID # KANGXI RADICAL TABLE +2F10;ID # KANGXI RADICAL OPEN BOX +2F11;ID # KANGXI RADICAL KNIFE +2F12;ID # KANGXI RADICAL POWER +2F13;ID # KANGXI RADICAL WRAP +2F14;ID # KANGXI RADICAL SPOON +2F15;ID # KANGXI RADICAL RIGHT OPEN BOX +2F16;ID # KANGXI RADICAL HIDING ENCLOSURE +2F17;ID # KANGXI RADICAL TEN +2F18;ID # KANGXI RADICAL DIVINATION +2F19;ID # KANGXI RADICAL SEAL +2F1A;ID # KANGXI RADICAL CLIFF +2F1B;ID # KANGXI RADICAL PRIVATE +2F1C;ID # KANGXI RADICAL AGAIN +2F1D;ID # KANGXI RADICAL MOUTH +2F1E;ID # KANGXI RADICAL ENCLOSURE +2F1F;ID # KANGXI RADICAL EARTH +2F20;ID # KANGXI RADICAL SCHOLAR +2F21;ID # KANGXI RADICAL GO +2F22;ID # KANGXI RADICAL GO SLOWLY +2F23;ID # KANGXI RADICAL EVENING +2F24;ID # KANGXI RADICAL BIG +2F25;ID # KANGXI RADICAL WOMAN +2F26;ID # KANGXI RADICAL CHILD +2F27;ID # KANGXI RADICAL ROOF +2F28;ID # KANGXI RADICAL INCH +2F29;ID # KANGXI RADICAL SMALL +2F2A;ID # KANGXI RADICAL LAME +2F2B;ID # KANGXI RADICAL CORPSE +2F2C;ID # KANGXI RADICAL SPROUT +2F2D;ID # KANGXI RADICAL MOUNTAIN +2F2E;ID # KANGXI RADICAL RIVER +2F2F;ID # KANGXI RADICAL WORK +2F30;ID # KANGXI RADICAL ONESELF +2F31;ID # KANGXI RADICAL TURBAN +2F32;ID # KANGXI RADICAL DRY +2F33;ID # KANGXI RADICAL SHORT THREAD +2F34;ID # KANGXI RADICAL DOTTED CLIFF +2F35;ID # KANGXI RADICAL LONG STRIDE +2F36;ID # KANGXI RADICAL TWO HANDS +2F37;ID # KANGXI RADICAL SHOOT +2F38;ID # KANGXI RADICAL BOW +2F39;ID # KANGXI RADICAL SNOUT +2F3A;ID # KANGXI RADICAL BRISTLE +2F3B;ID # KANGXI RADICAL STEP +2F3C;ID # KANGXI RADICAL HEART +2F3D;ID # KANGXI RADICAL HALBERD +2F3E;ID # KANGXI RADICAL DOOR +2F3F;ID # KANGXI RADICAL HAND +2F40;ID # KANGXI RADICAL BRANCH +2F41;ID # KANGXI RADICAL RAP +2F42;ID # KANGXI RADICAL SCRIPT +2F43;ID # KANGXI RADICAL DIPPER +2F44;ID # KANGXI RADICAL AXE +2F45;ID # KANGXI RADICAL SQUARE +2F46;ID # KANGXI RADICAL NOT +2F47;ID # KANGXI RADICAL SUN +2F48;ID # KANGXI RADICAL SAY +2F49;ID # KANGXI RADICAL MOON +2F4A;ID # KANGXI RADICAL TREE +2F4B;ID # KANGXI RADICAL LACK +2F4C;ID # KANGXI RADICAL STOP +2F4D;ID # KANGXI RADICAL DEATH +2F4E;ID # KANGXI RADICAL WEAPON +2F4F;ID # KANGXI RADICAL DO NOT +2F50;ID # KANGXI RADICAL COMPARE +2F51;ID # KANGXI RADICAL FUR +2F52;ID # KANGXI RADICAL CLAN +2F53;ID # KANGXI RADICAL STEAM +2F54;ID # KANGXI RADICAL WATER +2F55;ID # KANGXI RADICAL FIRE +2F56;ID # KANGXI RADICAL CLAW +2F57;ID # KANGXI RADICAL FATHER +2F58;ID # KANGXI RADICAL DOUBLE X +2F59;ID # KANGXI RADICAL HALF TREE TRUNK +2F5A;ID # KANGXI RADICAL SLICE +2F5B;ID # KANGXI RADICAL FANG +2F5C;ID # KANGXI RADICAL COW +2F5D;ID # KANGXI RADICAL DOG +2F5E;ID # KANGXI RADICAL PROFOUND +2F5F;ID # KANGXI RADICAL JADE +2F60;ID # KANGXI RADICAL MELON +2F61;ID # KANGXI RADICAL TILE +2F62;ID # KANGXI RADICAL SWEET +2F63;ID # KANGXI RADICAL LIFE +2F64;ID # KANGXI RADICAL USE +2F65;ID # KANGXI RADICAL FIELD +2F66;ID # KANGXI RADICAL BOLT OF CLOTH +2F67;ID # KANGXI RADICAL SICKNESS +2F68;ID # KANGXI RADICAL DOTTED TENT +2F69;ID # KANGXI RADICAL WHITE +2F6A;ID # KANGXI RADICAL SKIN +2F6B;ID # KANGXI RADICAL DISH +2F6C;ID # KANGXI RADICAL EYE +2F6D;ID # KANGXI RADICAL SPEAR +2F6E;ID # KANGXI RADICAL ARROW +2F6F;ID # KANGXI RADICAL STONE +2F70;ID # KANGXI RADICAL SPIRIT +2F71;ID # KANGXI RADICAL TRACK +2F72;ID # KANGXI RADICAL GRAIN +2F73;ID # KANGXI RADICAL CAVE +2F74;ID # KANGXI RADICAL STAND +2F75;ID # KANGXI RADICAL BAMBOO +2F76;ID # KANGXI RADICAL RICE +2F77;ID # KANGXI RADICAL SILK +2F78;ID # KANGXI RADICAL JAR +2F79;ID # KANGXI RADICAL NET +2F7A;ID # KANGXI RADICAL SHEEP +2F7B;ID # KANGXI RADICAL FEATHER +2F7C;ID # KANGXI RADICAL OLD +2F7D;ID # KANGXI RADICAL AND +2F7E;ID # KANGXI RADICAL PLOW +2F7F;ID # KANGXI RADICAL EAR +2F80;ID # KANGXI RADICAL BRUSH +2F81;ID # KANGXI RADICAL MEAT +2F82;ID # KANGXI RADICAL MINISTER +2F83;ID # KANGXI RADICAL SELF +2F84;ID # KANGXI RADICAL ARRIVE +2F85;ID # KANGXI RADICAL MORTAR +2F86;ID # KANGXI RADICAL TONGUE +2F87;ID # KANGXI RADICAL OPPOSE +2F88;ID # KANGXI RADICAL BOAT +2F89;ID # KANGXI RADICAL STOPPING +2F8A;ID # KANGXI RADICAL COLOR +2F8B;ID # KANGXI RADICAL GRASS +2F8C;ID # KANGXI RADICAL TIGER +2F8D;ID # KANGXI RADICAL INSECT +2F8E;ID # KANGXI RADICAL BLOOD +2F8F;ID # KANGXI RADICAL WALK ENCLOSURE +2F90;ID # KANGXI RADICAL CLOTHES +2F91;ID # KANGXI RADICAL WEST +2F92;ID # KANGXI RADICAL SEE +2F93;ID # KANGXI RADICAL HORN +2F94;ID # KANGXI RADICAL SPEECH +2F95;ID # KANGXI RADICAL VALLEY +2F96;ID # KANGXI RADICAL BEAN +2F97;ID # KANGXI RADICAL PIG +2F98;ID # KANGXI RADICAL BADGER +2F99;ID # KANGXI RADICAL SHELL +2F9A;ID # KANGXI RADICAL RED +2F9B;ID # KANGXI RADICAL RUN +2F9C;ID # KANGXI RADICAL FOOT +2F9D;ID # KANGXI RADICAL BODY +2F9E;ID # KANGXI RADICAL CART +2F9F;ID # KANGXI RADICAL BITTER +2FA0;ID # KANGXI RADICAL MORNING +2FA1;ID # KANGXI RADICAL WALK +2FA2;ID # KANGXI RADICAL CITY +2FA3;ID # KANGXI RADICAL WINE +2FA4;ID # KANGXI RADICAL DISTINGUISH +2FA5;ID # KANGXI RADICAL VILLAGE +2FA6;ID # KANGXI RADICAL GOLD +2FA7;ID # KANGXI RADICAL LONG +2FA8;ID # KANGXI RADICAL GATE +2FA9;ID # KANGXI RADICAL MOUND +2FAA;ID # KANGXI RADICAL SLAVE +2FAB;ID # KANGXI RADICAL SHORT TAILED BIRD +2FAC;ID # KANGXI RADICAL RAIN +2FAD;ID # KANGXI RADICAL BLUE +2FAE;ID # KANGXI RADICAL WRONG +2FAF;ID # KANGXI RADICAL FACE +2FB0;ID # KANGXI RADICAL LEATHER +2FB1;ID # KANGXI RADICAL TANNED LEATHER +2FB2;ID # KANGXI RADICAL LEEK +2FB3;ID # KANGXI RADICAL SOUND +2FB4;ID # KANGXI RADICAL LEAF +2FB5;ID # KANGXI RADICAL WIND +2FB6;ID # KANGXI RADICAL FLY +2FB7;ID # KANGXI RADICAL EAT +2FB8;ID # KANGXI RADICAL HEAD +2FB9;ID # KANGXI RADICAL FRAGRANT +2FBA;ID # KANGXI RADICAL HORSE +2FBB;ID # KANGXI RADICAL BONE +2FBC;ID # KANGXI RADICAL TALL +2FBD;ID # KANGXI RADICAL HAIR +2FBE;ID # KANGXI RADICAL FIGHT +2FBF;ID # KANGXI RADICAL SACRIFICIAL WINE +2FC0;ID # KANGXI RADICAL CAULDRON +2FC1;ID # KANGXI RADICAL GHOST +2FC2;ID # KANGXI RADICAL FISH +2FC3;ID # KANGXI RADICAL BIRD +2FC4;ID # KANGXI RADICAL SALT +2FC5;ID # KANGXI RADICAL DEER +2FC6;ID # KANGXI RADICAL WHEAT +2FC7;ID # KANGXI RADICAL HEMP +2FC8;ID # KANGXI RADICAL YELLOW +2FC9;ID # KANGXI RADICAL MILLET +2FCA;ID # KANGXI RADICAL BLACK +2FCB;ID # KANGXI RADICAL EMBROIDERY +2FCC;ID # KANGXI RADICAL FROG +2FCD;ID # KANGXI RADICAL TRIPOD +2FCE;ID # KANGXI RADICAL DRUM +2FCF;ID # KANGXI RADICAL RAT +2FD0;ID # KANGXI RADICAL NOSE +2FD1;ID # KANGXI RADICAL EVEN +2FD2;ID # KANGXI RADICAL TOOTH +2FD3;ID # KANGXI RADICAL DRAGON +2FD4;ID # KANGXI RADICAL TURTLE +2FD5;ID # KANGXI RADICAL FLUTE +2FF0;ID # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT +2FF1;ID # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW +2FF2;ID # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT +2FF3;ID # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW +2FF4;ID # IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND +2FF5;ID # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE +2FF6;ID # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW +2FF7;ID # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT +2FF8;ID # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT +2FF9;ID # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT +2FFA;ID # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT +2FFB;ID # IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID +3000;ID # IDEOGRAPHIC SPACE +3001;CL # IDEOGRAPHIC COMMA +3002;CL # IDEOGRAPHIC FULL STOP +3003;ID # DITTO MARK +3004;ID # JAPANESE INDUSTRIAL STANDARD SYMBOL +3005;NS # IDEOGRAPHIC ITERATION MARK +3006;ID # IDEOGRAPHIC CLOSING MARK +3007;ID # IDEOGRAPHIC NUMBER ZERO +3008;OP # LEFT ANGLE BRACKET +3009;CL # RIGHT ANGLE BRACKET +300A;OP # LEFT DOUBLE ANGLE BRACKET +300B;CL # RIGHT DOUBLE ANGLE BRACKET +300C;OP # LEFT CORNER BRACKET +300D;CL # RIGHT CORNER BRACKET +300E;OP # LEFT WHITE CORNER BRACKET +300F;CL # RIGHT WHITE CORNER BRACKET +3010;OP # LEFT BLACK LENTICULAR BRACKET +3011;CL # RIGHT BLACK LENTICULAR BRACKET +3012;ID # POSTAL MARK +3013;ID # GETA MARK +3014;OP # LEFT TORTOISE SHELL BRACKET +3015;CL # RIGHT TORTOISE SHELL BRACKET +3016;OP # LEFT WHITE LENTICULAR BRACKET +3017;CL # RIGHT WHITE LENTICULAR BRACKET +3018;OP # LEFT WHITE TORTOISE SHELL BRACKET +3019;CL # RIGHT WHITE TORTOISE SHELL BRACKET +301A;OP # LEFT WHITE SQUARE BRACKET +301B;CL # RIGHT WHITE SQUARE BRACKET +301C;NS # WAVE DASH +301D;OP # REVERSED DOUBLE PRIME QUOTATION MARK +301E;CL # DOUBLE PRIME QUOTATION MARK +301F;CL # LOW DOUBLE PRIME QUOTATION MARK +3020;ID # POSTAL MARK FACE +3021;ID # HANGZHOU NUMERAL ONE +3022;ID # HANGZHOU NUMERAL TWO +3023;ID # HANGZHOU NUMERAL THREE +3024;ID # HANGZHOU NUMERAL FOUR +3025;ID # HANGZHOU NUMERAL FIVE +3026;ID # HANGZHOU NUMERAL SIX +3027;ID # HANGZHOU NUMERAL SEVEN +3028;ID # HANGZHOU NUMERAL EIGHT +3029;ID # HANGZHOU NUMERAL NINE +302A;CM # IDEOGRAPHIC LEVEL TONE MARK +302B;CM # IDEOGRAPHIC RISING TONE MARK +302C;CM # IDEOGRAPHIC DEPARTING TONE MARK +302D;CM # IDEOGRAPHIC ENTERING TONE MARK +302E;CM # HANGUL SINGLE DOT TONE MARK +302F;CM # HANGUL DOUBLE DOT TONE MARK +3030;ID # WAVY DASH +3031;ID # VERTICAL KANA REPEAT MARK +3032;ID # VERTICAL KANA REPEAT WITH VOICED SOUND MARK +3033;ID # VERTICAL KANA REPEAT MARK UPPER HALF +3034;ID # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF +3035;ID # VERTICAL KANA REPEAT MARK LOWER HALF +3036;ID # CIRCLED POSTAL MARK +3037;ID # IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL +3038;ID # HANGZHOU NUMERAL TEN +3039;ID # HANGZHOU NUMERAL TWENTY +303A;ID # HANGZHOU NUMERAL THIRTY +303B;NS # VERTICAL IDEOGRAPHIC ITERATION MARK +303C;NS # MASU MARK +303D;ID # PART ALTERNATION MARK +303E;ID # IDEOGRAPHIC VARIATION INDICATOR +303F;ID # IDEOGRAPHIC HALF FILL SPACE +3041;NS # HIRAGANA LETTER SMALL A +3042;ID # HIRAGANA LETTER A +3043;NS # HIRAGANA LETTER SMALL I +3044;ID # HIRAGANA LETTER I +3045;NS # HIRAGANA LETTER SMALL U +3046;ID # HIRAGANA LETTER U +3047;NS # HIRAGANA LETTER SMALL E +3048;ID # HIRAGANA LETTER E +3049;NS # HIRAGANA LETTER SMALL O +304A;ID # HIRAGANA LETTER O +304B;ID # HIRAGANA LETTER KA +304C;ID # HIRAGANA LETTER GA +304D;ID # HIRAGANA LETTER KI +304E;ID # HIRAGANA LETTER GI +304F;ID # HIRAGANA LETTER KU +3050;ID # HIRAGANA LETTER GU +3051;ID # HIRAGANA LETTER KE +3052;ID # HIRAGANA LETTER GE +3053;ID # HIRAGANA LETTER KO +3054;ID # HIRAGANA LETTER GO +3055;ID # HIRAGANA LETTER SA +3056;ID # HIRAGANA LETTER ZA +3057;ID # HIRAGANA LETTER SI +3058;ID # HIRAGANA LETTER ZI +3059;ID # HIRAGANA LETTER SU +305A;ID # HIRAGANA LETTER ZU +305B;ID # HIRAGANA LETTER SE +305C;ID # HIRAGANA LETTER ZE +305D;ID # HIRAGANA LETTER SO +305E;ID # HIRAGANA LETTER ZO +305F;ID # HIRAGANA LETTER TA +3060;ID # HIRAGANA LETTER DA +3061;ID # HIRAGANA LETTER TI +3062;ID # HIRAGANA LETTER DI +3063;NS # HIRAGANA LETTER SMALL TU +3064;ID # HIRAGANA LETTER TU +3065;ID # HIRAGANA LETTER DU +3066;ID # HIRAGANA LETTER TE +3067;ID # HIRAGANA LETTER DE +3068;ID # HIRAGANA LETTER TO +3069;ID # HIRAGANA LETTER DO +306A;ID # HIRAGANA LETTER NA +306B;ID # HIRAGANA LETTER NI +306C;ID # HIRAGANA LETTER NU +306D;ID # HIRAGANA LETTER NE +306E;ID # HIRAGANA LETTER NO +306F;ID # HIRAGANA LETTER HA +3070;ID # HIRAGANA LETTER BA +3071;ID # HIRAGANA LETTER PA +3072;ID # HIRAGANA LETTER HI +3073;ID # HIRAGANA LETTER BI +3074;ID # HIRAGANA LETTER PI +3075;ID # HIRAGANA LETTER HU +3076;ID # HIRAGANA LETTER BU +3077;ID # HIRAGANA LETTER PU +3078;ID # HIRAGANA LETTER HE +3079;ID # HIRAGANA LETTER BE +307A;ID # HIRAGANA LETTER PE +307B;ID # HIRAGANA LETTER HO +307C;ID # HIRAGANA LETTER BO +307D;ID # HIRAGANA LETTER PO +307E;ID # HIRAGANA LETTER MA +307F;ID # HIRAGANA LETTER MI +3080;ID # HIRAGANA LETTER MU +3081;ID # HIRAGANA LETTER ME +3082;ID # HIRAGANA LETTER MO +3083;NS # HIRAGANA LETTER SMALL YA +3084;ID # HIRAGANA LETTER YA +3085;NS # HIRAGANA LETTER SMALL YU +3086;ID # HIRAGANA LETTER YU +3087;NS # HIRAGANA LETTER SMALL YO +3088;ID # HIRAGANA LETTER YO +3089;ID # HIRAGANA LETTER RA +308A;ID # HIRAGANA LETTER RI +308B;ID # HIRAGANA LETTER RU +308C;ID # HIRAGANA LETTER RE +308D;ID # HIRAGANA LETTER RO +308E;NS # HIRAGANA LETTER SMALL WA +308F;ID # HIRAGANA LETTER WA +3090;ID # HIRAGANA LETTER WI +3091;ID # HIRAGANA LETTER WE +3092;ID # HIRAGANA LETTER WO +3093;ID # HIRAGANA LETTER N +3094;ID # HIRAGANA LETTER VU +3095;NS # HIRAGANA LETTER SMALL KA +3096;NS # HIRAGANA LETTER SMALL KE +3099;CM # COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK +309A;CM # COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309B;NS # KATAKANA-HIRAGANA VOICED SOUND MARK +309C;NS # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309D;NS # HIRAGANA ITERATION MARK +309E;NS # HIRAGANA VOICED ITERATION MARK +309F;ID # HIRAGANA DIGRAPH YORI +30A0;NS # KATAKANA-HIRAGANA DOUBLE HYPHEN +30A1;NS # KATAKANA LETTER SMALL A +30A2;ID # KATAKANA LETTER A +30A3;NS # KATAKANA LETTER SMALL I +30A4;ID # KATAKANA LETTER I +30A5;NS # KATAKANA LETTER SMALL U +30A6;ID # KATAKANA LETTER U +30A7;NS # KATAKANA LETTER SMALL E +30A8;ID # KATAKANA LETTER E +30A9;NS # KATAKANA LETTER SMALL O +30AA;ID # KATAKANA LETTER O +30AB;ID # KATAKANA LETTER KA +30AC;ID # KATAKANA LETTER GA +30AD;ID # KATAKANA LETTER KI +30AE;ID # KATAKANA LETTER GI +30AF;ID # KATAKANA LETTER KU +30B0;ID # KATAKANA LETTER GU +30B1;ID # KATAKANA LETTER KE +30B2;ID # KATAKANA LETTER GE +30B3;ID # KATAKANA LETTER KO +30B4;ID # KATAKANA LETTER GO +30B5;ID # KATAKANA LETTER SA +30B6;ID # KATAKANA LETTER ZA +30B7;ID # KATAKANA LETTER SI +30B8;ID # KATAKANA LETTER ZI +30B9;ID # KATAKANA LETTER SU +30BA;ID # KATAKANA LETTER ZU +30BB;ID # KATAKANA LETTER SE +30BC;ID # KATAKANA LETTER ZE +30BD;ID # KATAKANA LETTER SO +30BE;ID # KATAKANA LETTER ZO +30BF;ID # KATAKANA LETTER TA +30C0;ID # KATAKANA LETTER DA +30C1;ID # KATAKANA LETTER TI +30C2;ID # KATAKANA LETTER DI +30C3;NS # KATAKANA LETTER SMALL TU +30C4;ID # KATAKANA LETTER TU +30C5;ID # KATAKANA LETTER DU +30C6;ID # KATAKANA LETTER TE +30C7;ID # KATAKANA LETTER DE +30C8;ID # KATAKANA LETTER TO +30C9;ID # KATAKANA LETTER DO +30CA;ID # KATAKANA LETTER NA +30CB;ID # KATAKANA LETTER NI +30CC;ID # KATAKANA LETTER NU +30CD;ID # KATAKANA LETTER NE +30CE;ID # KATAKANA LETTER NO +30CF;ID # KATAKANA LETTER HA +30D0;ID # KATAKANA LETTER BA +30D1;ID # KATAKANA LETTER PA +30D2;ID # KATAKANA LETTER HI +30D3;ID # KATAKANA LETTER BI +30D4;ID # KATAKANA LETTER PI +30D5;ID # KATAKANA LETTER HU +30D6;ID # KATAKANA LETTER BU +30D7;ID # KATAKANA LETTER PU +30D8;ID # KATAKANA LETTER HE +30D9;ID # KATAKANA LETTER BE +30DA;ID # KATAKANA LETTER PE +30DB;ID # KATAKANA LETTER HO +30DC;ID # KATAKANA LETTER BO +30DD;ID # KATAKANA LETTER PO +30DE;ID # KATAKANA LETTER MA +30DF;ID # KATAKANA LETTER MI +30E0;ID # KATAKANA LETTER MU +30E1;ID # KATAKANA LETTER ME +30E2;ID # KATAKANA LETTER MO +30E3;NS # KATAKANA LETTER SMALL YA +30E4;ID # KATAKANA LETTER YA +30E5;NS # KATAKANA LETTER SMALL YU +30E6;ID # KATAKANA LETTER YU +30E7;NS # KATAKANA LETTER SMALL YO +30E8;ID # KATAKANA LETTER YO +30E9;ID # KATAKANA LETTER RA +30EA;ID # KATAKANA LETTER RI +30EB;ID # KATAKANA LETTER RU +30EC;ID # KATAKANA LETTER RE +30ED;ID # KATAKANA LETTER RO +30EE;NS # KATAKANA LETTER SMALL WA +30EF;ID # KATAKANA LETTER WA +30F0;ID # KATAKANA LETTER WI +30F1;ID # KATAKANA LETTER WE +30F2;ID # KATAKANA LETTER WO +30F3;ID # KATAKANA LETTER N +30F4;ID # KATAKANA LETTER VU +30F5;NS # KATAKANA LETTER SMALL KA +30F6;NS # KATAKANA LETTER SMALL KE +30F7;ID # KATAKANA LETTER VA +30F8;ID # KATAKANA LETTER VI +30F9;ID # KATAKANA LETTER VE +30FA;ID # KATAKANA LETTER VO +30FB;NS # KATAKANA MIDDLE DOT +30FC;ID # KATAKANA-HIRAGANA PROLONGED SOUND MARK +30FD;NS # KATAKANA ITERATION MARK +30FE;ID # KATAKANA VOICED ITERATION MARK +30FF;ID # KATAKANA DIGRAPH KOTO +3105;ID # BOPOMOFO LETTER B +3106;ID # BOPOMOFO LETTER P +3107;ID # BOPOMOFO LETTER M +3108;ID # BOPOMOFO LETTER F +3109;ID # BOPOMOFO LETTER D +310A;ID # BOPOMOFO LETTER T +310B;ID # BOPOMOFO LETTER N +310C;ID # BOPOMOFO LETTER L +310D;ID # BOPOMOFO LETTER G +310E;ID # BOPOMOFO LETTER K +310F;ID # BOPOMOFO LETTER H +3110;ID # BOPOMOFO LETTER J +3111;ID # BOPOMOFO LETTER Q +3112;ID # BOPOMOFO LETTER X +3113;ID # BOPOMOFO LETTER ZH +3114;ID # BOPOMOFO LETTER CH +3115;ID # BOPOMOFO LETTER SH +3116;ID # BOPOMOFO LETTER R +3117;ID # BOPOMOFO LETTER Z +3118;ID # BOPOMOFO LETTER C +3119;ID # BOPOMOFO LETTER S +311A;ID # BOPOMOFO LETTER A +311B;ID # BOPOMOFO LETTER O +311C;ID # BOPOMOFO LETTER E +311D;ID # BOPOMOFO LETTER EH +311E;ID # BOPOMOFO LETTER AI +311F;ID # BOPOMOFO LETTER EI +3120;ID # BOPOMOFO LETTER AU +3121;ID # BOPOMOFO LETTER OU +3122;ID # BOPOMOFO LETTER AN +3123;ID # BOPOMOFO LETTER EN +3124;ID # BOPOMOFO LETTER ANG +3125;ID # BOPOMOFO LETTER ENG +3126;ID # BOPOMOFO LETTER ER +3127;ID # BOPOMOFO LETTER I +3128;ID # BOPOMOFO LETTER U +3129;ID # BOPOMOFO LETTER IU +312A;ID # BOPOMOFO LETTER V +312B;ID # BOPOMOFO LETTER NG +312C;ID # BOPOMOFO LETTER GN +3131;ID # HANGUL LETTER KIYEOK +3132;ID # HANGUL LETTER SSANGKIYEOK +3133;ID # HANGUL LETTER KIYEOK-SIOS +3134;ID # HANGUL LETTER NIEUN +3135;ID # HANGUL LETTER NIEUN-CIEUC +3136;ID # HANGUL LETTER NIEUN-HIEUH +3137;ID # HANGUL LETTER TIKEUT +3138;ID # HANGUL LETTER SSANGTIKEUT +3139;ID # HANGUL LETTER RIEUL +313A;ID # HANGUL LETTER RIEUL-KIYEOK +313B;ID # HANGUL LETTER RIEUL-MIEUM +313C;ID # HANGUL LETTER RIEUL-PIEUP +313D;ID # HANGUL LETTER RIEUL-SIOS +313E;ID # HANGUL LETTER RIEUL-THIEUTH +313F;ID # HANGUL LETTER RIEUL-PHIEUPH +3140;ID # HANGUL LETTER RIEUL-HIEUH +3141;ID # HANGUL LETTER MIEUM +3142;ID # HANGUL LETTER PIEUP +3143;ID # HANGUL LETTER SSANGPIEUP +3144;ID # HANGUL LETTER PIEUP-SIOS +3145;ID # HANGUL LETTER SIOS +3146;ID # HANGUL LETTER SSANGSIOS +3147;ID # HANGUL LETTER IEUNG +3148;ID # HANGUL LETTER CIEUC +3149;ID # HANGUL LETTER SSANGCIEUC +314A;ID # HANGUL LETTER CHIEUCH +314B;ID # HANGUL LETTER KHIEUKH +314C;ID # HANGUL LETTER THIEUTH +314D;ID # HANGUL LETTER PHIEUPH +314E;ID # HANGUL LETTER HIEUH +314F;ID # HANGUL LETTER A +3150;ID # HANGUL LETTER AE +3151;ID # HANGUL LETTER YA +3152;ID # HANGUL LETTER YAE +3153;ID # HANGUL LETTER EO +3154;ID # HANGUL LETTER E +3155;ID # HANGUL LETTER YEO +3156;ID # HANGUL LETTER YE +3157;ID # HANGUL LETTER O +3158;ID # HANGUL LETTER WA +3159;ID # HANGUL LETTER WAE +315A;ID # HANGUL LETTER OE +315B;ID # HANGUL LETTER YO +315C;ID # HANGUL LETTER U +315D;ID # HANGUL LETTER WEO +315E;ID # HANGUL LETTER WE +315F;ID # HANGUL LETTER WI +3160;ID # HANGUL LETTER YU +3161;ID # HANGUL LETTER EU +3162;ID # HANGUL LETTER YI +3163;ID # HANGUL LETTER I +3164;ID # HANGUL FILLER +3165;ID # HANGUL LETTER SSANGNIEUN +3166;ID # HANGUL LETTER NIEUN-TIKEUT +3167;ID # HANGUL LETTER NIEUN-SIOS +3168;ID # HANGUL LETTER NIEUN-PANSIOS +3169;ID # HANGUL LETTER RIEUL-KIYEOK-SIOS +316A;ID # HANGUL LETTER RIEUL-TIKEUT +316B;ID # HANGUL LETTER RIEUL-PIEUP-SIOS +316C;ID # HANGUL LETTER RIEUL-PANSIOS +316D;ID # HANGUL LETTER RIEUL-YEORINHIEUH +316E;ID # HANGUL LETTER MIEUM-PIEUP +316F;ID # HANGUL LETTER MIEUM-SIOS +3170;ID # HANGUL LETTER MIEUM-PANSIOS +3171;ID # HANGUL LETTER KAPYEOUNMIEUM +3172;ID # HANGUL LETTER PIEUP-KIYEOK +3173;ID # HANGUL LETTER PIEUP-TIKEUT +3174;ID # HANGUL LETTER PIEUP-SIOS-KIYEOK +3175;ID # HANGUL LETTER PIEUP-SIOS-TIKEUT +3176;ID # HANGUL LETTER PIEUP-CIEUC +3177;ID # HANGUL LETTER PIEUP-THIEUTH +3178;ID # HANGUL LETTER KAPYEOUNPIEUP +3179;ID # HANGUL LETTER KAPYEOUNSSANGPIEUP +317A;ID # HANGUL LETTER SIOS-KIYEOK +317B;ID # HANGUL LETTER SIOS-NIEUN +317C;ID # HANGUL LETTER SIOS-TIKEUT +317D;ID # HANGUL LETTER SIOS-PIEUP +317E;ID # HANGUL LETTER SIOS-CIEUC +317F;ID # HANGUL LETTER PANSIOS +3180;ID # HANGUL LETTER SSANGIEUNG +3181;ID # HANGUL LETTER YESIEUNG +3182;ID # HANGUL LETTER YESIEUNG-SIOS +3183;ID # HANGUL LETTER YESIEUNG-PANSIOS +3184;ID # HANGUL LETTER KAPYEOUNPHIEUPH +3185;ID # HANGUL LETTER SSANGHIEUH +3186;ID # HANGUL LETTER YEORINHIEUH +3187;ID # HANGUL LETTER YO-YA +3188;ID # HANGUL LETTER YO-YAE +3189;ID # HANGUL LETTER YO-I +318A;ID # HANGUL LETTER YU-YEO +318B;ID # HANGUL LETTER YU-YE +318C;ID # HANGUL LETTER YU-I +318D;ID # HANGUL LETTER ARAEA +318E;ID # HANGUL LETTER ARAEAE +3190;ID # IDEOGRAPHIC ANNOTATION LINKING MARK +3191;ID # IDEOGRAPHIC ANNOTATION REVERSE MARK +3192;ID # IDEOGRAPHIC ANNOTATION ONE MARK +3193;ID # IDEOGRAPHIC ANNOTATION TWO MARK +3194;ID # IDEOGRAPHIC ANNOTATION THREE MARK +3195;ID # IDEOGRAPHIC ANNOTATION FOUR MARK +3196;ID # IDEOGRAPHIC ANNOTATION TOP MARK +3197;ID # IDEOGRAPHIC ANNOTATION MIDDLE MARK +3198;ID # IDEOGRAPHIC ANNOTATION BOTTOM MARK +3199;ID # IDEOGRAPHIC ANNOTATION FIRST MARK +319A;ID # IDEOGRAPHIC ANNOTATION SECOND MARK +319B;ID # IDEOGRAPHIC ANNOTATION THIRD MARK +319C;ID # IDEOGRAPHIC ANNOTATION FOURTH MARK +319D;ID # IDEOGRAPHIC ANNOTATION HEAVEN MARK +319E;ID # IDEOGRAPHIC ANNOTATION EARTH MARK +319F;ID # IDEOGRAPHIC ANNOTATION MAN MARK +31A0;ID # BOPOMOFO LETTER BU +31A1;ID # BOPOMOFO LETTER ZI +31A2;ID # BOPOMOFO LETTER JI +31A3;ID # BOPOMOFO LETTER GU +31A4;ID # BOPOMOFO LETTER EE +31A5;ID # BOPOMOFO LETTER ENN +31A6;ID # BOPOMOFO LETTER OO +31A7;ID # BOPOMOFO LETTER ONN +31A8;ID # BOPOMOFO LETTER IR +31A9;ID # BOPOMOFO LETTER ANN +31AA;ID # BOPOMOFO LETTER INN +31AB;ID # BOPOMOFO LETTER UNN +31AC;ID # BOPOMOFO LETTER IM +31AD;ID # BOPOMOFO LETTER NGG +31AE;ID # BOPOMOFO LETTER AINN +31AF;ID # BOPOMOFO LETTER AUNN +31B0;ID # BOPOMOFO LETTER AM +31B1;ID # BOPOMOFO LETTER OM +31B2;ID # BOPOMOFO LETTER ONG +31B3;ID # BOPOMOFO LETTER INNN +31B4;ID # BOPOMOFO FINAL LETTER P +31B5;ID # BOPOMOFO FINAL LETTER T +31B6;ID # BOPOMOFO FINAL LETTER K +31B7;ID # BOPOMOFO FINAL LETTER H +31F0;NS # KATAKANA LETTER SMALL KU +31F1;NS # KATAKANA LETTER SMALL SI +31F2;NS # KATAKANA LETTER SMALL SU +31F3;NS # KATAKANA LETTER SMALL TO +31F4;NS # KATAKANA LETTER SMALL NU +31F5;NS # KATAKANA LETTER SMALL HA +31F6;NS # KATAKANA LETTER SMALL HI +31F7;NS # KATAKANA LETTER SMALL HU +31F8;NS # KATAKANA LETTER SMALL HE +31F9;NS # KATAKANA LETTER SMALL HO +31FA;NS # KATAKANA LETTER SMALL MU +31FB;NS # KATAKANA LETTER SMALL RA +31FC;NS # KATAKANA LETTER SMALL RI +31FD;NS # KATAKANA LETTER SMALL RU +31FE;NS # KATAKANA LETTER SMALL RE +31FF;NS # KATAKANA LETTER SMALL RO +3200;ID # PARENTHESIZED HANGUL KIYEOK +3201;ID # PARENTHESIZED HANGUL NIEUN +3202;ID # PARENTHESIZED HANGUL TIKEUT +3203;ID # PARENTHESIZED HANGUL RIEUL +3204;ID # PARENTHESIZED HANGUL MIEUM +3205;ID # PARENTHESIZED HANGUL PIEUP +3206;ID # PARENTHESIZED HANGUL SIOS +3207;ID # PARENTHESIZED HANGUL IEUNG +3208;ID # PARENTHESIZED HANGUL CIEUC +3209;ID # PARENTHESIZED HANGUL CHIEUCH +320A;ID # PARENTHESIZED HANGUL KHIEUKH +320B;ID # PARENTHESIZED HANGUL THIEUTH +320C;ID # PARENTHESIZED HANGUL PHIEUPH +320D;ID # PARENTHESIZED HANGUL HIEUH +320E;ID # PARENTHESIZED HANGUL KIYEOK A +320F;ID # PARENTHESIZED HANGUL NIEUN A +3210;ID # PARENTHESIZED HANGUL TIKEUT A +3211;ID # PARENTHESIZED HANGUL RIEUL A +3212;ID # PARENTHESIZED HANGUL MIEUM A +3213;ID # PARENTHESIZED HANGUL PIEUP A +3214;ID # PARENTHESIZED HANGUL SIOS A +3215;ID # PARENTHESIZED HANGUL IEUNG A +3216;ID # PARENTHESIZED HANGUL CIEUC A +3217;ID # PARENTHESIZED HANGUL CHIEUCH A +3218;ID # PARENTHESIZED HANGUL KHIEUKH A +3219;ID # PARENTHESIZED HANGUL THIEUTH A +321A;ID # PARENTHESIZED HANGUL PHIEUPH A +321B;ID # PARENTHESIZED HANGUL HIEUH A +321C;ID # PARENTHESIZED HANGUL CIEUC U +3220;ID # PARENTHESIZED IDEOGRAPH ONE +3221;ID # PARENTHESIZED IDEOGRAPH TWO +3222;ID # PARENTHESIZED IDEOGRAPH THREE +3223;ID # PARENTHESIZED IDEOGRAPH FOUR +3224;ID # PARENTHESIZED IDEOGRAPH FIVE +3225;ID # PARENTHESIZED IDEOGRAPH SIX +3226;ID # PARENTHESIZED IDEOGRAPH SEVEN +3227;ID # PARENTHESIZED IDEOGRAPH EIGHT +3228;ID # PARENTHESIZED IDEOGRAPH NINE +3229;ID # PARENTHESIZED IDEOGRAPH TEN +322A;ID # PARENTHESIZED IDEOGRAPH MOON +322B;ID # PARENTHESIZED IDEOGRAPH FIRE +322C;ID # PARENTHESIZED IDEOGRAPH WATER +322D;ID # PARENTHESIZED IDEOGRAPH WOOD +322E;ID # PARENTHESIZED IDEOGRAPH METAL +322F;ID # PARENTHESIZED IDEOGRAPH EARTH +3230;ID # PARENTHESIZED IDEOGRAPH SUN +3231;ID # PARENTHESIZED IDEOGRAPH STOCK +3232;ID # PARENTHESIZED IDEOGRAPH HAVE +3233;ID # PARENTHESIZED IDEOGRAPH SOCIETY +3234;ID # PARENTHESIZED IDEOGRAPH NAME +3235;ID # PARENTHESIZED IDEOGRAPH SPECIAL +3236;ID # PARENTHESIZED IDEOGRAPH FINANCIAL +3237;ID # PARENTHESIZED IDEOGRAPH CONGRATULATION +3238;ID # PARENTHESIZED IDEOGRAPH LABOR +3239;ID # PARENTHESIZED IDEOGRAPH REPRESENT +323A;ID # PARENTHESIZED IDEOGRAPH CALL +323B;ID # PARENTHESIZED IDEOGRAPH STUDY +323C;ID # PARENTHESIZED IDEOGRAPH SUPERVISE +323D;ID # PARENTHESIZED IDEOGRAPH ENTERPRISE +323E;ID # PARENTHESIZED IDEOGRAPH RESOURCE +323F;ID # PARENTHESIZED IDEOGRAPH ALLIANCE +3240;ID # PARENTHESIZED IDEOGRAPH FESTIVAL +3241;ID # PARENTHESIZED IDEOGRAPH REST +3242;ID # PARENTHESIZED IDEOGRAPH SELF +3243;ID # PARENTHESIZED IDEOGRAPH REACH +3251;ID # CIRCLED NUMBER TWENTY ONE +3252;ID # CIRCLED NUMBER TWENTY TWO +3253;ID # CIRCLED NUMBER TWENTY THREE +3254;ID # CIRCLED NUMBER TWENTY FOUR +3255;ID # CIRCLED NUMBER TWENTY FIVE +3256;ID # CIRCLED NUMBER TWENTY SIX +3257;ID # CIRCLED NUMBER TWENTY SEVEN +3258;ID # CIRCLED NUMBER TWENTY EIGHT +3259;ID # CIRCLED NUMBER TWENTY NINE +325A;ID # CIRCLED NUMBER THIRTY +325B;ID # CIRCLED NUMBER THIRTY ONE +325C;ID # CIRCLED NUMBER THIRTY TWO +325D;ID # CIRCLED NUMBER THIRTY THREE +325E;ID # CIRCLED NUMBER THIRTY FOUR +325F;ID # CIRCLED NUMBER THIRTY FIVE +3260;ID # CIRCLED HANGUL KIYEOK +3261;ID # CIRCLED HANGUL NIEUN +3262;ID # CIRCLED HANGUL TIKEUT +3263;ID # CIRCLED HANGUL RIEUL +3264;ID # CIRCLED HANGUL MIEUM +3265;ID # CIRCLED HANGUL PIEUP +3266;ID # CIRCLED HANGUL SIOS +3267;ID # CIRCLED HANGUL IEUNG +3268;ID # CIRCLED HANGUL CIEUC +3269;ID # CIRCLED HANGUL CHIEUCH +326A;ID # CIRCLED HANGUL KHIEUKH +326B;ID # CIRCLED HANGUL THIEUTH +326C;ID # CIRCLED HANGUL PHIEUPH +326D;ID # CIRCLED HANGUL HIEUH +326E;ID # CIRCLED HANGUL KIYEOK A +326F;ID # CIRCLED HANGUL NIEUN A +3270;ID # CIRCLED HANGUL TIKEUT A +3271;ID # CIRCLED HANGUL RIEUL A +3272;ID # CIRCLED HANGUL MIEUM A +3273;ID # CIRCLED HANGUL PIEUP A +3274;ID # CIRCLED HANGUL SIOS A +3275;ID # CIRCLED HANGUL IEUNG A +3276;ID # CIRCLED HANGUL CIEUC A +3277;ID # CIRCLED HANGUL CHIEUCH A +3278;ID # CIRCLED HANGUL KHIEUKH A +3279;ID # CIRCLED HANGUL THIEUTH A +327A;ID # CIRCLED HANGUL PHIEUPH A +327B;ID # CIRCLED HANGUL HIEUH A +327F;ID # KOREAN STANDARD SYMBOL +3280;ID # CIRCLED IDEOGRAPH ONE +3281;ID # CIRCLED IDEOGRAPH TWO +3282;ID # CIRCLED IDEOGRAPH THREE +3283;ID # CIRCLED IDEOGRAPH FOUR +3284;ID # CIRCLED IDEOGRAPH FIVE +3285;ID # CIRCLED IDEOGRAPH SIX +3286;ID # CIRCLED IDEOGRAPH SEVEN +3287;ID # CIRCLED IDEOGRAPH EIGHT +3288;ID # CIRCLED IDEOGRAPH NINE +3289;ID # CIRCLED IDEOGRAPH TEN +328A;ID # CIRCLED IDEOGRAPH MOON +328B;ID # CIRCLED IDEOGRAPH FIRE +328C;ID # CIRCLED IDEOGRAPH WATER +328D;ID # CIRCLED IDEOGRAPH WOOD +328E;ID # CIRCLED IDEOGRAPH METAL +328F;ID # CIRCLED IDEOGRAPH EARTH +3290;ID # CIRCLED IDEOGRAPH SUN +3291;ID # CIRCLED IDEOGRAPH STOCK +3292;ID # CIRCLED IDEOGRAPH HAVE +3293;ID # CIRCLED IDEOGRAPH SOCIETY +3294;ID # CIRCLED IDEOGRAPH NAME +3295;ID # CIRCLED IDEOGRAPH SPECIAL +3296;ID # CIRCLED IDEOGRAPH FINANCIAL +3297;ID # CIRCLED IDEOGRAPH CONGRATULATION +3298;ID # CIRCLED IDEOGRAPH LABOR +3299;ID # CIRCLED IDEOGRAPH SECRET +329A;ID # CIRCLED IDEOGRAPH MALE +329B;ID # CIRCLED IDEOGRAPH FEMALE +329C;ID # CIRCLED IDEOGRAPH SUITABLE +329D;ID # CIRCLED IDEOGRAPH EXCELLENT +329E;ID # CIRCLED IDEOGRAPH PRINT +329F;ID # CIRCLED IDEOGRAPH ATTENTION +32A0;ID # CIRCLED IDEOGRAPH ITEM +32A1;ID # CIRCLED IDEOGRAPH REST +32A2;ID # CIRCLED IDEOGRAPH COPY +32A3;ID # CIRCLED IDEOGRAPH CORRECT +32A4;ID # CIRCLED IDEOGRAPH HIGH +32A5;ID # CIRCLED IDEOGRAPH CENTRE +32A6;ID # CIRCLED IDEOGRAPH LOW +32A7;ID # CIRCLED IDEOGRAPH LEFT +32A8;ID # CIRCLED IDEOGRAPH RIGHT +32A9;ID # CIRCLED IDEOGRAPH MEDICINE +32AA;ID # CIRCLED IDEOGRAPH RELIGION +32AB;ID # CIRCLED IDEOGRAPH STUDY +32AC;ID # CIRCLED IDEOGRAPH SUPERVISE +32AD;ID # CIRCLED IDEOGRAPH ENTERPRISE +32AE;ID # CIRCLED IDEOGRAPH RESOURCE +32AF;ID # CIRCLED IDEOGRAPH ALLIANCE +32B0;ID # CIRCLED IDEOGRAPH NIGHT +32B1;ID # CIRCLED NUMBER THIRTY SIX +32B2;ID # CIRCLED NUMBER THIRTY SEVEN +32B3;ID # CIRCLED NUMBER THIRTY EIGHT +32B4;ID # CIRCLED NUMBER THIRTY NINE +32B5;ID # CIRCLED NUMBER FORTY +32B6;ID # CIRCLED NUMBER FORTY ONE +32B7;ID # CIRCLED NUMBER FORTY TWO +32B8;ID # CIRCLED NUMBER FORTY THREE +32B9;ID # CIRCLED NUMBER FORTY FOUR +32BA;ID # CIRCLED NUMBER FORTY FIVE +32BB;ID # CIRCLED NUMBER FORTY SIX +32BC;ID # CIRCLED NUMBER FORTY SEVEN +32BD;ID # CIRCLED NUMBER FORTY EIGHT +32BE;ID # CIRCLED NUMBER FORTY NINE +32BF;ID # CIRCLED NUMBER FIFTY +32C0;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY +32C1;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY +32C2;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH +32C3;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL +32C4;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY +32C5;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE +32C6;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY +32C7;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST +32C8;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER +32C9;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER +32CA;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER +32CB;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER +32D0;ID # CIRCLED KATAKANA A +32D1;ID # CIRCLED KATAKANA I +32D2;ID # CIRCLED KATAKANA U +32D3;ID # CIRCLED KATAKANA E +32D4;ID # CIRCLED KATAKANA O +32D5;ID # CIRCLED KATAKANA KA +32D6;ID # CIRCLED KATAKANA KI +32D7;ID # CIRCLED KATAKANA KU +32D8;ID # CIRCLED KATAKANA KE +32D9;ID # CIRCLED KATAKANA KO +32DA;ID # CIRCLED KATAKANA SA +32DB;ID # CIRCLED KATAKANA SI +32DC;ID # CIRCLED KATAKANA SU +32DD;ID # CIRCLED KATAKANA SE +32DE;ID # CIRCLED KATAKANA SO +32DF;ID # CIRCLED KATAKANA TA +32E0;ID # CIRCLED KATAKANA TI +32E1;ID # CIRCLED KATAKANA TU +32E2;ID # CIRCLED KATAKANA TE +32E3;ID # CIRCLED KATAKANA TO +32E4;ID # CIRCLED KATAKANA NA +32E5;ID # CIRCLED KATAKANA NI +32E6;ID # CIRCLED KATAKANA NU +32E7;ID # CIRCLED KATAKANA NE +32E8;ID # CIRCLED KATAKANA NO +32E9;ID # CIRCLED KATAKANA HA +32EA;ID # CIRCLED KATAKANA HI +32EB;ID # CIRCLED KATAKANA HU +32EC;ID # CIRCLED KATAKANA HE +32ED;ID # CIRCLED KATAKANA HO +32EE;ID # CIRCLED KATAKANA MA +32EF;ID # CIRCLED KATAKANA MI +32F0;ID # CIRCLED KATAKANA MU +32F1;ID # CIRCLED KATAKANA ME +32F2;ID # CIRCLED KATAKANA MO +32F3;ID # CIRCLED KATAKANA YA +32F4;ID # CIRCLED KATAKANA YU +32F5;ID # CIRCLED KATAKANA YO +32F6;ID # CIRCLED KATAKANA RA +32F7;ID # CIRCLED KATAKANA RI +32F8;ID # CIRCLED KATAKANA RU +32F9;ID # CIRCLED KATAKANA RE +32FA;ID # CIRCLED KATAKANA RO +32FB;ID # CIRCLED KATAKANA WA +32FC;ID # CIRCLED KATAKANA WI +32FD;ID # CIRCLED KATAKANA WE +32FE;ID # CIRCLED KATAKANA WO +3300;ID # SQUARE APAATO +3301;ID # SQUARE ARUHUA +3302;ID # SQUARE ANPEA +3303;ID # SQUARE AARU +3304;ID # SQUARE ININGU +3305;ID # SQUARE INTI +3306;ID # SQUARE UON +3307;ID # SQUARE ESUKUUDO +3308;ID # SQUARE EEKAA +3309;ID # SQUARE ONSU +330A;ID # SQUARE OOMU +330B;ID # SQUARE KAIRI +330C;ID # SQUARE KARATTO +330D;ID # SQUARE KARORII +330E;ID # SQUARE GARON +330F;ID # SQUARE GANMA +3310;ID # SQUARE GIGA +3311;ID # SQUARE GINII +3312;ID # SQUARE KYURII +3313;ID # SQUARE GIRUDAA +3314;ID # SQUARE KIRO +3315;ID # SQUARE KIROGURAMU +3316;ID # SQUARE KIROMEETORU +3317;ID # SQUARE KIROWATTO +3318;ID # SQUARE GURAMU +3319;ID # SQUARE GURAMUTON +331A;ID # SQUARE KURUZEIRO +331B;ID # SQUARE KUROONE +331C;ID # SQUARE KEESU +331D;ID # SQUARE KORUNA +331E;ID # SQUARE KOOPO +331F;ID # SQUARE SAIKURU +3320;ID # SQUARE SANTIIMU +3321;ID # SQUARE SIRINGU +3322;ID # SQUARE SENTI +3323;ID # SQUARE SENTO +3324;ID # SQUARE DAASU +3325;ID # SQUARE DESI +3326;ID # SQUARE DORU +3327;ID # SQUARE TON +3328;ID # SQUARE NANO +3329;ID # SQUARE NOTTO +332A;ID # SQUARE HAITU +332B;ID # SQUARE PAASENTO +332C;ID # SQUARE PAATU +332D;ID # SQUARE BAARERU +332E;ID # SQUARE PIASUTORU +332F;ID # SQUARE PIKURU +3330;ID # SQUARE PIKO +3331;ID # SQUARE BIRU +3332;ID # SQUARE HUARADDO +3333;ID # SQUARE HUIITO +3334;ID # SQUARE BUSSYERU +3335;ID # SQUARE HURAN +3336;ID # SQUARE HEKUTAARU +3337;ID # SQUARE PESO +3338;ID # SQUARE PENIHI +3339;ID # SQUARE HERUTU +333A;ID # SQUARE PENSU +333B;ID # SQUARE PEEZI +333C;ID # SQUARE BEETA +333D;ID # SQUARE POINTO +333E;ID # SQUARE BORUTO +333F;ID # SQUARE HON +3340;ID # SQUARE PONDO +3341;ID # SQUARE HOORU +3342;ID # SQUARE HOON +3343;ID # SQUARE MAIKURO +3344;ID # SQUARE MAIRU +3345;ID # SQUARE MAHHA +3346;ID # SQUARE MARUKU +3347;ID # SQUARE MANSYON +3348;ID # SQUARE MIKURON +3349;ID # SQUARE MIRI +334A;ID # SQUARE MIRIBAARU +334B;ID # SQUARE MEGA +334C;ID # SQUARE MEGATON +334D;ID # SQUARE MEETORU +334E;ID # SQUARE YAADO +334F;ID # SQUARE YAARU +3350;ID # SQUARE YUAN +3351;ID # SQUARE RITTORU +3352;ID # SQUARE RIRA +3353;ID # SQUARE RUPII +3354;ID # SQUARE RUUBURU +3355;ID # SQUARE REMU +3356;ID # SQUARE RENTOGEN +3357;ID # SQUARE WATTO +3358;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO +3359;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE +335A;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO +335B;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE +335C;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR +335D;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE +335E;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX +335F;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN +3360;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT +3361;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE +3362;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN +3363;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN +3364;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE +3365;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN +3366;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN +3367;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN +3368;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN +3369;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN +336A;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN +336B;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN +336C;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY +336D;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE +336E;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO +336F;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE +3370;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR +3371;ID # SQUARE HPA +3372;ID # SQUARE DA +3373;ID # SQUARE AU +3374;ID # SQUARE BAR +3375;ID # SQUARE OV +3376;ID # SQUARE PC +337B;ID # SQUARE ERA NAME HEISEI +337C;ID # SQUARE ERA NAME SYOUWA +337D;ID # SQUARE ERA NAME TAISYOU +337E;ID # SQUARE ERA NAME MEIZI +337F;ID # SQUARE CORPORATION +3380;ID # SQUARE PA AMPS +3381;ID # SQUARE NA +3382;ID # SQUARE MU A +3383;ID # SQUARE MA +3384;ID # SQUARE KA +3385;ID # SQUARE KB +3386;ID # SQUARE MB +3387;ID # SQUARE GB +3388;ID # SQUARE CAL +3389;ID # SQUARE KCAL +338A;ID # SQUARE PF +338B;ID # SQUARE NF +338C;ID # SQUARE MU F +338D;ID # SQUARE MU G +338E;ID # SQUARE MG +338F;ID # SQUARE KG +3390;ID # SQUARE HZ +3391;ID # SQUARE KHZ +3392;ID # SQUARE MHZ +3393;ID # SQUARE GHZ +3394;ID # SQUARE THZ +3395;ID # SQUARE MU L +3396;ID # SQUARE ML +3397;ID # SQUARE DL +3398;ID # SQUARE KL +3399;ID # SQUARE FM +339A;ID # SQUARE NM +339B;ID # SQUARE MU M +339C;ID # SQUARE MM +339D;ID # SQUARE CM +339E;ID # SQUARE KM +339F;ID # SQUARE MM SQUARED +33A0;ID # SQUARE CM SQUARED +33A1;ID # SQUARE M SQUARED +33A2;ID # SQUARE KM SQUARED +33A3;ID # SQUARE MM CUBED +33A4;ID # SQUARE CM CUBED +33A5;ID # SQUARE M CUBED +33A6;ID # SQUARE KM CUBED +33A7;ID # SQUARE M OVER S +33A8;ID # SQUARE M OVER S SQUARED +33A9;ID # SQUARE PA +33AA;ID # SQUARE KPA +33AB;ID # SQUARE MPA +33AC;ID # SQUARE GPA +33AD;ID # SQUARE RAD +33AE;ID # SQUARE RAD OVER S +33AF;ID # SQUARE RAD OVER S SQUARED +33B0;ID # SQUARE PS +33B1;ID # SQUARE NS +33B2;ID # SQUARE MU S +33B3;ID # SQUARE MS +33B4;ID # SQUARE PV +33B5;ID # SQUARE NV +33B6;ID # SQUARE MU V +33B7;ID # SQUARE MV +33B8;ID # SQUARE KV +33B9;ID # SQUARE MV MEGA +33BA;ID # SQUARE PW +33BB;ID # SQUARE NW +33BC;ID # SQUARE MU W +33BD;ID # SQUARE MW +33BE;ID # SQUARE KW +33BF;ID # SQUARE MW MEGA +33C0;ID # SQUARE K OHM +33C1;ID # SQUARE M OHM +33C2;ID # SQUARE AM +33C3;ID # SQUARE BQ +33C4;ID # SQUARE CC +33C5;ID # SQUARE CD +33C6;ID # SQUARE C OVER KG +33C7;ID # SQUARE CO +33C8;ID # SQUARE DB +33C9;ID # SQUARE GY +33CA;ID # SQUARE HA +33CB;ID # SQUARE HP +33CC;ID # SQUARE IN +33CD;ID # SQUARE KK +33CE;ID # SQUARE KM CAPITAL +33CF;ID # SQUARE KT +33D0;ID # SQUARE LM +33D1;ID # SQUARE LN +33D2;ID # SQUARE LOG +33D3;ID # SQUARE LX +33D4;ID # SQUARE MB SMALL +33D5;ID # SQUARE MIL +33D6;ID # SQUARE MOL +33D7;ID # SQUARE PH +33D8;ID # SQUARE PM +33D9;ID # SQUARE PPM +33DA;ID # SQUARE PR +33DB;ID # SQUARE SR +33DC;ID # SQUARE SV +33DD;ID # SQUARE WB +33E0;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE +33E1;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO +33E2;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE +33E3;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR +33E4;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE +33E5;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX +33E6;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN +33E7;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT +33E8;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE +33E9;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN +33EA;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN +33EB;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE +33EC;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN +33ED;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN +33EE;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN +33EF;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN +33F0;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN +33F1;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN +33F2;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN +33F3;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY +33F4;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE +33F5;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO +33F6;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE +33F7;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR +33F8;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE +33F9;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX +33FA;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN +33FB;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT +33FC;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE +33FD;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY +33FE;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE +3400..4DB5;ID # .. +4E00..9FA5;ID # .. +A000;ID # YI SYLLABLE IT +A001;ID # YI SYLLABLE IX +A002;ID # YI SYLLABLE I +A003;ID # YI SYLLABLE IP +A004;ID # YI SYLLABLE IET +A005;ID # YI SYLLABLE IEX +A006;ID # YI SYLLABLE IE +A007;ID # YI SYLLABLE IEP +A008;ID # YI SYLLABLE AT +A009;ID # YI SYLLABLE AX +A00A;ID # YI SYLLABLE A +A00B;ID # YI SYLLABLE AP +A00C;ID # YI SYLLABLE UOX +A00D;ID # YI SYLLABLE UO +A00E;ID # YI SYLLABLE UOP +A00F;ID # YI SYLLABLE OT +A010;ID # YI SYLLABLE OX +A011;ID # YI SYLLABLE O +A012;ID # YI SYLLABLE OP +A013;ID # YI SYLLABLE EX +A014;ID # YI SYLLABLE E +A015;ID # YI SYLLABLE WU +A016;ID # YI SYLLABLE BIT +A017;ID # YI SYLLABLE BIX +A018;ID # YI SYLLABLE BI +A019;ID # YI SYLLABLE BIP +A01A;ID # YI SYLLABLE BIET +A01B;ID # YI SYLLABLE BIEX +A01C;ID # YI SYLLABLE BIE +A01D;ID # YI SYLLABLE BIEP +A01E;ID # YI SYLLABLE BAT +A01F;ID # YI SYLLABLE BAX +A020;ID # YI SYLLABLE BA +A021;ID # YI SYLLABLE BAP +A022;ID # YI SYLLABLE BUOX +A023;ID # YI SYLLABLE BUO +A024;ID # YI SYLLABLE BUOP +A025;ID # YI SYLLABLE BOT +A026;ID # YI SYLLABLE BOX +A027;ID # YI SYLLABLE BO +A028;ID # YI SYLLABLE BOP +A029;ID # YI SYLLABLE BEX +A02A;ID # YI SYLLABLE BE +A02B;ID # YI SYLLABLE BEP +A02C;ID # YI SYLLABLE BUT +A02D;ID # YI SYLLABLE BUX +A02E;ID # YI SYLLABLE BU +A02F;ID # YI SYLLABLE BUP +A030;ID # YI SYLLABLE BURX +A031;ID # YI SYLLABLE BUR +A032;ID # YI SYLLABLE BYT +A033;ID # YI SYLLABLE BYX +A034;ID # YI SYLLABLE BY +A035;ID # YI SYLLABLE BYP +A036;ID # YI SYLLABLE BYRX +A037;ID # YI SYLLABLE BYR +A038;ID # YI SYLLABLE PIT +A039;ID # YI SYLLABLE PIX +A03A;ID # YI SYLLABLE PI +A03B;ID # YI SYLLABLE PIP +A03C;ID # YI SYLLABLE PIEX +A03D;ID # YI SYLLABLE PIE +A03E;ID # YI SYLLABLE PIEP +A03F;ID # YI SYLLABLE PAT +A040;ID # YI SYLLABLE PAX +A041;ID # YI SYLLABLE PA +A042;ID # YI SYLLABLE PAP +A043;ID # YI SYLLABLE PUOX +A044;ID # YI SYLLABLE PUO +A045;ID # YI SYLLABLE PUOP +A046;ID # YI SYLLABLE POT +A047;ID # YI SYLLABLE POX +A048;ID # YI SYLLABLE PO +A049;ID # YI SYLLABLE POP +A04A;ID # YI SYLLABLE PUT +A04B;ID # YI SYLLABLE PUX +A04C;ID # YI SYLLABLE PU +A04D;ID # YI SYLLABLE PUP +A04E;ID # YI SYLLABLE PURX +A04F;ID # YI SYLLABLE PUR +A050;ID # YI SYLLABLE PYT +A051;ID # YI SYLLABLE PYX +A052;ID # YI SYLLABLE PY +A053;ID # YI SYLLABLE PYP +A054;ID # YI SYLLABLE PYRX +A055;ID # YI SYLLABLE PYR +A056;ID # YI SYLLABLE BBIT +A057;ID # YI SYLLABLE BBIX +A058;ID # YI SYLLABLE BBI +A059;ID # YI SYLLABLE BBIP +A05A;ID # YI SYLLABLE BBIET +A05B;ID # YI SYLLABLE BBIEX +A05C;ID # YI SYLLABLE BBIE +A05D;ID # YI SYLLABLE BBIEP +A05E;ID # YI SYLLABLE BBAT +A05F;ID # YI SYLLABLE BBAX +A060;ID # YI SYLLABLE BBA +A061;ID # YI SYLLABLE BBAP +A062;ID # YI SYLLABLE BBUOX +A063;ID # YI SYLLABLE BBUO +A064;ID # YI SYLLABLE BBUOP +A065;ID # YI SYLLABLE BBOT +A066;ID # YI SYLLABLE BBOX +A067;ID # YI SYLLABLE BBO +A068;ID # YI SYLLABLE BBOP +A069;ID # YI SYLLABLE BBEX +A06A;ID # YI SYLLABLE BBE +A06B;ID # YI SYLLABLE BBEP +A06C;ID # YI SYLLABLE BBUT +A06D;ID # YI SYLLABLE BBUX +A06E;ID # YI SYLLABLE BBU +A06F;ID # YI SYLLABLE BBUP +A070;ID # YI SYLLABLE BBURX +A071;ID # YI SYLLABLE BBUR +A072;ID # YI SYLLABLE BBYT +A073;ID # YI SYLLABLE BBYX +A074;ID # YI SYLLABLE BBY +A075;ID # YI SYLLABLE BBYP +A076;ID # YI SYLLABLE NBIT +A077;ID # YI SYLLABLE NBIX +A078;ID # YI SYLLABLE NBI +A079;ID # YI SYLLABLE NBIP +A07A;ID # YI SYLLABLE NBIEX +A07B;ID # YI SYLLABLE NBIE +A07C;ID # YI SYLLABLE NBIEP +A07D;ID # YI SYLLABLE NBAT +A07E;ID # YI SYLLABLE NBAX +A07F;ID # YI SYLLABLE NBA +A080;ID # YI SYLLABLE NBAP +A081;ID # YI SYLLABLE NBOT +A082;ID # YI SYLLABLE NBOX +A083;ID # YI SYLLABLE NBO +A084;ID # YI SYLLABLE NBOP +A085;ID # YI SYLLABLE NBUT +A086;ID # YI SYLLABLE NBUX +A087;ID # YI SYLLABLE NBU +A088;ID # YI SYLLABLE NBUP +A089;ID # YI SYLLABLE NBURX +A08A;ID # YI SYLLABLE NBUR +A08B;ID # YI SYLLABLE NBYT +A08C;ID # YI SYLLABLE NBYX +A08D;ID # YI SYLLABLE NBY +A08E;ID # YI SYLLABLE NBYP +A08F;ID # YI SYLLABLE NBYRX +A090;ID # YI SYLLABLE NBYR +A091;ID # YI SYLLABLE HMIT +A092;ID # YI SYLLABLE HMIX +A093;ID # YI SYLLABLE HMI +A094;ID # YI SYLLABLE HMIP +A095;ID # YI SYLLABLE HMIEX +A096;ID # YI SYLLABLE HMIE +A097;ID # YI SYLLABLE HMIEP +A098;ID # YI SYLLABLE HMAT +A099;ID # YI SYLLABLE HMAX +A09A;ID # YI SYLLABLE HMA +A09B;ID # YI SYLLABLE HMAP +A09C;ID # YI SYLLABLE HMUOX +A09D;ID # YI SYLLABLE HMUO +A09E;ID # YI SYLLABLE HMUOP +A09F;ID # YI SYLLABLE HMOT +A0A0;ID # YI SYLLABLE HMOX +A0A1;ID # YI SYLLABLE HMO +A0A2;ID # YI SYLLABLE HMOP +A0A3;ID # YI SYLLABLE HMUT +A0A4;ID # YI SYLLABLE HMUX +A0A5;ID # YI SYLLABLE HMU +A0A6;ID # YI SYLLABLE HMUP +A0A7;ID # YI SYLLABLE HMURX +A0A8;ID # YI SYLLABLE HMUR +A0A9;ID # YI SYLLABLE HMYX +A0AA;ID # YI SYLLABLE HMY +A0AB;ID # YI SYLLABLE HMYP +A0AC;ID # YI SYLLABLE HMYRX +A0AD;ID # YI SYLLABLE HMYR +A0AE;ID # YI SYLLABLE MIT +A0AF;ID # YI SYLLABLE MIX +A0B0;ID # YI SYLLABLE MI +A0B1;ID # YI SYLLABLE MIP +A0B2;ID # YI SYLLABLE MIEX +A0B3;ID # YI SYLLABLE MIE +A0B4;ID # YI SYLLABLE MIEP +A0B5;ID # YI SYLLABLE MAT +A0B6;ID # YI SYLLABLE MAX +A0B7;ID # YI SYLLABLE MA +A0B8;ID # YI SYLLABLE MAP +A0B9;ID # YI SYLLABLE MUOT +A0BA;ID # YI SYLLABLE MUOX +A0BB;ID # YI SYLLABLE MUO +A0BC;ID # YI SYLLABLE MUOP +A0BD;ID # YI SYLLABLE MOT +A0BE;ID # YI SYLLABLE MOX +A0BF;ID # YI SYLLABLE MO +A0C0;ID # YI SYLLABLE MOP +A0C1;ID # YI SYLLABLE MEX +A0C2;ID # YI SYLLABLE ME +A0C3;ID # YI SYLLABLE MUT +A0C4;ID # YI SYLLABLE MUX +A0C5;ID # YI SYLLABLE MU +A0C6;ID # YI SYLLABLE MUP +A0C7;ID # YI SYLLABLE MURX +A0C8;ID # YI SYLLABLE MUR +A0C9;ID # YI SYLLABLE MYT +A0CA;ID # YI SYLLABLE MYX +A0CB;ID # YI SYLLABLE MY +A0CC;ID # YI SYLLABLE MYP +A0CD;ID # YI SYLLABLE FIT +A0CE;ID # YI SYLLABLE FIX +A0CF;ID # YI SYLLABLE FI +A0D0;ID # YI SYLLABLE FIP +A0D1;ID # YI SYLLABLE FAT +A0D2;ID # YI SYLLABLE FAX +A0D3;ID # YI SYLLABLE FA +A0D4;ID # YI SYLLABLE FAP +A0D5;ID # YI SYLLABLE FOX +A0D6;ID # YI SYLLABLE FO +A0D7;ID # YI SYLLABLE FOP +A0D8;ID # YI SYLLABLE FUT +A0D9;ID # YI SYLLABLE FUX +A0DA;ID # YI SYLLABLE FU +A0DB;ID # YI SYLLABLE FUP +A0DC;ID # YI SYLLABLE FURX +A0DD;ID # YI SYLLABLE FUR +A0DE;ID # YI SYLLABLE FYT +A0DF;ID # YI SYLLABLE FYX +A0E0;ID # YI SYLLABLE FY +A0E1;ID # YI SYLLABLE FYP +A0E2;ID # YI SYLLABLE VIT +A0E3;ID # YI SYLLABLE VIX +A0E4;ID # YI SYLLABLE VI +A0E5;ID # YI SYLLABLE VIP +A0E6;ID # YI SYLLABLE VIET +A0E7;ID # YI SYLLABLE VIEX +A0E8;ID # YI SYLLABLE VIE +A0E9;ID # YI SYLLABLE VIEP +A0EA;ID # YI SYLLABLE VAT +A0EB;ID # YI SYLLABLE VAX +A0EC;ID # YI SYLLABLE VA +A0ED;ID # YI SYLLABLE VAP +A0EE;ID # YI SYLLABLE VOT +A0EF;ID # YI SYLLABLE VOX +A0F0;ID # YI SYLLABLE VO +A0F1;ID # YI SYLLABLE VOP +A0F2;ID # YI SYLLABLE VEX +A0F3;ID # YI SYLLABLE VEP +A0F4;ID # YI SYLLABLE VUT +A0F5;ID # YI SYLLABLE VUX +A0F6;ID # YI SYLLABLE VU +A0F7;ID # YI SYLLABLE VUP +A0F8;ID # YI SYLLABLE VURX +A0F9;ID # YI SYLLABLE VUR +A0FA;ID # YI SYLLABLE VYT +A0FB;ID # YI SYLLABLE VYX +A0FC;ID # YI SYLLABLE VY +A0FD;ID # YI SYLLABLE VYP +A0FE;ID # YI SYLLABLE VYRX +A0FF;ID # YI SYLLABLE VYR +A100;ID # YI SYLLABLE DIT +A101;ID # YI SYLLABLE DIX +A102;ID # YI SYLLABLE DI +A103;ID # YI SYLLABLE DIP +A104;ID # YI SYLLABLE DIEX +A105;ID # YI SYLLABLE DIE +A106;ID # YI SYLLABLE DIEP +A107;ID # YI SYLLABLE DAT +A108;ID # YI SYLLABLE DAX +A109;ID # YI SYLLABLE DA +A10A;ID # YI SYLLABLE DAP +A10B;ID # YI SYLLABLE DUOX +A10C;ID # YI SYLLABLE DUO +A10D;ID # YI SYLLABLE DOT +A10E;ID # YI SYLLABLE DOX +A10F;ID # YI SYLLABLE DO +A110;ID # YI SYLLABLE DOP +A111;ID # YI SYLLABLE DEX +A112;ID # YI SYLLABLE DE +A113;ID # YI SYLLABLE DEP +A114;ID # YI SYLLABLE DUT +A115;ID # YI SYLLABLE DUX +A116;ID # YI SYLLABLE DU +A117;ID # YI SYLLABLE DUP +A118;ID # YI SYLLABLE DURX +A119;ID # YI SYLLABLE DUR +A11A;ID # YI SYLLABLE TIT +A11B;ID # YI SYLLABLE TIX +A11C;ID # YI SYLLABLE TI +A11D;ID # YI SYLLABLE TIP +A11E;ID # YI SYLLABLE TIEX +A11F;ID # YI SYLLABLE TIE +A120;ID # YI SYLLABLE TIEP +A121;ID # YI SYLLABLE TAT +A122;ID # YI SYLLABLE TAX +A123;ID # YI SYLLABLE TA +A124;ID # YI SYLLABLE TAP +A125;ID # YI SYLLABLE TUOT +A126;ID # YI SYLLABLE TUOX +A127;ID # YI SYLLABLE TUO +A128;ID # YI SYLLABLE TUOP +A129;ID # YI SYLLABLE TOT +A12A;ID # YI SYLLABLE TOX +A12B;ID # YI SYLLABLE TO +A12C;ID # YI SYLLABLE TOP +A12D;ID # YI SYLLABLE TEX +A12E;ID # YI SYLLABLE TE +A12F;ID # YI SYLLABLE TEP +A130;ID # YI SYLLABLE TUT +A131;ID # YI SYLLABLE TUX +A132;ID # YI SYLLABLE TU +A133;ID # YI SYLLABLE TUP +A134;ID # YI SYLLABLE TURX +A135;ID # YI SYLLABLE TUR +A136;ID # YI SYLLABLE DDIT +A137;ID # YI SYLLABLE DDIX +A138;ID # YI SYLLABLE DDI +A139;ID # YI SYLLABLE DDIP +A13A;ID # YI SYLLABLE DDIEX +A13B;ID # YI SYLLABLE DDIE +A13C;ID # YI SYLLABLE DDIEP +A13D;ID # YI SYLLABLE DDAT +A13E;ID # YI SYLLABLE DDAX +A13F;ID # YI SYLLABLE DDA +A140;ID # YI SYLLABLE DDAP +A141;ID # YI SYLLABLE DDUOX +A142;ID # YI SYLLABLE DDUO +A143;ID # YI SYLLABLE DDUOP +A144;ID # YI SYLLABLE DDOT +A145;ID # YI SYLLABLE DDOX +A146;ID # YI SYLLABLE DDO +A147;ID # YI SYLLABLE DDOP +A148;ID # YI SYLLABLE DDEX +A149;ID # YI SYLLABLE DDE +A14A;ID # YI SYLLABLE DDEP +A14B;ID # YI SYLLABLE DDUT +A14C;ID # YI SYLLABLE DDUX +A14D;ID # YI SYLLABLE DDU +A14E;ID # YI SYLLABLE DDUP +A14F;ID # YI SYLLABLE DDURX +A150;ID # YI SYLLABLE DDUR +A151;ID # YI SYLLABLE NDIT +A152;ID # YI SYLLABLE NDIX +A153;ID # YI SYLLABLE NDI +A154;ID # YI SYLLABLE NDIP +A155;ID # YI SYLLABLE NDIEX +A156;ID # YI SYLLABLE NDIE +A157;ID # YI SYLLABLE NDAT +A158;ID # YI SYLLABLE NDAX +A159;ID # YI SYLLABLE NDA +A15A;ID # YI SYLLABLE NDAP +A15B;ID # YI SYLLABLE NDOT +A15C;ID # YI SYLLABLE NDOX +A15D;ID # YI SYLLABLE NDO +A15E;ID # YI SYLLABLE NDOP +A15F;ID # YI SYLLABLE NDEX +A160;ID # YI SYLLABLE NDE +A161;ID # YI SYLLABLE NDEP +A162;ID # YI SYLLABLE NDUT +A163;ID # YI SYLLABLE NDUX +A164;ID # YI SYLLABLE NDU +A165;ID # YI SYLLABLE NDUP +A166;ID # YI SYLLABLE NDURX +A167;ID # YI SYLLABLE NDUR +A168;ID # YI SYLLABLE HNIT +A169;ID # YI SYLLABLE HNIX +A16A;ID # YI SYLLABLE HNI +A16B;ID # YI SYLLABLE HNIP +A16C;ID # YI SYLLABLE HNIET +A16D;ID # YI SYLLABLE HNIEX +A16E;ID # YI SYLLABLE HNIE +A16F;ID # YI SYLLABLE HNIEP +A170;ID # YI SYLLABLE HNAT +A171;ID # YI SYLLABLE HNAX +A172;ID # YI SYLLABLE HNA +A173;ID # YI SYLLABLE HNAP +A174;ID # YI SYLLABLE HNUOX +A175;ID # YI SYLLABLE HNUO +A176;ID # YI SYLLABLE HNOT +A177;ID # YI SYLLABLE HNOX +A178;ID # YI SYLLABLE HNOP +A179;ID # YI SYLLABLE HNEX +A17A;ID # YI SYLLABLE HNE +A17B;ID # YI SYLLABLE HNEP +A17C;ID # YI SYLLABLE HNUT +A17D;ID # YI SYLLABLE NIT +A17E;ID # YI SYLLABLE NIX +A17F;ID # YI SYLLABLE NI +A180;ID # YI SYLLABLE NIP +A181;ID # YI SYLLABLE NIEX +A182;ID # YI SYLLABLE NIE +A183;ID # YI SYLLABLE NIEP +A184;ID # YI SYLLABLE NAX +A185;ID # YI SYLLABLE NA +A186;ID # YI SYLLABLE NAP +A187;ID # YI SYLLABLE NUOX +A188;ID # YI SYLLABLE NUO +A189;ID # YI SYLLABLE NUOP +A18A;ID # YI SYLLABLE NOT +A18B;ID # YI SYLLABLE NOX +A18C;ID # YI SYLLABLE NO +A18D;ID # YI SYLLABLE NOP +A18E;ID # YI SYLLABLE NEX +A18F;ID # YI SYLLABLE NE +A190;ID # YI SYLLABLE NEP +A191;ID # YI SYLLABLE NUT +A192;ID # YI SYLLABLE NUX +A193;ID # YI SYLLABLE NU +A194;ID # YI SYLLABLE NUP +A195;ID # YI SYLLABLE NURX +A196;ID # YI SYLLABLE NUR +A197;ID # YI SYLLABLE HLIT +A198;ID # YI SYLLABLE HLIX +A199;ID # YI SYLLABLE HLI +A19A;ID # YI SYLLABLE HLIP +A19B;ID # YI SYLLABLE HLIEX +A19C;ID # YI SYLLABLE HLIE +A19D;ID # YI SYLLABLE HLIEP +A19E;ID # YI SYLLABLE HLAT +A19F;ID # YI SYLLABLE HLAX +A1A0;ID # YI SYLLABLE HLA +A1A1;ID # YI SYLLABLE HLAP +A1A2;ID # YI SYLLABLE HLUOX +A1A3;ID # YI SYLLABLE HLUO +A1A4;ID # YI SYLLABLE HLUOP +A1A5;ID # YI SYLLABLE HLOX +A1A6;ID # YI SYLLABLE HLO +A1A7;ID # YI SYLLABLE HLOP +A1A8;ID # YI SYLLABLE HLEX +A1A9;ID # YI SYLLABLE HLE +A1AA;ID # YI SYLLABLE HLEP +A1AB;ID # YI SYLLABLE HLUT +A1AC;ID # YI SYLLABLE HLUX +A1AD;ID # YI SYLLABLE HLU +A1AE;ID # YI SYLLABLE HLUP +A1AF;ID # YI SYLLABLE HLURX +A1B0;ID # YI SYLLABLE HLUR +A1B1;ID # YI SYLLABLE HLYT +A1B2;ID # YI SYLLABLE HLYX +A1B3;ID # YI SYLLABLE HLY +A1B4;ID # YI SYLLABLE HLYP +A1B5;ID # YI SYLLABLE HLYRX +A1B6;ID # YI SYLLABLE HLYR +A1B7;ID # YI SYLLABLE LIT +A1B8;ID # YI SYLLABLE LIX +A1B9;ID # YI SYLLABLE LI +A1BA;ID # YI SYLLABLE LIP +A1BB;ID # YI SYLLABLE LIET +A1BC;ID # YI SYLLABLE LIEX +A1BD;ID # YI SYLLABLE LIE +A1BE;ID # YI SYLLABLE LIEP +A1BF;ID # YI SYLLABLE LAT +A1C0;ID # YI SYLLABLE LAX +A1C1;ID # YI SYLLABLE LA +A1C2;ID # YI SYLLABLE LAP +A1C3;ID # YI SYLLABLE LUOT +A1C4;ID # YI SYLLABLE LUOX +A1C5;ID # YI SYLLABLE LUO +A1C6;ID # YI SYLLABLE LUOP +A1C7;ID # YI SYLLABLE LOT +A1C8;ID # YI SYLLABLE LOX +A1C9;ID # YI SYLLABLE LO +A1CA;ID # YI SYLLABLE LOP +A1CB;ID # YI SYLLABLE LEX +A1CC;ID # YI SYLLABLE LE +A1CD;ID # YI SYLLABLE LEP +A1CE;ID # YI SYLLABLE LUT +A1CF;ID # YI SYLLABLE LUX +A1D0;ID # YI SYLLABLE LU +A1D1;ID # YI SYLLABLE LUP +A1D2;ID # YI SYLLABLE LURX +A1D3;ID # YI SYLLABLE LUR +A1D4;ID # YI SYLLABLE LYT +A1D5;ID # YI SYLLABLE LYX +A1D6;ID # YI SYLLABLE LY +A1D7;ID # YI SYLLABLE LYP +A1D8;ID # YI SYLLABLE LYRX +A1D9;ID # YI SYLLABLE LYR +A1DA;ID # YI SYLLABLE GIT +A1DB;ID # YI SYLLABLE GIX +A1DC;ID # YI SYLLABLE GI +A1DD;ID # YI SYLLABLE GIP +A1DE;ID # YI SYLLABLE GIET +A1DF;ID # YI SYLLABLE GIEX +A1E0;ID # YI SYLLABLE GIE +A1E1;ID # YI SYLLABLE GIEP +A1E2;ID # YI SYLLABLE GAT +A1E3;ID # YI SYLLABLE GAX +A1E4;ID # YI SYLLABLE GA +A1E5;ID # YI SYLLABLE GAP +A1E6;ID # YI SYLLABLE GUOT +A1E7;ID # YI SYLLABLE GUOX +A1E8;ID # YI SYLLABLE GUO +A1E9;ID # YI SYLLABLE GUOP +A1EA;ID # YI SYLLABLE GOT +A1EB;ID # YI SYLLABLE GOX +A1EC;ID # YI SYLLABLE GO +A1ED;ID # YI SYLLABLE GOP +A1EE;ID # YI SYLLABLE GET +A1EF;ID # YI SYLLABLE GEX +A1F0;ID # YI SYLLABLE GE +A1F1;ID # YI SYLLABLE GEP +A1F2;ID # YI SYLLABLE GUT +A1F3;ID # YI SYLLABLE GUX +A1F4;ID # YI SYLLABLE GU +A1F5;ID # YI SYLLABLE GUP +A1F6;ID # YI SYLLABLE GURX +A1F7;ID # YI SYLLABLE GUR +A1F8;ID # YI SYLLABLE KIT +A1F9;ID # YI SYLLABLE KIX +A1FA;ID # YI SYLLABLE KI +A1FB;ID # YI SYLLABLE KIP +A1FC;ID # YI SYLLABLE KIEX +A1FD;ID # YI SYLLABLE KIE +A1FE;ID # YI SYLLABLE KIEP +A1FF;ID # YI SYLLABLE KAT +A200;ID # YI SYLLABLE KAX +A201;ID # YI SYLLABLE KA +A202;ID # YI SYLLABLE KAP +A203;ID # YI SYLLABLE KUOX +A204;ID # YI SYLLABLE KUO +A205;ID # YI SYLLABLE KUOP +A206;ID # YI SYLLABLE KOT +A207;ID # YI SYLLABLE KOX +A208;ID # YI SYLLABLE KO +A209;ID # YI SYLLABLE KOP +A20A;ID # YI SYLLABLE KET +A20B;ID # YI SYLLABLE KEX +A20C;ID # YI SYLLABLE KE +A20D;ID # YI SYLLABLE KEP +A20E;ID # YI SYLLABLE KUT +A20F;ID # YI SYLLABLE KUX +A210;ID # YI SYLLABLE KU +A211;ID # YI SYLLABLE KUP +A212;ID # YI SYLLABLE KURX +A213;ID # YI SYLLABLE KUR +A214;ID # YI SYLLABLE GGIT +A215;ID # YI SYLLABLE GGIX +A216;ID # YI SYLLABLE GGI +A217;ID # YI SYLLABLE GGIEX +A218;ID # YI SYLLABLE GGIE +A219;ID # YI SYLLABLE GGIEP +A21A;ID # YI SYLLABLE GGAT +A21B;ID # YI SYLLABLE GGAX +A21C;ID # YI SYLLABLE GGA +A21D;ID # YI SYLLABLE GGAP +A21E;ID # YI SYLLABLE GGUOT +A21F;ID # YI SYLLABLE GGUOX +A220;ID # YI SYLLABLE GGUO +A221;ID # YI SYLLABLE GGUOP +A222;ID # YI SYLLABLE GGOT +A223;ID # YI SYLLABLE GGOX +A224;ID # YI SYLLABLE GGO +A225;ID # YI SYLLABLE GGOP +A226;ID # YI SYLLABLE GGET +A227;ID # YI SYLLABLE GGEX +A228;ID # YI SYLLABLE GGE +A229;ID # YI SYLLABLE GGEP +A22A;ID # YI SYLLABLE GGUT +A22B;ID # YI SYLLABLE GGUX +A22C;ID # YI SYLLABLE GGU +A22D;ID # YI SYLLABLE GGUP +A22E;ID # YI SYLLABLE GGURX +A22F;ID # YI SYLLABLE GGUR +A230;ID # YI SYLLABLE MGIEX +A231;ID # YI SYLLABLE MGIE +A232;ID # YI SYLLABLE MGAT +A233;ID # YI SYLLABLE MGAX +A234;ID # YI SYLLABLE MGA +A235;ID # YI SYLLABLE MGAP +A236;ID # YI SYLLABLE MGUOX +A237;ID # YI SYLLABLE MGUO +A238;ID # YI SYLLABLE MGUOP +A239;ID # YI SYLLABLE MGOT +A23A;ID # YI SYLLABLE MGOX +A23B;ID # YI SYLLABLE MGO +A23C;ID # YI SYLLABLE MGOP +A23D;ID # YI SYLLABLE MGEX +A23E;ID # YI SYLLABLE MGE +A23F;ID # YI SYLLABLE MGEP +A240;ID # YI SYLLABLE MGUT +A241;ID # YI SYLLABLE MGUX +A242;ID # YI SYLLABLE MGU +A243;ID # YI SYLLABLE MGUP +A244;ID # YI SYLLABLE MGURX +A245;ID # YI SYLLABLE MGUR +A246;ID # YI SYLLABLE HXIT +A247;ID # YI SYLLABLE HXIX +A248;ID # YI SYLLABLE HXI +A249;ID # YI SYLLABLE HXIP +A24A;ID # YI SYLLABLE HXIET +A24B;ID # YI SYLLABLE HXIEX +A24C;ID # YI SYLLABLE HXIE +A24D;ID # YI SYLLABLE HXIEP +A24E;ID # YI SYLLABLE HXAT +A24F;ID # YI SYLLABLE HXAX +A250;ID # YI SYLLABLE HXA +A251;ID # YI SYLLABLE HXAP +A252;ID # YI SYLLABLE HXUOT +A253;ID # YI SYLLABLE HXUOX +A254;ID # YI SYLLABLE HXUO +A255;ID # YI SYLLABLE HXUOP +A256;ID # YI SYLLABLE HXOT +A257;ID # YI SYLLABLE HXOX +A258;ID # YI SYLLABLE HXO +A259;ID # YI SYLLABLE HXOP +A25A;ID # YI SYLLABLE HXEX +A25B;ID # YI SYLLABLE HXE +A25C;ID # YI SYLLABLE HXEP +A25D;ID # YI SYLLABLE NGIEX +A25E;ID # YI SYLLABLE NGIE +A25F;ID # YI SYLLABLE NGIEP +A260;ID # YI SYLLABLE NGAT +A261;ID # YI SYLLABLE NGAX +A262;ID # YI SYLLABLE NGA +A263;ID # YI SYLLABLE NGAP +A264;ID # YI SYLLABLE NGUOT +A265;ID # YI SYLLABLE NGUOX +A266;ID # YI SYLLABLE NGUO +A267;ID # YI SYLLABLE NGOT +A268;ID # YI SYLLABLE NGOX +A269;ID # YI SYLLABLE NGO +A26A;ID # YI SYLLABLE NGOP +A26B;ID # YI SYLLABLE NGEX +A26C;ID # YI SYLLABLE NGE +A26D;ID # YI SYLLABLE NGEP +A26E;ID # YI SYLLABLE HIT +A26F;ID # YI SYLLABLE HIEX +A270;ID # YI SYLLABLE HIE +A271;ID # YI SYLLABLE HAT +A272;ID # YI SYLLABLE HAX +A273;ID # YI SYLLABLE HA +A274;ID # YI SYLLABLE HAP +A275;ID # YI SYLLABLE HUOT +A276;ID # YI SYLLABLE HUOX +A277;ID # YI SYLLABLE HUO +A278;ID # YI SYLLABLE HUOP +A279;ID # YI SYLLABLE HOT +A27A;ID # YI SYLLABLE HOX +A27B;ID # YI SYLLABLE HO +A27C;ID # YI SYLLABLE HOP +A27D;ID # YI SYLLABLE HEX +A27E;ID # YI SYLLABLE HE +A27F;ID # YI SYLLABLE HEP +A280;ID # YI SYLLABLE WAT +A281;ID # YI SYLLABLE WAX +A282;ID # YI SYLLABLE WA +A283;ID # YI SYLLABLE WAP +A284;ID # YI SYLLABLE WUOX +A285;ID # YI SYLLABLE WUO +A286;ID # YI SYLLABLE WUOP +A287;ID # YI SYLLABLE WOX +A288;ID # YI SYLLABLE WO +A289;ID # YI SYLLABLE WOP +A28A;ID # YI SYLLABLE WEX +A28B;ID # YI SYLLABLE WE +A28C;ID # YI SYLLABLE WEP +A28D;ID # YI SYLLABLE ZIT +A28E;ID # YI SYLLABLE ZIX +A28F;ID # YI SYLLABLE ZI +A290;ID # YI SYLLABLE ZIP +A291;ID # YI SYLLABLE ZIEX +A292;ID # YI SYLLABLE ZIE +A293;ID # YI SYLLABLE ZIEP +A294;ID # YI SYLLABLE ZAT +A295;ID # YI SYLLABLE ZAX +A296;ID # YI SYLLABLE ZA +A297;ID # YI SYLLABLE ZAP +A298;ID # YI SYLLABLE ZUOX +A299;ID # YI SYLLABLE ZUO +A29A;ID # YI SYLLABLE ZUOP +A29B;ID # YI SYLLABLE ZOT +A29C;ID # YI SYLLABLE ZOX +A29D;ID # YI SYLLABLE ZO +A29E;ID # YI SYLLABLE ZOP +A29F;ID # YI SYLLABLE ZEX +A2A0;ID # YI SYLLABLE ZE +A2A1;ID # YI SYLLABLE ZEP +A2A2;ID # YI SYLLABLE ZUT +A2A3;ID # YI SYLLABLE ZUX +A2A4;ID # YI SYLLABLE ZU +A2A5;ID # YI SYLLABLE ZUP +A2A6;ID # YI SYLLABLE ZURX +A2A7;ID # YI SYLLABLE ZUR +A2A8;ID # YI SYLLABLE ZYT +A2A9;ID # YI SYLLABLE ZYX +A2AA;ID # YI SYLLABLE ZY +A2AB;ID # YI SYLLABLE ZYP +A2AC;ID # YI SYLLABLE ZYRX +A2AD;ID # YI SYLLABLE ZYR +A2AE;ID # YI SYLLABLE CIT +A2AF;ID # YI SYLLABLE CIX +A2B0;ID # YI SYLLABLE CI +A2B1;ID # YI SYLLABLE CIP +A2B2;ID # YI SYLLABLE CIET +A2B3;ID # YI SYLLABLE CIEX +A2B4;ID # YI SYLLABLE CIE +A2B5;ID # YI SYLLABLE CIEP +A2B6;ID # YI SYLLABLE CAT +A2B7;ID # YI SYLLABLE CAX +A2B8;ID # YI SYLLABLE CA +A2B9;ID # YI SYLLABLE CAP +A2BA;ID # YI SYLLABLE CUOX +A2BB;ID # YI SYLLABLE CUO +A2BC;ID # YI SYLLABLE CUOP +A2BD;ID # YI SYLLABLE COT +A2BE;ID # YI SYLLABLE COX +A2BF;ID # YI SYLLABLE CO +A2C0;ID # YI SYLLABLE COP +A2C1;ID # YI SYLLABLE CEX +A2C2;ID # YI SYLLABLE CE +A2C3;ID # YI SYLLABLE CEP +A2C4;ID # YI SYLLABLE CUT +A2C5;ID # YI SYLLABLE CUX +A2C6;ID # YI SYLLABLE CU +A2C7;ID # YI SYLLABLE CUP +A2C8;ID # YI SYLLABLE CURX +A2C9;ID # YI SYLLABLE CUR +A2CA;ID # YI SYLLABLE CYT +A2CB;ID # YI SYLLABLE CYX +A2CC;ID # YI SYLLABLE CY +A2CD;ID # YI SYLLABLE CYP +A2CE;ID # YI SYLLABLE CYRX +A2CF;ID # YI SYLLABLE CYR +A2D0;ID # YI SYLLABLE ZZIT +A2D1;ID # YI SYLLABLE ZZIX +A2D2;ID # YI SYLLABLE ZZI +A2D3;ID # YI SYLLABLE ZZIP +A2D4;ID # YI SYLLABLE ZZIET +A2D5;ID # YI SYLLABLE ZZIEX +A2D6;ID # YI SYLLABLE ZZIE +A2D7;ID # YI SYLLABLE ZZIEP +A2D8;ID # YI SYLLABLE ZZAT +A2D9;ID # YI SYLLABLE ZZAX +A2DA;ID # YI SYLLABLE ZZA +A2DB;ID # YI SYLLABLE ZZAP +A2DC;ID # YI SYLLABLE ZZOX +A2DD;ID # YI SYLLABLE ZZO +A2DE;ID # YI SYLLABLE ZZOP +A2DF;ID # YI SYLLABLE ZZEX +A2E0;ID # YI SYLLABLE ZZE +A2E1;ID # YI SYLLABLE ZZEP +A2E2;ID # YI SYLLABLE ZZUX +A2E3;ID # YI SYLLABLE ZZU +A2E4;ID # YI SYLLABLE ZZUP +A2E5;ID # YI SYLLABLE ZZURX +A2E6;ID # YI SYLLABLE ZZUR +A2E7;ID # YI SYLLABLE ZZYT +A2E8;ID # YI SYLLABLE ZZYX +A2E9;ID # YI SYLLABLE ZZY +A2EA;ID # YI SYLLABLE ZZYP +A2EB;ID # YI SYLLABLE ZZYRX +A2EC;ID # YI SYLLABLE ZZYR +A2ED;ID # YI SYLLABLE NZIT +A2EE;ID # YI SYLLABLE NZIX +A2EF;ID # YI SYLLABLE NZI +A2F0;ID # YI SYLLABLE NZIP +A2F1;ID # YI SYLLABLE NZIEX +A2F2;ID # YI SYLLABLE NZIE +A2F3;ID # YI SYLLABLE NZIEP +A2F4;ID # YI SYLLABLE NZAT +A2F5;ID # YI SYLLABLE NZAX +A2F6;ID # YI SYLLABLE NZA +A2F7;ID # YI SYLLABLE NZAP +A2F8;ID # YI SYLLABLE NZUOX +A2F9;ID # YI SYLLABLE NZUO +A2FA;ID # YI SYLLABLE NZOX +A2FB;ID # YI SYLLABLE NZOP +A2FC;ID # YI SYLLABLE NZEX +A2FD;ID # YI SYLLABLE NZE +A2FE;ID # YI SYLLABLE NZUX +A2FF;ID # YI SYLLABLE NZU +A300;ID # YI SYLLABLE NZUP +A301;ID # YI SYLLABLE NZURX +A302;ID # YI SYLLABLE NZUR +A303;ID # YI SYLLABLE NZYT +A304;ID # YI SYLLABLE NZYX +A305;ID # YI SYLLABLE NZY +A306;ID # YI SYLLABLE NZYP +A307;ID # YI SYLLABLE NZYRX +A308;ID # YI SYLLABLE NZYR +A309;ID # YI SYLLABLE SIT +A30A;ID # YI SYLLABLE SIX +A30B;ID # YI SYLLABLE SI +A30C;ID # YI SYLLABLE SIP +A30D;ID # YI SYLLABLE SIEX +A30E;ID # YI SYLLABLE SIE +A30F;ID # YI SYLLABLE SIEP +A310;ID # YI SYLLABLE SAT +A311;ID # YI SYLLABLE SAX +A312;ID # YI SYLLABLE SA +A313;ID # YI SYLLABLE SAP +A314;ID # YI SYLLABLE SUOX +A315;ID # YI SYLLABLE SUO +A316;ID # YI SYLLABLE SUOP +A317;ID # YI SYLLABLE SOT +A318;ID # YI SYLLABLE SOX +A319;ID # YI SYLLABLE SO +A31A;ID # YI SYLLABLE SOP +A31B;ID # YI SYLLABLE SEX +A31C;ID # YI SYLLABLE SE +A31D;ID # YI SYLLABLE SEP +A31E;ID # YI SYLLABLE SUT +A31F;ID # YI SYLLABLE SUX +A320;ID # YI SYLLABLE SU +A321;ID # YI SYLLABLE SUP +A322;ID # YI SYLLABLE SURX +A323;ID # YI SYLLABLE SUR +A324;ID # YI SYLLABLE SYT +A325;ID # YI SYLLABLE SYX +A326;ID # YI SYLLABLE SY +A327;ID # YI SYLLABLE SYP +A328;ID # YI SYLLABLE SYRX +A329;ID # YI SYLLABLE SYR +A32A;ID # YI SYLLABLE SSIT +A32B;ID # YI SYLLABLE SSIX +A32C;ID # YI SYLLABLE SSI +A32D;ID # YI SYLLABLE SSIP +A32E;ID # YI SYLLABLE SSIEX +A32F;ID # YI SYLLABLE SSIE +A330;ID # YI SYLLABLE SSIEP +A331;ID # YI SYLLABLE SSAT +A332;ID # YI SYLLABLE SSAX +A333;ID # YI SYLLABLE SSA +A334;ID # YI SYLLABLE SSAP +A335;ID # YI SYLLABLE SSOT +A336;ID # YI SYLLABLE SSOX +A337;ID # YI SYLLABLE SSO +A338;ID # YI SYLLABLE SSOP +A339;ID # YI SYLLABLE SSEX +A33A;ID # YI SYLLABLE SSE +A33B;ID # YI SYLLABLE SSEP +A33C;ID # YI SYLLABLE SSUT +A33D;ID # YI SYLLABLE SSUX +A33E;ID # YI SYLLABLE SSU +A33F;ID # YI SYLLABLE SSUP +A340;ID # YI SYLLABLE SSYT +A341;ID # YI SYLLABLE SSYX +A342;ID # YI SYLLABLE SSY +A343;ID # YI SYLLABLE SSYP +A344;ID # YI SYLLABLE SSYRX +A345;ID # YI SYLLABLE SSYR +A346;ID # YI SYLLABLE ZHAT +A347;ID # YI SYLLABLE ZHAX +A348;ID # YI SYLLABLE ZHA +A349;ID # YI SYLLABLE ZHAP +A34A;ID # YI SYLLABLE ZHUOX +A34B;ID # YI SYLLABLE ZHUO +A34C;ID # YI SYLLABLE ZHUOP +A34D;ID # YI SYLLABLE ZHOT +A34E;ID # YI SYLLABLE ZHOX +A34F;ID # YI SYLLABLE ZHO +A350;ID # YI SYLLABLE ZHOP +A351;ID # YI SYLLABLE ZHET +A352;ID # YI SYLLABLE ZHEX +A353;ID # YI SYLLABLE ZHE +A354;ID # YI SYLLABLE ZHEP +A355;ID # YI SYLLABLE ZHUT +A356;ID # YI SYLLABLE ZHUX +A357;ID # YI SYLLABLE ZHU +A358;ID # YI SYLLABLE ZHUP +A359;ID # YI SYLLABLE ZHURX +A35A;ID # YI SYLLABLE ZHUR +A35B;ID # YI SYLLABLE ZHYT +A35C;ID # YI SYLLABLE ZHYX +A35D;ID # YI SYLLABLE ZHY +A35E;ID # YI SYLLABLE ZHYP +A35F;ID # YI SYLLABLE ZHYRX +A360;ID # YI SYLLABLE ZHYR +A361;ID # YI SYLLABLE CHAT +A362;ID # YI SYLLABLE CHAX +A363;ID # YI SYLLABLE CHA +A364;ID # YI SYLLABLE CHAP +A365;ID # YI SYLLABLE CHUOT +A366;ID # YI SYLLABLE CHUOX +A367;ID # YI SYLLABLE CHUO +A368;ID # YI SYLLABLE CHUOP +A369;ID # YI SYLLABLE CHOT +A36A;ID # YI SYLLABLE CHOX +A36B;ID # YI SYLLABLE CHO +A36C;ID # YI SYLLABLE CHOP +A36D;ID # YI SYLLABLE CHET +A36E;ID # YI SYLLABLE CHEX +A36F;ID # YI SYLLABLE CHE +A370;ID # YI SYLLABLE CHEP +A371;ID # YI SYLLABLE CHUX +A372;ID # YI SYLLABLE CHU +A373;ID # YI SYLLABLE CHUP +A374;ID # YI SYLLABLE CHURX +A375;ID # YI SYLLABLE CHUR +A376;ID # YI SYLLABLE CHYT +A377;ID # YI SYLLABLE CHYX +A378;ID # YI SYLLABLE CHY +A379;ID # YI SYLLABLE CHYP +A37A;ID # YI SYLLABLE CHYRX +A37B;ID # YI SYLLABLE CHYR +A37C;ID # YI SYLLABLE RRAX +A37D;ID # YI SYLLABLE RRA +A37E;ID # YI SYLLABLE RRUOX +A37F;ID # YI SYLLABLE RRUO +A380;ID # YI SYLLABLE RROT +A381;ID # YI SYLLABLE RROX +A382;ID # YI SYLLABLE RRO +A383;ID # YI SYLLABLE RROP +A384;ID # YI SYLLABLE RRET +A385;ID # YI SYLLABLE RREX +A386;ID # YI SYLLABLE RRE +A387;ID # YI SYLLABLE RREP +A388;ID # YI SYLLABLE RRUT +A389;ID # YI SYLLABLE RRUX +A38A;ID # YI SYLLABLE RRU +A38B;ID # YI SYLLABLE RRUP +A38C;ID # YI SYLLABLE RRURX +A38D;ID # YI SYLLABLE RRUR +A38E;ID # YI SYLLABLE RRYT +A38F;ID # YI SYLLABLE RRYX +A390;ID # YI SYLLABLE RRY +A391;ID # YI SYLLABLE RRYP +A392;ID # YI SYLLABLE RRYRX +A393;ID # YI SYLLABLE RRYR +A394;ID # YI SYLLABLE NRAT +A395;ID # YI SYLLABLE NRAX +A396;ID # YI SYLLABLE NRA +A397;ID # YI SYLLABLE NRAP +A398;ID # YI SYLLABLE NROX +A399;ID # YI SYLLABLE NRO +A39A;ID # YI SYLLABLE NROP +A39B;ID # YI SYLLABLE NRET +A39C;ID # YI SYLLABLE NREX +A39D;ID # YI SYLLABLE NRE +A39E;ID # YI SYLLABLE NREP +A39F;ID # YI SYLLABLE NRUT +A3A0;ID # YI SYLLABLE NRUX +A3A1;ID # YI SYLLABLE NRU +A3A2;ID # YI SYLLABLE NRUP +A3A3;ID # YI SYLLABLE NRURX +A3A4;ID # YI SYLLABLE NRUR +A3A5;ID # YI SYLLABLE NRYT +A3A6;ID # YI SYLLABLE NRYX +A3A7;ID # YI SYLLABLE NRY +A3A8;ID # YI SYLLABLE NRYP +A3A9;ID # YI SYLLABLE NRYRX +A3AA;ID # YI SYLLABLE NRYR +A3AB;ID # YI SYLLABLE SHAT +A3AC;ID # YI SYLLABLE SHAX +A3AD;ID # YI SYLLABLE SHA +A3AE;ID # YI SYLLABLE SHAP +A3AF;ID # YI SYLLABLE SHUOX +A3B0;ID # YI SYLLABLE SHUO +A3B1;ID # YI SYLLABLE SHUOP +A3B2;ID # YI SYLLABLE SHOT +A3B3;ID # YI SYLLABLE SHOX +A3B4;ID # YI SYLLABLE SHO +A3B5;ID # YI SYLLABLE SHOP +A3B6;ID # YI SYLLABLE SHET +A3B7;ID # YI SYLLABLE SHEX +A3B8;ID # YI SYLLABLE SHE +A3B9;ID # YI SYLLABLE SHEP +A3BA;ID # YI SYLLABLE SHUT +A3BB;ID # YI SYLLABLE SHUX +A3BC;ID # YI SYLLABLE SHU +A3BD;ID # YI SYLLABLE SHUP +A3BE;ID # YI SYLLABLE SHURX +A3BF;ID # YI SYLLABLE SHUR +A3C0;ID # YI SYLLABLE SHYT +A3C1;ID # YI SYLLABLE SHYX +A3C2;ID # YI SYLLABLE SHY +A3C3;ID # YI SYLLABLE SHYP +A3C4;ID # YI SYLLABLE SHYRX +A3C5;ID # YI SYLLABLE SHYR +A3C6;ID # YI SYLLABLE RAT +A3C7;ID # YI SYLLABLE RAX +A3C8;ID # YI SYLLABLE RA +A3C9;ID # YI SYLLABLE RAP +A3CA;ID # YI SYLLABLE RUOX +A3CB;ID # YI SYLLABLE RUO +A3CC;ID # YI SYLLABLE RUOP +A3CD;ID # YI SYLLABLE ROT +A3CE;ID # YI SYLLABLE ROX +A3CF;ID # YI SYLLABLE RO +A3D0;ID # YI SYLLABLE ROP +A3D1;ID # YI SYLLABLE REX +A3D2;ID # YI SYLLABLE RE +A3D3;ID # YI SYLLABLE REP +A3D4;ID # YI SYLLABLE RUT +A3D5;ID # YI SYLLABLE RUX +A3D6;ID # YI SYLLABLE RU +A3D7;ID # YI SYLLABLE RUP +A3D8;ID # YI SYLLABLE RURX +A3D9;ID # YI SYLLABLE RUR +A3DA;ID # YI SYLLABLE RYT +A3DB;ID # YI SYLLABLE RYX +A3DC;ID # YI SYLLABLE RY +A3DD;ID # YI SYLLABLE RYP +A3DE;ID # YI SYLLABLE RYRX +A3DF;ID # YI SYLLABLE RYR +A3E0;ID # YI SYLLABLE JIT +A3E1;ID # YI SYLLABLE JIX +A3E2;ID # YI SYLLABLE JI +A3E3;ID # YI SYLLABLE JIP +A3E4;ID # YI SYLLABLE JIET +A3E5;ID # YI SYLLABLE JIEX +A3E6;ID # YI SYLLABLE JIE +A3E7;ID # YI SYLLABLE JIEP +A3E8;ID # YI SYLLABLE JUOT +A3E9;ID # YI SYLLABLE JUOX +A3EA;ID # YI SYLLABLE JUO +A3EB;ID # YI SYLLABLE JUOP +A3EC;ID # YI SYLLABLE JOT +A3ED;ID # YI SYLLABLE JOX +A3EE;ID # YI SYLLABLE JO +A3EF;ID # YI SYLLABLE JOP +A3F0;ID # YI SYLLABLE JUT +A3F1;ID # YI SYLLABLE JUX +A3F2;ID # YI SYLLABLE JU +A3F3;ID # YI SYLLABLE JUP +A3F4;ID # YI SYLLABLE JURX +A3F5;ID # YI SYLLABLE JUR +A3F6;ID # YI SYLLABLE JYT +A3F7;ID # YI SYLLABLE JYX +A3F8;ID # YI SYLLABLE JY +A3F9;ID # YI SYLLABLE JYP +A3FA;ID # YI SYLLABLE JYRX +A3FB;ID # YI SYLLABLE JYR +A3FC;ID # YI SYLLABLE QIT +A3FD;ID # YI SYLLABLE QIX +A3FE;ID # YI SYLLABLE QI +A3FF;ID # YI SYLLABLE QIP +A400;ID # YI SYLLABLE QIET +A401;ID # YI SYLLABLE QIEX +A402;ID # YI SYLLABLE QIE +A403;ID # YI SYLLABLE QIEP +A404;ID # YI SYLLABLE QUOT +A405;ID # YI SYLLABLE QUOX +A406;ID # YI SYLLABLE QUO +A407;ID # YI SYLLABLE QUOP +A408;ID # YI SYLLABLE QOT +A409;ID # YI SYLLABLE QOX +A40A;ID # YI SYLLABLE QO +A40B;ID # YI SYLLABLE QOP +A40C;ID # YI SYLLABLE QUT +A40D;ID # YI SYLLABLE QUX +A40E;ID # YI SYLLABLE QU +A40F;ID # YI SYLLABLE QUP +A410;ID # YI SYLLABLE QURX +A411;ID # YI SYLLABLE QUR +A412;ID # YI SYLLABLE QYT +A413;ID # YI SYLLABLE QYX +A414;ID # YI SYLLABLE QY +A415;ID # YI SYLLABLE QYP +A416;ID # YI SYLLABLE QYRX +A417;ID # YI SYLLABLE QYR +A418;ID # YI SYLLABLE JJIT +A419;ID # YI SYLLABLE JJIX +A41A;ID # YI SYLLABLE JJI +A41B;ID # YI SYLLABLE JJIP +A41C;ID # YI SYLLABLE JJIET +A41D;ID # YI SYLLABLE JJIEX +A41E;ID # YI SYLLABLE JJIE +A41F;ID # YI SYLLABLE JJIEP +A420;ID # YI SYLLABLE JJUOX +A421;ID # YI SYLLABLE JJUO +A422;ID # YI SYLLABLE JJUOP +A423;ID # YI SYLLABLE JJOT +A424;ID # YI SYLLABLE JJOX +A425;ID # YI SYLLABLE JJO +A426;ID # YI SYLLABLE JJOP +A427;ID # YI SYLLABLE JJUT +A428;ID # YI SYLLABLE JJUX +A429;ID # YI SYLLABLE JJU +A42A;ID # YI SYLLABLE JJUP +A42B;ID # YI SYLLABLE JJURX +A42C;ID # YI SYLLABLE JJUR +A42D;ID # YI SYLLABLE JJYT +A42E;ID # YI SYLLABLE JJYX +A42F;ID # YI SYLLABLE JJY +A430;ID # YI SYLLABLE JJYP +A431;ID # YI SYLLABLE NJIT +A432;ID # YI SYLLABLE NJIX +A433;ID # YI SYLLABLE NJI +A434;ID # YI SYLLABLE NJIP +A435;ID # YI SYLLABLE NJIET +A436;ID # YI SYLLABLE NJIEX +A437;ID # YI SYLLABLE NJIE +A438;ID # YI SYLLABLE NJIEP +A439;ID # YI SYLLABLE NJUOX +A43A;ID # YI SYLLABLE NJUO +A43B;ID # YI SYLLABLE NJOT +A43C;ID # YI SYLLABLE NJOX +A43D;ID # YI SYLLABLE NJO +A43E;ID # YI SYLLABLE NJOP +A43F;ID # YI SYLLABLE NJUX +A440;ID # YI SYLLABLE NJU +A441;ID # YI SYLLABLE NJUP +A442;ID # YI SYLLABLE NJURX +A443;ID # YI SYLLABLE NJUR +A444;ID # YI SYLLABLE NJYT +A445;ID # YI SYLLABLE NJYX +A446;ID # YI SYLLABLE NJY +A447;ID # YI SYLLABLE NJYP +A448;ID # YI SYLLABLE NJYRX +A449;ID # YI SYLLABLE NJYR +A44A;ID # YI SYLLABLE NYIT +A44B;ID # YI SYLLABLE NYIX +A44C;ID # YI SYLLABLE NYI +A44D;ID # YI SYLLABLE NYIP +A44E;ID # YI SYLLABLE NYIET +A44F;ID # YI SYLLABLE NYIEX +A450;ID # YI SYLLABLE NYIE +A451;ID # YI SYLLABLE NYIEP +A452;ID # YI SYLLABLE NYUOX +A453;ID # YI SYLLABLE NYUO +A454;ID # YI SYLLABLE NYUOP +A455;ID # YI SYLLABLE NYOT +A456;ID # YI SYLLABLE NYOX +A457;ID # YI SYLLABLE NYO +A458;ID # YI SYLLABLE NYOP +A459;ID # YI SYLLABLE NYUT +A45A;ID # YI SYLLABLE NYUX +A45B;ID # YI SYLLABLE NYU +A45C;ID # YI SYLLABLE NYUP +A45D;ID # YI SYLLABLE XIT +A45E;ID # YI SYLLABLE XIX +A45F;ID # YI SYLLABLE XI +A460;ID # YI SYLLABLE XIP +A461;ID # YI SYLLABLE XIET +A462;ID # YI SYLLABLE XIEX +A463;ID # YI SYLLABLE XIE +A464;ID # YI SYLLABLE XIEP +A465;ID # YI SYLLABLE XUOX +A466;ID # YI SYLLABLE XUO +A467;ID # YI SYLLABLE XOT +A468;ID # YI SYLLABLE XOX +A469;ID # YI SYLLABLE XO +A46A;ID # YI SYLLABLE XOP +A46B;ID # YI SYLLABLE XYT +A46C;ID # YI SYLLABLE XYX +A46D;ID # YI SYLLABLE XY +A46E;ID # YI SYLLABLE XYP +A46F;ID # YI SYLLABLE XYRX +A470;ID # YI SYLLABLE XYR +A471;ID # YI SYLLABLE YIT +A472;ID # YI SYLLABLE YIX +A473;ID # YI SYLLABLE YI +A474;ID # YI SYLLABLE YIP +A475;ID # YI SYLLABLE YIET +A476;ID # YI SYLLABLE YIEX +A477;ID # YI SYLLABLE YIE +A478;ID # YI SYLLABLE YIEP +A479;ID # YI SYLLABLE YUOT +A47A;ID # YI SYLLABLE YUOX +A47B;ID # YI SYLLABLE YUO +A47C;ID # YI SYLLABLE YUOP +A47D;ID # YI SYLLABLE YOT +A47E;ID # YI SYLLABLE YOX +A47F;ID # YI SYLLABLE YO +A480;ID # YI SYLLABLE YOP +A481;ID # YI SYLLABLE YUT +A482;ID # YI SYLLABLE YUX +A483;ID # YI SYLLABLE YU +A484;ID # YI SYLLABLE YUP +A485;ID # YI SYLLABLE YURX +A486;ID # YI SYLLABLE YUR +A487;ID # YI SYLLABLE YYT +A488;ID # YI SYLLABLE YYX +A489;ID # YI SYLLABLE YY +A48A;ID # YI SYLLABLE YYP +A48B;ID # YI SYLLABLE YYRX +A48C;ID # YI SYLLABLE YYR +A490;ID # YI RADICAL QOT +A491;ID # YI RADICAL LI +A492;ID # YI RADICAL KIT +A493;ID # YI RADICAL NYIP +A494;ID # YI RADICAL CYP +A495;ID # YI RADICAL SSI +A496;ID # YI RADICAL GGOP +A497;ID # YI RADICAL GEP +A498;ID # YI RADICAL MI +A499;ID # YI RADICAL HXIT +A49A;ID # YI RADICAL LYR +A49B;ID # YI RADICAL BBUT +A49C;ID # YI RADICAL MOP +A49D;ID # YI RADICAL YO +A49E;ID # YI RADICAL PUT +A49F;ID # YI RADICAL HXUO +A4A0;ID # YI RADICAL TAT +A4A1;ID # YI RADICAL GA +A4A2;ID # YI RADICAL ZUP +A4A3;ID # YI RADICAL CYT +A4A4;ID # YI RADICAL DDUR +A4A5;ID # YI RADICAL BUR +A4A6;ID # YI RADICAL GGUO +A4A7;ID # YI RADICAL NYOP +A4A8;ID # YI RADICAL TU +A4A9;ID # YI RADICAL OP +A4AA;ID # YI RADICAL JJUT +A4AB;ID # YI RADICAL ZOT +A4AC;ID # YI RADICAL PYT +A4AD;ID # YI RADICAL HMO +A4AE;ID # YI RADICAL YIT +A4AF;ID # YI RADICAL VUR +A4B0;ID # YI RADICAL SHY +A4B1;ID # YI RADICAL VEP +A4B2;ID # YI RADICAL ZA +A4B3;ID # YI RADICAL JO +A4B4;ID # YI RADICAL NZUP +A4B5;ID # YI RADICAL JJY +A4B6;ID # YI RADICAL GOT +A4B7;ID # YI RADICAL JJIE +A4B8;ID # YI RADICAL WO +A4B9;ID # YI RADICAL DU +A4BA;ID # YI RADICAL SHUR +A4BB;ID # YI RADICAL LIE +A4BC;ID # YI RADICAL CY +A4BD;ID # YI RADICAL CUOP +A4BE;ID # YI RADICAL CIP +A4BF;ID # YI RADICAL HXOP +A4C0;ID # YI RADICAL SHAT +A4C1;ID # YI RADICAL ZUR +A4C2;ID # YI RADICAL SHOP +A4C3;ID # YI RADICAL CHE +A4C4;ID # YI RADICAL ZZIET +A4C5;ID # YI RADICAL NBIE +A4C6;ID # YI RADICAL KE +AC00..D7A3;ID # .. +D800..DB7F;SG # .. +DB80..DBFF;SG # .. +DC00..DFFF;SG # .. +E000..F8FF;XX # .. +F900;ID # CJK COMPATIBILITY IDEOGRAPH-F900 +F901;ID # CJK COMPATIBILITY IDEOGRAPH-F901 +F902;ID # CJK COMPATIBILITY IDEOGRAPH-F902 +F903;ID # CJK COMPATIBILITY IDEOGRAPH-F903 +F904;ID # CJK COMPATIBILITY IDEOGRAPH-F904 +F905;ID # CJK COMPATIBILITY IDEOGRAPH-F905 +F906;ID # CJK COMPATIBILITY IDEOGRAPH-F906 +F907;ID # CJK COMPATIBILITY IDEOGRAPH-F907 +F908;ID # CJK COMPATIBILITY IDEOGRAPH-F908 +F909;ID # CJK COMPATIBILITY IDEOGRAPH-F909 +F90A;ID # CJK COMPATIBILITY IDEOGRAPH-F90A +F90B;ID # CJK COMPATIBILITY IDEOGRAPH-F90B +F90C;ID # CJK COMPATIBILITY IDEOGRAPH-F90C +F90D;ID # CJK COMPATIBILITY IDEOGRAPH-F90D +F90E;ID # CJK COMPATIBILITY IDEOGRAPH-F90E +F90F;ID # CJK COMPATIBILITY IDEOGRAPH-F90F +F910;ID # CJK COMPATIBILITY IDEOGRAPH-F910 +F911;ID # CJK COMPATIBILITY IDEOGRAPH-F911 +F912;ID # CJK COMPATIBILITY IDEOGRAPH-F912 +F913;ID # CJK COMPATIBILITY IDEOGRAPH-F913 +F914;ID # CJK COMPATIBILITY IDEOGRAPH-F914 +F915;ID # CJK COMPATIBILITY IDEOGRAPH-F915 +F916;ID # CJK COMPATIBILITY IDEOGRAPH-F916 +F917;ID # CJK COMPATIBILITY IDEOGRAPH-F917 +F918;ID # CJK COMPATIBILITY IDEOGRAPH-F918 +F919;ID # CJK COMPATIBILITY IDEOGRAPH-F919 +F91A;ID # CJK COMPATIBILITY IDEOGRAPH-F91A +F91B;ID # CJK COMPATIBILITY IDEOGRAPH-F91B +F91C;ID # CJK COMPATIBILITY IDEOGRAPH-F91C +F91D;ID # CJK COMPATIBILITY IDEOGRAPH-F91D +F91E;ID # CJK COMPATIBILITY IDEOGRAPH-F91E +F91F;ID # CJK COMPATIBILITY IDEOGRAPH-F91F +F920;ID # CJK COMPATIBILITY IDEOGRAPH-F920 +F921;ID # CJK COMPATIBILITY IDEOGRAPH-F921 +F922;ID # CJK COMPATIBILITY IDEOGRAPH-F922 +F923;ID # CJK COMPATIBILITY IDEOGRAPH-F923 +F924;ID # CJK COMPATIBILITY IDEOGRAPH-F924 +F925;ID # CJK COMPATIBILITY IDEOGRAPH-F925 +F926;ID # CJK COMPATIBILITY IDEOGRAPH-F926 +F927;ID # CJK COMPATIBILITY IDEOGRAPH-F927 +F928;ID # CJK COMPATIBILITY IDEOGRAPH-F928 +F929;ID # CJK COMPATIBILITY IDEOGRAPH-F929 +F92A;ID # CJK COMPATIBILITY IDEOGRAPH-F92A +F92B;ID # CJK COMPATIBILITY IDEOGRAPH-F92B +F92C;ID # CJK COMPATIBILITY IDEOGRAPH-F92C +F92D;ID # CJK COMPATIBILITY IDEOGRAPH-F92D +F92E;ID # CJK COMPATIBILITY IDEOGRAPH-F92E +F92F;ID # CJK COMPATIBILITY IDEOGRAPH-F92F +F930;ID # CJK COMPATIBILITY IDEOGRAPH-F930 +F931;ID # CJK COMPATIBILITY IDEOGRAPH-F931 +F932;ID # CJK COMPATIBILITY IDEOGRAPH-F932 +F933;ID # CJK COMPATIBILITY IDEOGRAPH-F933 +F934;ID # CJK COMPATIBILITY IDEOGRAPH-F934 +F935;ID # CJK COMPATIBILITY IDEOGRAPH-F935 +F936;ID # CJK COMPATIBILITY IDEOGRAPH-F936 +F937;ID # CJK COMPATIBILITY IDEOGRAPH-F937 +F938;ID # CJK COMPATIBILITY IDEOGRAPH-F938 +F939;ID # CJK COMPATIBILITY IDEOGRAPH-F939 +F93A;ID # CJK COMPATIBILITY IDEOGRAPH-F93A +F93B;ID # CJK COMPATIBILITY IDEOGRAPH-F93B +F93C;ID # CJK COMPATIBILITY IDEOGRAPH-F93C +F93D;ID # CJK COMPATIBILITY IDEOGRAPH-F93D +F93E;ID # CJK COMPATIBILITY IDEOGRAPH-F93E +F93F;ID # CJK COMPATIBILITY IDEOGRAPH-F93F +F940;ID # CJK COMPATIBILITY IDEOGRAPH-F940 +F941;ID # CJK COMPATIBILITY IDEOGRAPH-F941 +F942;ID # CJK COMPATIBILITY IDEOGRAPH-F942 +F943;ID # CJK COMPATIBILITY IDEOGRAPH-F943 +F944;ID # CJK COMPATIBILITY IDEOGRAPH-F944 +F945;ID # CJK COMPATIBILITY IDEOGRAPH-F945 +F946;ID # CJK COMPATIBILITY IDEOGRAPH-F946 +F947;ID # CJK COMPATIBILITY IDEOGRAPH-F947 +F948;ID # CJK COMPATIBILITY IDEOGRAPH-F948 +F949;ID # CJK COMPATIBILITY IDEOGRAPH-F949 +F94A;ID # CJK COMPATIBILITY IDEOGRAPH-F94A +F94B;ID # CJK COMPATIBILITY IDEOGRAPH-F94B +F94C;ID # CJK COMPATIBILITY IDEOGRAPH-F94C +F94D;ID # CJK COMPATIBILITY IDEOGRAPH-F94D +F94E;ID # CJK COMPATIBILITY IDEOGRAPH-F94E +F94F;ID # CJK COMPATIBILITY IDEOGRAPH-F94F +F950;ID # CJK COMPATIBILITY IDEOGRAPH-F950 +F951;ID # CJK COMPATIBILITY IDEOGRAPH-F951 +F952;ID # CJK COMPATIBILITY IDEOGRAPH-F952 +F953;ID # CJK COMPATIBILITY IDEOGRAPH-F953 +F954;ID # CJK COMPATIBILITY IDEOGRAPH-F954 +F955;ID # CJK COMPATIBILITY IDEOGRAPH-F955 +F956;ID # CJK COMPATIBILITY IDEOGRAPH-F956 +F957;ID # CJK COMPATIBILITY IDEOGRAPH-F957 +F958;ID # CJK COMPATIBILITY IDEOGRAPH-F958 +F959;ID # CJK COMPATIBILITY IDEOGRAPH-F959 +F95A;ID # CJK COMPATIBILITY IDEOGRAPH-F95A +F95B;ID # CJK COMPATIBILITY IDEOGRAPH-F95B +F95C;ID # CJK COMPATIBILITY IDEOGRAPH-F95C +F95D;ID # CJK COMPATIBILITY IDEOGRAPH-F95D +F95E;ID # CJK COMPATIBILITY IDEOGRAPH-F95E +F95F;ID # CJK COMPATIBILITY IDEOGRAPH-F95F +F960;ID # CJK COMPATIBILITY IDEOGRAPH-F960 +F961;ID # CJK COMPATIBILITY IDEOGRAPH-F961 +F962;ID # CJK COMPATIBILITY IDEOGRAPH-F962 +F963;ID # CJK COMPATIBILITY IDEOGRAPH-F963 +F964;ID # CJK COMPATIBILITY IDEOGRAPH-F964 +F965;ID # CJK COMPATIBILITY IDEOGRAPH-F965 +F966;ID # CJK COMPATIBILITY IDEOGRAPH-F966 +F967;ID # CJK COMPATIBILITY IDEOGRAPH-F967 +F968;ID # CJK COMPATIBILITY IDEOGRAPH-F968 +F969;ID # CJK COMPATIBILITY IDEOGRAPH-F969 +F96A;ID # CJK COMPATIBILITY IDEOGRAPH-F96A +F96B;ID # CJK COMPATIBILITY IDEOGRAPH-F96B +F96C;ID # CJK COMPATIBILITY IDEOGRAPH-F96C +F96D;ID # CJK COMPATIBILITY IDEOGRAPH-F96D +F96E;ID # CJK COMPATIBILITY IDEOGRAPH-F96E +F96F;ID # CJK COMPATIBILITY IDEOGRAPH-F96F +F970;ID # CJK COMPATIBILITY IDEOGRAPH-F970 +F971;ID # CJK COMPATIBILITY IDEOGRAPH-F971 +F972;ID # CJK COMPATIBILITY IDEOGRAPH-F972 +F973;ID # CJK COMPATIBILITY IDEOGRAPH-F973 +F974;ID # CJK COMPATIBILITY IDEOGRAPH-F974 +F975;ID # CJK COMPATIBILITY IDEOGRAPH-F975 +F976;ID # CJK COMPATIBILITY IDEOGRAPH-F976 +F977;ID # CJK COMPATIBILITY IDEOGRAPH-F977 +F978;ID # CJK COMPATIBILITY IDEOGRAPH-F978 +F979;ID # CJK COMPATIBILITY IDEOGRAPH-F979 +F97A;ID # CJK COMPATIBILITY IDEOGRAPH-F97A +F97B;ID # CJK COMPATIBILITY IDEOGRAPH-F97B +F97C;ID # CJK COMPATIBILITY IDEOGRAPH-F97C +F97D;ID # CJK COMPATIBILITY IDEOGRAPH-F97D +F97E;ID # CJK COMPATIBILITY IDEOGRAPH-F97E +F97F;ID # CJK COMPATIBILITY IDEOGRAPH-F97F +F980;ID # CJK COMPATIBILITY IDEOGRAPH-F980 +F981;ID # CJK COMPATIBILITY IDEOGRAPH-F981 +F982;ID # CJK COMPATIBILITY IDEOGRAPH-F982 +F983;ID # CJK COMPATIBILITY IDEOGRAPH-F983 +F984;ID # CJK COMPATIBILITY IDEOGRAPH-F984 +F985;ID # CJK COMPATIBILITY IDEOGRAPH-F985 +F986;ID # CJK COMPATIBILITY IDEOGRAPH-F986 +F987;ID # CJK COMPATIBILITY IDEOGRAPH-F987 +F988;ID # CJK COMPATIBILITY IDEOGRAPH-F988 +F989;ID # CJK COMPATIBILITY IDEOGRAPH-F989 +F98A;ID # CJK COMPATIBILITY IDEOGRAPH-F98A +F98B;ID # CJK COMPATIBILITY IDEOGRAPH-F98B +F98C;ID # CJK COMPATIBILITY IDEOGRAPH-F98C +F98D;ID # CJK COMPATIBILITY IDEOGRAPH-F98D +F98E;ID # CJK COMPATIBILITY IDEOGRAPH-F98E +F98F;ID # CJK COMPATIBILITY IDEOGRAPH-F98F +F990;ID # CJK COMPATIBILITY IDEOGRAPH-F990 +F991;ID # CJK COMPATIBILITY IDEOGRAPH-F991 +F992;ID # CJK COMPATIBILITY IDEOGRAPH-F992 +F993;ID # CJK COMPATIBILITY IDEOGRAPH-F993 +F994;ID # CJK COMPATIBILITY IDEOGRAPH-F994 +F995;ID # CJK COMPATIBILITY IDEOGRAPH-F995 +F996;ID # CJK COMPATIBILITY IDEOGRAPH-F996 +F997;ID # CJK COMPATIBILITY IDEOGRAPH-F997 +F998;ID # CJK COMPATIBILITY IDEOGRAPH-F998 +F999;ID # CJK COMPATIBILITY IDEOGRAPH-F999 +F99A;ID # CJK COMPATIBILITY IDEOGRAPH-F99A +F99B;ID # CJK COMPATIBILITY IDEOGRAPH-F99B +F99C;ID # CJK COMPATIBILITY IDEOGRAPH-F99C +F99D;ID # CJK COMPATIBILITY IDEOGRAPH-F99D +F99E;ID # CJK COMPATIBILITY IDEOGRAPH-F99E +F99F;ID # CJK COMPATIBILITY IDEOGRAPH-F99F +F9A0;ID # CJK COMPATIBILITY IDEOGRAPH-F9A0 +F9A1;ID # CJK COMPATIBILITY IDEOGRAPH-F9A1 +F9A2;ID # CJK COMPATIBILITY IDEOGRAPH-F9A2 +F9A3;ID # CJK COMPATIBILITY IDEOGRAPH-F9A3 +F9A4;ID # CJK COMPATIBILITY IDEOGRAPH-F9A4 +F9A5;ID # CJK COMPATIBILITY IDEOGRAPH-F9A5 +F9A6;ID # CJK COMPATIBILITY IDEOGRAPH-F9A6 +F9A7;ID # CJK COMPATIBILITY IDEOGRAPH-F9A7 +F9A8;ID # CJK COMPATIBILITY IDEOGRAPH-F9A8 +F9A9;ID # CJK COMPATIBILITY IDEOGRAPH-F9A9 +F9AA;ID # CJK COMPATIBILITY IDEOGRAPH-F9AA +F9AB;ID # CJK COMPATIBILITY IDEOGRAPH-F9AB +F9AC;ID # CJK COMPATIBILITY IDEOGRAPH-F9AC +F9AD;ID # CJK COMPATIBILITY IDEOGRAPH-F9AD +F9AE;ID # CJK COMPATIBILITY IDEOGRAPH-F9AE +F9AF;ID # CJK COMPATIBILITY IDEOGRAPH-F9AF +F9B0;ID # CJK COMPATIBILITY IDEOGRAPH-F9B0 +F9B1;ID # CJK COMPATIBILITY IDEOGRAPH-F9B1 +F9B2;ID # CJK COMPATIBILITY IDEOGRAPH-F9B2 +F9B3;ID # CJK COMPATIBILITY IDEOGRAPH-F9B3 +F9B4;ID # CJK COMPATIBILITY IDEOGRAPH-F9B4 +F9B5;ID # CJK COMPATIBILITY IDEOGRAPH-F9B5 +F9B6;ID # CJK COMPATIBILITY IDEOGRAPH-F9B6 +F9B7;ID # CJK COMPATIBILITY IDEOGRAPH-F9B7 +F9B8;ID # CJK COMPATIBILITY IDEOGRAPH-F9B8 +F9B9;ID # CJK COMPATIBILITY IDEOGRAPH-F9B9 +F9BA;ID # CJK COMPATIBILITY IDEOGRAPH-F9BA +F9BB;ID # CJK COMPATIBILITY IDEOGRAPH-F9BB +F9BC;ID # CJK COMPATIBILITY IDEOGRAPH-F9BC +F9BD;ID # CJK COMPATIBILITY IDEOGRAPH-F9BD +F9BE;ID # CJK COMPATIBILITY IDEOGRAPH-F9BE +F9BF;ID # CJK COMPATIBILITY IDEOGRAPH-F9BF +F9C0;ID # CJK COMPATIBILITY IDEOGRAPH-F9C0 +F9C1;ID # CJK COMPATIBILITY IDEOGRAPH-F9C1 +F9C2;ID # CJK COMPATIBILITY IDEOGRAPH-F9C2 +F9C3;ID # CJK COMPATIBILITY IDEOGRAPH-F9C3 +F9C4;ID # CJK COMPATIBILITY IDEOGRAPH-F9C4 +F9C5;ID # CJK COMPATIBILITY IDEOGRAPH-F9C5 +F9C6;ID # CJK COMPATIBILITY IDEOGRAPH-F9C6 +F9C7;ID # CJK COMPATIBILITY IDEOGRAPH-F9C7 +F9C8;ID # CJK COMPATIBILITY IDEOGRAPH-F9C8 +F9C9;ID # CJK COMPATIBILITY IDEOGRAPH-F9C9 +F9CA;ID # CJK COMPATIBILITY IDEOGRAPH-F9CA +F9CB;ID # CJK COMPATIBILITY IDEOGRAPH-F9CB +F9CC;ID # CJK COMPATIBILITY IDEOGRAPH-F9CC +F9CD;ID # CJK COMPATIBILITY IDEOGRAPH-F9CD +F9CE;ID # CJK COMPATIBILITY IDEOGRAPH-F9CE +F9CF;ID # CJK COMPATIBILITY IDEOGRAPH-F9CF +F9D0;ID # CJK COMPATIBILITY IDEOGRAPH-F9D0 +F9D1;ID # CJK COMPATIBILITY IDEOGRAPH-F9D1 +F9D2;ID # CJK COMPATIBILITY IDEOGRAPH-F9D2 +F9D3;ID # CJK COMPATIBILITY IDEOGRAPH-F9D3 +F9D4;ID # CJK COMPATIBILITY IDEOGRAPH-F9D4 +F9D5;ID # CJK COMPATIBILITY IDEOGRAPH-F9D5 +F9D6;ID # CJK COMPATIBILITY IDEOGRAPH-F9D6 +F9D7;ID # CJK COMPATIBILITY IDEOGRAPH-F9D7 +F9D8;ID # CJK COMPATIBILITY IDEOGRAPH-F9D8 +F9D9;ID # CJK COMPATIBILITY IDEOGRAPH-F9D9 +F9DA;ID # CJK COMPATIBILITY IDEOGRAPH-F9DA +F9DB;ID # CJK COMPATIBILITY IDEOGRAPH-F9DB +F9DC;ID # CJK COMPATIBILITY IDEOGRAPH-F9DC +F9DD;ID # CJK COMPATIBILITY IDEOGRAPH-F9DD +F9DE;ID # CJK COMPATIBILITY IDEOGRAPH-F9DE +F9DF;ID # CJK COMPATIBILITY IDEOGRAPH-F9DF +F9E0;ID # CJK COMPATIBILITY IDEOGRAPH-F9E0 +F9E1;ID # CJK COMPATIBILITY IDEOGRAPH-F9E1 +F9E2;ID # CJK COMPATIBILITY IDEOGRAPH-F9E2 +F9E3;ID # CJK COMPATIBILITY IDEOGRAPH-F9E3 +F9E4;ID # CJK COMPATIBILITY IDEOGRAPH-F9E4 +F9E5;ID # CJK COMPATIBILITY IDEOGRAPH-F9E5 +F9E6;ID # CJK COMPATIBILITY IDEOGRAPH-F9E6 +F9E7;ID # CJK COMPATIBILITY IDEOGRAPH-F9E7 +F9E8;ID # CJK COMPATIBILITY IDEOGRAPH-F9E8 +F9E9;ID # CJK COMPATIBILITY IDEOGRAPH-F9E9 +F9EA;ID # CJK COMPATIBILITY IDEOGRAPH-F9EA +F9EB;ID # CJK COMPATIBILITY IDEOGRAPH-F9EB +F9EC;ID # CJK COMPATIBILITY IDEOGRAPH-F9EC +F9ED;ID # CJK COMPATIBILITY IDEOGRAPH-F9ED +F9EE;ID # CJK COMPATIBILITY IDEOGRAPH-F9EE +F9EF;ID # CJK COMPATIBILITY IDEOGRAPH-F9EF +F9F0;ID # CJK COMPATIBILITY IDEOGRAPH-F9F0 +F9F1;ID # CJK COMPATIBILITY IDEOGRAPH-F9F1 +F9F2;ID # CJK COMPATIBILITY IDEOGRAPH-F9F2 +F9F3;ID # CJK COMPATIBILITY IDEOGRAPH-F9F3 +F9F4;ID # CJK COMPATIBILITY IDEOGRAPH-F9F4 +F9F5;ID # CJK COMPATIBILITY IDEOGRAPH-F9F5 +F9F6;ID # CJK COMPATIBILITY IDEOGRAPH-F9F6 +F9F7;ID # CJK COMPATIBILITY IDEOGRAPH-F9F7 +F9F8;ID # CJK COMPATIBILITY IDEOGRAPH-F9F8 +F9F9;ID # CJK COMPATIBILITY IDEOGRAPH-F9F9 +F9FA;ID # CJK COMPATIBILITY IDEOGRAPH-F9FA +F9FB;ID # CJK COMPATIBILITY IDEOGRAPH-F9FB +F9FC;ID # CJK COMPATIBILITY IDEOGRAPH-F9FC +F9FD;ID # CJK COMPATIBILITY IDEOGRAPH-F9FD +F9FE;ID # CJK COMPATIBILITY IDEOGRAPH-F9FE +F9FF;ID # CJK COMPATIBILITY IDEOGRAPH-F9FF +FA00;ID # CJK COMPATIBILITY IDEOGRAPH-FA00 +FA01;ID # CJK COMPATIBILITY IDEOGRAPH-FA01 +FA02;ID # CJK COMPATIBILITY IDEOGRAPH-FA02 +FA03;ID # CJK COMPATIBILITY IDEOGRAPH-FA03 +FA04;ID # CJK COMPATIBILITY IDEOGRAPH-FA04 +FA05;ID # CJK COMPATIBILITY IDEOGRAPH-FA05 +FA06;ID # CJK COMPATIBILITY IDEOGRAPH-FA06 +FA07;ID # CJK COMPATIBILITY IDEOGRAPH-FA07 +FA08;ID # CJK COMPATIBILITY IDEOGRAPH-FA08 +FA09;ID # CJK COMPATIBILITY IDEOGRAPH-FA09 +FA0A;ID # CJK COMPATIBILITY IDEOGRAPH-FA0A +FA0B;ID # CJK COMPATIBILITY IDEOGRAPH-FA0B +FA0C;ID # CJK COMPATIBILITY IDEOGRAPH-FA0C +FA0D;ID # CJK COMPATIBILITY IDEOGRAPH-FA0D +FA0E;ID # CJK COMPATIBILITY IDEOGRAPH-FA0E +FA0F;ID # CJK COMPATIBILITY IDEOGRAPH-FA0F +FA10;ID # CJK COMPATIBILITY IDEOGRAPH-FA10 +FA11;ID # CJK COMPATIBILITY IDEOGRAPH-FA11 +FA12;ID # CJK COMPATIBILITY IDEOGRAPH-FA12 +FA13;ID # CJK COMPATIBILITY IDEOGRAPH-FA13 +FA14;ID # CJK COMPATIBILITY IDEOGRAPH-FA14 +FA15;ID # CJK COMPATIBILITY IDEOGRAPH-FA15 +FA16;ID # CJK COMPATIBILITY IDEOGRAPH-FA16 +FA17;ID # CJK COMPATIBILITY IDEOGRAPH-FA17 +FA18;ID # CJK COMPATIBILITY IDEOGRAPH-FA18 +FA19;ID # CJK COMPATIBILITY IDEOGRAPH-FA19 +FA1A;ID # CJK COMPATIBILITY IDEOGRAPH-FA1A +FA1B;ID # CJK COMPATIBILITY IDEOGRAPH-FA1B +FA1C;ID # CJK COMPATIBILITY IDEOGRAPH-FA1C +FA1D;ID # CJK COMPATIBILITY IDEOGRAPH-FA1D +FA1E;ID # CJK COMPATIBILITY IDEOGRAPH-FA1E +FA1F;ID # CJK COMPATIBILITY IDEOGRAPH-FA1F +FA20;ID # CJK COMPATIBILITY IDEOGRAPH-FA20 +FA21;ID # CJK COMPATIBILITY IDEOGRAPH-FA21 +FA22;ID # CJK COMPATIBILITY IDEOGRAPH-FA22 +FA23;ID # CJK COMPATIBILITY IDEOGRAPH-FA23 +FA24;ID # CJK COMPATIBILITY IDEOGRAPH-FA24 +FA25;ID # CJK COMPATIBILITY IDEOGRAPH-FA25 +FA26;ID # CJK COMPATIBILITY IDEOGRAPH-FA26 +FA27;ID # CJK COMPATIBILITY IDEOGRAPH-FA27 +FA28;ID # CJK COMPATIBILITY IDEOGRAPH-FA28 +FA29;ID # CJK COMPATIBILITY IDEOGRAPH-FA29 +FA2A;ID # CJK COMPATIBILITY IDEOGRAPH-FA2A +FA2B;ID # CJK COMPATIBILITY IDEOGRAPH-FA2B +FA2C;ID # CJK COMPATIBILITY IDEOGRAPH-FA2C +FA2D;ID # CJK COMPATIBILITY IDEOGRAPH-FA2D +FA30;ID # CJK COMPATIBILITY IDEOGRAPH-FA30 +FA31;ID # CJK COMPATIBILITY IDEOGRAPH-FA31 +FA32;ID # CJK COMPATIBILITY IDEOGRAPH-FA32 +FA33;ID # CJK COMPATIBILITY IDEOGRAPH-FA33 +FA34;ID # CJK COMPATIBILITY IDEOGRAPH-FA34 +FA35;ID # CJK COMPATIBILITY IDEOGRAPH-FA35 +FA36;ID # CJK COMPATIBILITY IDEOGRAPH-FA36 +FA37;ID # CJK COMPATIBILITY IDEOGRAPH-FA37 +FA38;ID # CJK COMPATIBILITY IDEOGRAPH-FA38 +FA39;ID # CJK COMPATIBILITY IDEOGRAPH-FA39 +FA3A;ID # CJK COMPATIBILITY IDEOGRAPH-FA3A +FA3B;ID # CJK COMPATIBILITY IDEOGRAPH-FA3B +FA3C;ID # CJK COMPATIBILITY IDEOGRAPH-FA3C +FA3D;ID # CJK COMPATIBILITY IDEOGRAPH-FA3D +FA3E;ID # CJK COMPATIBILITY IDEOGRAPH-FA3E +FA3F;ID # CJK COMPATIBILITY IDEOGRAPH-FA3F +FA40;ID # CJK COMPATIBILITY IDEOGRAPH-FA40 +FA41;ID # CJK COMPATIBILITY IDEOGRAPH-FA41 +FA42;ID # CJK COMPATIBILITY IDEOGRAPH-FA42 +FA43;ID # CJK COMPATIBILITY IDEOGRAPH-FA43 +FA44;ID # CJK COMPATIBILITY IDEOGRAPH-FA44 +FA45;ID # CJK COMPATIBILITY IDEOGRAPH-FA45 +FA46;ID # CJK COMPATIBILITY IDEOGRAPH-FA46 +FA47;ID # CJK COMPATIBILITY IDEOGRAPH-FA47 +FA48;ID # CJK COMPATIBILITY IDEOGRAPH-FA48 +FA49;ID # CJK COMPATIBILITY IDEOGRAPH-FA49 +FA4A;ID # CJK COMPATIBILITY IDEOGRAPH-FA4A +FA4B;ID # CJK COMPATIBILITY IDEOGRAPH-FA4B +FA4C;ID # CJK COMPATIBILITY IDEOGRAPH-FA4C +FA4D;ID # CJK COMPATIBILITY IDEOGRAPH-FA4D +FA4E;ID # CJK COMPATIBILITY IDEOGRAPH-FA4E +FA4F;ID # CJK COMPATIBILITY IDEOGRAPH-FA4F +FA50;ID # CJK COMPATIBILITY IDEOGRAPH-FA50 +FA51;ID # CJK COMPATIBILITY IDEOGRAPH-FA51 +FA52;ID # CJK COMPATIBILITY IDEOGRAPH-FA52 +FA53;ID # CJK COMPATIBILITY IDEOGRAPH-FA53 +FA54;ID # CJK COMPATIBILITY IDEOGRAPH-FA54 +FA55;ID # CJK COMPATIBILITY IDEOGRAPH-FA55 +FA56;ID # CJK COMPATIBILITY IDEOGRAPH-FA56 +FA57;ID # CJK COMPATIBILITY IDEOGRAPH-FA57 +FA58;ID # CJK COMPATIBILITY IDEOGRAPH-FA58 +FA59;ID # CJK COMPATIBILITY IDEOGRAPH-FA59 +FA5A;ID # CJK COMPATIBILITY IDEOGRAPH-FA5A +FA5B;ID # CJK COMPATIBILITY IDEOGRAPH-FA5B +FA5C;ID # CJK COMPATIBILITY IDEOGRAPH-FA5C +FA5D;ID # CJK COMPATIBILITY IDEOGRAPH-FA5D +FA5E;ID # CJK COMPATIBILITY IDEOGRAPH-FA5E +FA5F;ID # CJK COMPATIBILITY IDEOGRAPH-FA5F +FA60;ID # CJK COMPATIBILITY IDEOGRAPH-FA60 +FA61;ID # CJK COMPATIBILITY IDEOGRAPH-FA61 +FA62;ID # CJK COMPATIBILITY IDEOGRAPH-FA62 +FA63;ID # CJK COMPATIBILITY IDEOGRAPH-FA63 +FA64;ID # CJK COMPATIBILITY IDEOGRAPH-FA64 +FA65;ID # CJK COMPATIBILITY IDEOGRAPH-FA65 +FA66;ID # CJK COMPATIBILITY IDEOGRAPH-FA66 +FA67;ID # CJK COMPATIBILITY IDEOGRAPH-FA67 +FA68;ID # CJK COMPATIBILITY IDEOGRAPH-FA68 +FA69;ID # CJK COMPATIBILITY IDEOGRAPH-FA69 +FA6A;ID # CJK COMPATIBILITY IDEOGRAPH-FA6A +FB00;AL # LATIN SMALL LIGATURE FF +FB01;AL # LATIN SMALL LIGATURE FI +FB02;AL # LATIN SMALL LIGATURE FL +FB03;AL # LATIN SMALL LIGATURE FFI +FB04;AL # LATIN SMALL LIGATURE FFL +FB05;AL # LATIN SMALL LIGATURE LONG S T +FB06;AL # LATIN SMALL LIGATURE ST +FB13;AL # ARMENIAN SMALL LIGATURE MEN NOW +FB14;AL # ARMENIAN SMALL LIGATURE MEN ECH +FB15;AL # ARMENIAN SMALL LIGATURE MEN INI +FB16;AL # ARMENIAN SMALL LIGATURE VEW NOW +FB17;AL # ARMENIAN SMALL LIGATURE MEN XEH +FB1D;AL # HEBREW LETTER YOD WITH HIRIQ +FB1E;CM # HEBREW POINT JUDEO-SPANISH VARIKA +FB1F;AL # HEBREW LIGATURE YIDDISH YOD YOD PATAH +FB20;AL # HEBREW LETTER ALTERNATIVE AYIN +FB21;AL # HEBREW LETTER WIDE ALEF +FB22;AL # HEBREW LETTER WIDE DALET +FB23;AL # HEBREW LETTER WIDE HE +FB24;AL # HEBREW LETTER WIDE KAF +FB25;AL # HEBREW LETTER WIDE LAMED +FB26;AL # HEBREW LETTER WIDE FINAL MEM +FB27;AL # HEBREW LETTER WIDE RESH +FB28;AL # HEBREW LETTER WIDE TAV +FB29;AL # HEBREW LETTER ALTERNATIVE PLUS SIGN +FB2A;AL # HEBREW LETTER SHIN WITH SHIN DOT +FB2B;AL # HEBREW LETTER SHIN WITH SIN DOT +FB2C;AL # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT +FB2D;AL # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT +FB2E;AL # HEBREW LETTER ALEF WITH PATAH +FB2F;AL # HEBREW LETTER ALEF WITH QAMATS +FB30;AL # HEBREW LETTER ALEF WITH MAPIQ +FB31;AL # HEBREW LETTER BET WITH DAGESH +FB32;AL # HEBREW LETTER GIMEL WITH DAGESH +FB33;AL # HEBREW LETTER DALET WITH DAGESH +FB34;AL # HEBREW LETTER HE WITH MAPIQ +FB35;AL # HEBREW LETTER VAV WITH DAGESH +FB36;AL # HEBREW LETTER ZAYIN WITH DAGESH +FB38;AL # HEBREW LETTER TET WITH DAGESH +FB39;AL # HEBREW LETTER YOD WITH DAGESH +FB3A;AL # HEBREW LETTER FINAL KAF WITH DAGESH +FB3B;AL # HEBREW LETTER KAF WITH DAGESH +FB3C;AL # HEBREW LETTER LAMED WITH DAGESH +FB3E;AL # HEBREW LETTER MEM WITH DAGESH +FB40;AL # HEBREW LETTER NUN WITH DAGESH +FB41;AL # HEBREW LETTER SAMEKH WITH DAGESH +FB43;AL # HEBREW LETTER FINAL PE WITH DAGESH +FB44;AL # HEBREW LETTER PE WITH DAGESH +FB46;AL # HEBREW LETTER TSADI WITH DAGESH +FB47;AL # HEBREW LETTER QOF WITH DAGESH +FB48;AL # HEBREW LETTER RESH WITH DAGESH +FB49;AL # HEBREW LETTER SHIN WITH DAGESH +FB4A;AL # HEBREW LETTER TAV WITH DAGESH +FB4B;AL # HEBREW LETTER VAV WITH HOLAM +FB4C;AL # HEBREW LETTER BET WITH RAFE +FB4D;AL # HEBREW LETTER KAF WITH RAFE +FB4E;AL # HEBREW LETTER PE WITH RAFE +FB4F;AL # HEBREW LIGATURE ALEF LAMED +FB50;AL # ARABIC LETTER ALEF WASLA ISOLATED FORM +FB51;AL # ARABIC LETTER ALEF WASLA FINAL FORM +FB52;AL # ARABIC LETTER BEEH ISOLATED FORM +FB53;AL # ARABIC LETTER BEEH FINAL FORM +FB54;AL # ARABIC LETTER BEEH INITIAL FORM +FB55;AL # ARABIC LETTER BEEH MEDIAL FORM +FB56;AL # ARABIC LETTER PEH ISOLATED FORM +FB57;AL # ARABIC LETTER PEH FINAL FORM +FB58;AL # ARABIC LETTER PEH INITIAL FORM +FB59;AL # ARABIC LETTER PEH MEDIAL FORM +FB5A;AL # ARABIC LETTER BEHEH ISOLATED FORM +FB5B;AL # ARABIC LETTER BEHEH FINAL FORM +FB5C;AL # ARABIC LETTER BEHEH INITIAL FORM +FB5D;AL # ARABIC LETTER BEHEH MEDIAL FORM +FB5E;AL # ARABIC LETTER TTEHEH ISOLATED FORM +FB5F;AL # ARABIC LETTER TTEHEH FINAL FORM +FB60;AL # ARABIC LETTER TTEHEH INITIAL FORM +FB61;AL # ARABIC LETTER TTEHEH MEDIAL FORM +FB62;AL # ARABIC LETTER TEHEH ISOLATED FORM +FB63;AL # ARABIC LETTER TEHEH FINAL FORM +FB64;AL # ARABIC LETTER TEHEH INITIAL FORM +FB65;AL # ARABIC LETTER TEHEH MEDIAL FORM +FB66;AL # ARABIC LETTER TTEH ISOLATED FORM +FB67;AL # ARABIC LETTER TTEH FINAL FORM +FB68;AL # ARABIC LETTER TTEH INITIAL FORM +FB69;AL # ARABIC LETTER TTEH MEDIAL FORM +FB6A;AL # ARABIC LETTER VEH ISOLATED FORM +FB6B;AL # ARABIC LETTER VEH FINAL FORM +FB6C;AL # ARABIC LETTER VEH INITIAL FORM +FB6D;AL # ARABIC LETTER VEH MEDIAL FORM +FB6E;AL # ARABIC LETTER PEHEH ISOLATED FORM +FB6F;AL # ARABIC LETTER PEHEH FINAL FORM +FB70;AL # ARABIC LETTER PEHEH INITIAL FORM +FB71;AL # ARABIC LETTER PEHEH MEDIAL FORM +FB72;AL # ARABIC LETTER DYEH ISOLATED FORM +FB73;AL # ARABIC LETTER DYEH FINAL FORM +FB74;AL # ARABIC LETTER DYEH INITIAL FORM +FB75;AL # ARABIC LETTER DYEH MEDIAL FORM +FB76;AL # ARABIC LETTER NYEH ISOLATED FORM +FB77;AL # ARABIC LETTER NYEH FINAL FORM +FB78;AL # ARABIC LETTER NYEH INITIAL FORM +FB79;AL # ARABIC LETTER NYEH MEDIAL FORM +FB7A;AL # ARABIC LETTER TCHEH ISOLATED FORM +FB7B;AL # ARABIC LETTER TCHEH FINAL FORM +FB7C;AL # ARABIC LETTER TCHEH INITIAL FORM +FB7D;AL # ARABIC LETTER TCHEH MEDIAL FORM +FB7E;AL # ARABIC LETTER TCHEHEH ISOLATED FORM +FB7F;AL # ARABIC LETTER TCHEHEH FINAL FORM +FB80;AL # ARABIC LETTER TCHEHEH INITIAL FORM +FB81;AL # ARABIC LETTER TCHEHEH MEDIAL FORM +FB82;AL # ARABIC LETTER DDAHAL ISOLATED FORM +FB83;AL # ARABIC LETTER DDAHAL FINAL FORM +FB84;AL # ARABIC LETTER DAHAL ISOLATED FORM +FB85;AL # ARABIC LETTER DAHAL FINAL FORM +FB86;AL # ARABIC LETTER DUL ISOLATED FORM +FB87;AL # ARABIC LETTER DUL FINAL FORM +FB88;AL # ARABIC LETTER DDAL ISOLATED FORM +FB89;AL # ARABIC LETTER DDAL FINAL FORM +FB8A;AL # ARABIC LETTER JEH ISOLATED FORM +FB8B;AL # ARABIC LETTER JEH FINAL FORM +FB8C;AL # ARABIC LETTER RREH ISOLATED FORM +FB8D;AL # ARABIC LETTER RREH FINAL FORM +FB8E;AL # ARABIC LETTER KEHEH ISOLATED FORM +FB8F;AL # ARABIC LETTER KEHEH FINAL FORM +FB90;AL # ARABIC LETTER KEHEH INITIAL FORM +FB91;AL # ARABIC LETTER KEHEH MEDIAL FORM +FB92;AL # ARABIC LETTER GAF ISOLATED FORM +FB93;AL # ARABIC LETTER GAF FINAL FORM +FB94;AL # ARABIC LETTER GAF INITIAL FORM +FB95;AL # ARABIC LETTER GAF MEDIAL FORM +FB96;AL # ARABIC LETTER GUEH ISOLATED FORM +FB97;AL # ARABIC LETTER GUEH FINAL FORM +FB98;AL # ARABIC LETTER GUEH INITIAL FORM +FB99;AL # ARABIC LETTER GUEH MEDIAL FORM +FB9A;AL # ARABIC LETTER NGOEH ISOLATED FORM +FB9B;AL # ARABIC LETTER NGOEH FINAL FORM +FB9C;AL # ARABIC LETTER NGOEH INITIAL FORM +FB9D;AL # ARABIC LETTER NGOEH MEDIAL FORM +FB9E;AL # ARABIC LETTER NOON GHUNNA ISOLATED FORM +FB9F;AL # ARABIC LETTER NOON GHUNNA FINAL FORM +FBA0;AL # ARABIC LETTER RNOON ISOLATED FORM +FBA1;AL # ARABIC LETTER RNOON FINAL FORM +FBA2;AL # ARABIC LETTER RNOON INITIAL FORM +FBA3;AL # ARABIC LETTER RNOON MEDIAL FORM +FBA4;AL # ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM +FBA5;AL # ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM +FBA6;AL # ARABIC LETTER HEH GOAL ISOLATED FORM +FBA7;AL # ARABIC LETTER HEH GOAL FINAL FORM +FBA8;AL # ARABIC LETTER HEH GOAL INITIAL FORM +FBA9;AL # ARABIC LETTER HEH GOAL MEDIAL FORM +FBAA;AL # ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM +FBAB;AL # ARABIC LETTER HEH DOACHASHMEE FINAL FORM +FBAC;AL # ARABIC LETTER HEH DOACHASHMEE INITIAL FORM +FBAD;AL # ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM +FBAE;AL # ARABIC LETTER YEH BARREE ISOLATED FORM +FBAF;AL # ARABIC LETTER YEH BARREE FINAL FORM +FBB0;AL # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM +FBB1;AL # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBD3;AL # ARABIC LETTER NG ISOLATED FORM +FBD4;AL # ARABIC LETTER NG FINAL FORM +FBD5;AL # ARABIC LETTER NG INITIAL FORM +FBD6;AL # ARABIC LETTER NG MEDIAL FORM +FBD7;AL # ARABIC LETTER U ISOLATED FORM +FBD8;AL # ARABIC LETTER U FINAL FORM +FBD9;AL # ARABIC LETTER OE ISOLATED FORM +FBDA;AL # ARABIC LETTER OE FINAL FORM +FBDB;AL # ARABIC LETTER YU ISOLATED FORM +FBDC;AL # ARABIC LETTER YU FINAL FORM +FBDD;AL # ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM +FBDE;AL # ARABIC LETTER VE ISOLATED FORM +FBDF;AL # ARABIC LETTER VE FINAL FORM +FBE0;AL # ARABIC LETTER KIRGHIZ OE ISOLATED FORM +FBE1;AL # ARABIC LETTER KIRGHIZ OE FINAL FORM +FBE2;AL # ARABIC LETTER KIRGHIZ YU ISOLATED FORM +FBE3;AL # ARABIC LETTER KIRGHIZ YU FINAL FORM +FBE4;AL # ARABIC LETTER E ISOLATED FORM +FBE5;AL # ARABIC LETTER E FINAL FORM +FBE6;AL # ARABIC LETTER E INITIAL FORM +FBE7;AL # ARABIC LETTER E MEDIAL FORM +FBE8;AL # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM +FBE9;AL # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM +FBEA;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM +FBEB;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM +FBEC;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM +FBED;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM +FBEE;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM +FBEF;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM +FBF0;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM +FBF1;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM +FBF2;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM +FBF3;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM +FBF4;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM +FBF5;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM +FBF6;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM +FBF7;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM +FBF8;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM +FBF9;AL # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM +FBFA;AL # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM +FBFB;AL # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM +FBFC;AL # ARABIC LETTER FARSI YEH ISOLATED FORM +FBFD;AL # ARABIC LETTER FARSI YEH FINAL FORM +FBFE;AL # ARABIC LETTER FARSI YEH INITIAL FORM +FBFF;AL # ARABIC LETTER FARSI YEH MEDIAL FORM +FC00;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM +FC01;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM +FC02;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM +FC03;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM +FC04;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM +FC05;AL # ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM +FC06;AL # ARABIC LIGATURE BEH WITH HAH ISOLATED FORM +FC07;AL # ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM +FC08;AL # ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM +FC09;AL # ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM +FC0A;AL # ARABIC LIGATURE BEH WITH YEH ISOLATED FORM +FC0B;AL # ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM +FC0C;AL # ARABIC LIGATURE TEH WITH HAH ISOLATED FORM +FC0D;AL # ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM +FC0E;AL # ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM +FC0F;AL # ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM +FC10;AL # ARABIC LIGATURE TEH WITH YEH ISOLATED FORM +FC11;AL # ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM +FC12;AL # ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM +FC13;AL # ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM +FC14;AL # ARABIC LIGATURE THEH WITH YEH ISOLATED FORM +FC15;AL # ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM +FC16;AL # ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM +FC17;AL # ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM +FC18;AL # ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM +FC19;AL # ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM +FC1A;AL # ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM +FC1B;AL # ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM +FC1C;AL # ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM +FC1D;AL # ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM +FC1E;AL # ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM +FC1F;AL # ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM +FC20;AL # ARABIC LIGATURE SAD WITH HAH ISOLATED FORM +FC21;AL # ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM +FC22;AL # ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM +FC23;AL # ARABIC LIGATURE DAD WITH HAH ISOLATED FORM +FC24;AL # ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM +FC25;AL # ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM +FC26;AL # ARABIC LIGATURE TAH WITH HAH ISOLATED FORM +FC27;AL # ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM +FC28;AL # ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM +FC29;AL # ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM +FC2A;AL # ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM +FC2B;AL # ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM +FC2C;AL # ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM +FC2D;AL # ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM +FC2E;AL # ARABIC LIGATURE FEH WITH HAH ISOLATED FORM +FC2F;AL # ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM +FC30;AL # ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM +FC31;AL # ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM +FC32;AL # ARABIC LIGATURE FEH WITH YEH ISOLATED FORM +FC33;AL # ARABIC LIGATURE QAF WITH HAH ISOLATED FORM +FC34;AL # ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM +FC35;AL # ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM +FC36;AL # ARABIC LIGATURE QAF WITH YEH ISOLATED FORM +FC37;AL # ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM +FC38;AL # ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM +FC39;AL # ARABIC LIGATURE KAF WITH HAH ISOLATED FORM +FC3A;AL # ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM +FC3B;AL # ARABIC LIGATURE KAF WITH LAM ISOLATED FORM +FC3C;AL # ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM +FC3D;AL # ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM +FC3E;AL # ARABIC LIGATURE KAF WITH YEH ISOLATED FORM +FC3F;AL # ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM +FC40;AL # ARABIC LIGATURE LAM WITH HAH ISOLATED FORM +FC41;AL # ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM +FC42;AL # ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM +FC43;AL # ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM +FC44;AL # ARABIC LIGATURE LAM WITH YEH ISOLATED FORM +FC45;AL # ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM +FC46;AL # ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM +FC47;AL # ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM +FC48;AL # ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM +FC49;AL # ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM +FC4A;AL # ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM +FC4B;AL # ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM +FC4C;AL # ARABIC LIGATURE NOON WITH HAH ISOLATED FORM +FC4D;AL # ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM +FC4E;AL # ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM +FC4F;AL # ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM +FC50;AL # ARABIC LIGATURE NOON WITH YEH ISOLATED FORM +FC51;AL # ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM +FC52;AL # ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM +FC53;AL # ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM +FC54;AL # ARABIC LIGATURE HEH WITH YEH ISOLATED FORM +FC55;AL # ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM +FC56;AL # ARABIC LIGATURE YEH WITH HAH ISOLATED FORM +FC57;AL # ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM +FC58;AL # ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM +FC59;AL # ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM +FC5A;AL # ARABIC LIGATURE YEH WITH YEH ISOLATED FORM +FC5B;AL # ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM +FC5C;AL # ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM +FC5D;AL # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM +FC5E;AL # ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM +FC5F;AL # ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM +FC60;AL # ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM +FC61;AL # ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM +FC62;AL # ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM +FC63;AL # ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM +FC64;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM +FC65;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM +FC66;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM +FC67;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM +FC68;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM +FC69;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM +FC6A;AL # ARABIC LIGATURE BEH WITH REH FINAL FORM +FC6B;AL # ARABIC LIGATURE BEH WITH ZAIN FINAL FORM +FC6C;AL # ARABIC LIGATURE BEH WITH MEEM FINAL FORM +FC6D;AL # ARABIC LIGATURE BEH WITH NOON FINAL FORM +FC6E;AL # ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM +FC6F;AL # ARABIC LIGATURE BEH WITH YEH FINAL FORM +FC70;AL # ARABIC LIGATURE TEH WITH REH FINAL FORM +FC71;AL # ARABIC LIGATURE TEH WITH ZAIN FINAL FORM +FC72;AL # ARABIC LIGATURE TEH WITH MEEM FINAL FORM +FC73;AL # ARABIC LIGATURE TEH WITH NOON FINAL FORM +FC74;AL # ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM +FC75;AL # ARABIC LIGATURE TEH WITH YEH FINAL FORM +FC76;AL # ARABIC LIGATURE THEH WITH REH FINAL FORM +FC77;AL # ARABIC LIGATURE THEH WITH ZAIN FINAL FORM +FC78;AL # ARABIC LIGATURE THEH WITH MEEM FINAL FORM +FC79;AL # ARABIC LIGATURE THEH WITH NOON FINAL FORM +FC7A;AL # ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM +FC7B;AL # ARABIC LIGATURE THEH WITH YEH FINAL FORM +FC7C;AL # ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM +FC7D;AL # ARABIC LIGATURE FEH WITH YEH FINAL FORM +FC7E;AL # ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM +FC7F;AL # ARABIC LIGATURE QAF WITH YEH FINAL FORM +FC80;AL # ARABIC LIGATURE KAF WITH ALEF FINAL FORM +FC81;AL # ARABIC LIGATURE KAF WITH LAM FINAL FORM +FC82;AL # ARABIC LIGATURE KAF WITH MEEM FINAL FORM +FC83;AL # ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM +FC84;AL # ARABIC LIGATURE KAF WITH YEH FINAL FORM +FC85;AL # ARABIC LIGATURE LAM WITH MEEM FINAL FORM +FC86;AL # ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM +FC87;AL # ARABIC LIGATURE LAM WITH YEH FINAL FORM +FC88;AL # ARABIC LIGATURE MEEM WITH ALEF FINAL FORM +FC89;AL # ARABIC LIGATURE MEEM WITH MEEM FINAL FORM +FC8A;AL # ARABIC LIGATURE NOON WITH REH FINAL FORM +FC8B;AL # ARABIC LIGATURE NOON WITH ZAIN FINAL FORM +FC8C;AL # ARABIC LIGATURE NOON WITH MEEM FINAL FORM +FC8D;AL # ARABIC LIGATURE NOON WITH NOON FINAL FORM +FC8E;AL # ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM +FC8F;AL # ARABIC LIGATURE NOON WITH YEH FINAL FORM +FC90;AL # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM +FC91;AL # ARABIC LIGATURE YEH WITH REH FINAL FORM +FC92;AL # ARABIC LIGATURE YEH WITH ZAIN FINAL FORM +FC93;AL # ARABIC LIGATURE YEH WITH MEEM FINAL FORM +FC94;AL # ARABIC LIGATURE YEH WITH NOON FINAL FORM +FC95;AL # ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM +FC96;AL # ARABIC LIGATURE YEH WITH YEH FINAL FORM +FC97;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM +FC98;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM +FC99;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM +FC9A;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM +FC9B;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM +FC9C;AL # ARABIC LIGATURE BEH WITH JEEM INITIAL FORM +FC9D;AL # ARABIC LIGATURE BEH WITH HAH INITIAL FORM +FC9E;AL # ARABIC LIGATURE BEH WITH KHAH INITIAL FORM +FC9F;AL # ARABIC LIGATURE BEH WITH MEEM INITIAL FORM +FCA0;AL # ARABIC LIGATURE BEH WITH HEH INITIAL FORM +FCA1;AL # ARABIC LIGATURE TEH WITH JEEM INITIAL FORM +FCA2;AL # ARABIC LIGATURE TEH WITH HAH INITIAL FORM +FCA3;AL # ARABIC LIGATURE TEH WITH KHAH INITIAL FORM +FCA4;AL # ARABIC LIGATURE TEH WITH MEEM INITIAL FORM +FCA5;AL # ARABIC LIGATURE TEH WITH HEH INITIAL FORM +FCA6;AL # ARABIC LIGATURE THEH WITH MEEM INITIAL FORM +FCA7;AL # ARABIC LIGATURE JEEM WITH HAH INITIAL FORM +FCA8;AL # ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM +FCA9;AL # ARABIC LIGATURE HAH WITH JEEM INITIAL FORM +FCAA;AL # ARABIC LIGATURE HAH WITH MEEM INITIAL FORM +FCAB;AL # ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM +FCAC;AL # ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM +FCAD;AL # ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM +FCAE;AL # ARABIC LIGATURE SEEN WITH HAH INITIAL FORM +FCAF;AL # ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM +FCB0;AL # ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM +FCB1;AL # ARABIC LIGATURE SAD WITH HAH INITIAL FORM +FCB2;AL # ARABIC LIGATURE SAD WITH KHAH INITIAL FORM +FCB3;AL # ARABIC LIGATURE SAD WITH MEEM INITIAL FORM +FCB4;AL # ARABIC LIGATURE DAD WITH JEEM INITIAL FORM +FCB5;AL # ARABIC LIGATURE DAD WITH HAH INITIAL FORM +FCB6;AL # ARABIC LIGATURE DAD WITH KHAH INITIAL FORM +FCB7;AL # ARABIC LIGATURE DAD WITH MEEM INITIAL FORM +FCB8;AL # ARABIC LIGATURE TAH WITH HAH INITIAL FORM +FCB9;AL # ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM +FCBA;AL # ARABIC LIGATURE AIN WITH JEEM INITIAL FORM +FCBB;AL # ARABIC LIGATURE AIN WITH MEEM INITIAL FORM +FCBC;AL # ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM +FCBD;AL # ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM +FCBE;AL # ARABIC LIGATURE FEH WITH JEEM INITIAL FORM +FCBF;AL # ARABIC LIGATURE FEH WITH HAH INITIAL FORM +FCC0;AL # ARABIC LIGATURE FEH WITH KHAH INITIAL FORM +FCC1;AL # ARABIC LIGATURE FEH WITH MEEM INITIAL FORM +FCC2;AL # ARABIC LIGATURE QAF WITH HAH INITIAL FORM +FCC3;AL # ARABIC LIGATURE QAF WITH MEEM INITIAL FORM +FCC4;AL # ARABIC LIGATURE KAF WITH JEEM INITIAL FORM +FCC5;AL # ARABIC LIGATURE KAF WITH HAH INITIAL FORM +FCC6;AL # ARABIC LIGATURE KAF WITH KHAH INITIAL FORM +FCC7;AL # ARABIC LIGATURE KAF WITH LAM INITIAL FORM +FCC8;AL # ARABIC LIGATURE KAF WITH MEEM INITIAL FORM +FCC9;AL # ARABIC LIGATURE LAM WITH JEEM INITIAL FORM +FCCA;AL # ARABIC LIGATURE LAM WITH HAH INITIAL FORM +FCCB;AL # ARABIC LIGATURE LAM WITH KHAH INITIAL FORM +FCCC;AL # ARABIC LIGATURE LAM WITH MEEM INITIAL FORM +FCCD;AL # ARABIC LIGATURE LAM WITH HEH INITIAL FORM +FCCE;AL # ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM +FCCF;AL # ARABIC LIGATURE MEEM WITH HAH INITIAL FORM +FCD0;AL # ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM +FCD1;AL # ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM +FCD2;AL # ARABIC LIGATURE NOON WITH JEEM INITIAL FORM +FCD3;AL # ARABIC LIGATURE NOON WITH HAH INITIAL FORM +FCD4;AL # ARABIC LIGATURE NOON WITH KHAH INITIAL FORM +FCD5;AL # ARABIC LIGATURE NOON WITH MEEM INITIAL FORM +FCD6;AL # ARABIC LIGATURE NOON WITH HEH INITIAL FORM +FCD7;AL # ARABIC LIGATURE HEH WITH JEEM INITIAL FORM +FCD8;AL # ARABIC LIGATURE HEH WITH MEEM INITIAL FORM +FCD9;AL # ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM +FCDA;AL # ARABIC LIGATURE YEH WITH JEEM INITIAL FORM +FCDB;AL # ARABIC LIGATURE YEH WITH HAH INITIAL FORM +FCDC;AL # ARABIC LIGATURE YEH WITH KHAH INITIAL FORM +FCDD;AL # ARABIC LIGATURE YEH WITH MEEM INITIAL FORM +FCDE;AL # ARABIC LIGATURE YEH WITH HEH INITIAL FORM +FCDF;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM +FCE0;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM +FCE1;AL # ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM +FCE2;AL # ARABIC LIGATURE BEH WITH HEH MEDIAL FORM +FCE3;AL # ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM +FCE4;AL # ARABIC LIGATURE TEH WITH HEH MEDIAL FORM +FCE5;AL # ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM +FCE6;AL # ARABIC LIGATURE THEH WITH HEH MEDIAL FORM +FCE7;AL # ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM +FCE8;AL # ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM +FCE9;AL # ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM +FCEA;AL # ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM +FCEB;AL # ARABIC LIGATURE KAF WITH LAM MEDIAL FORM +FCEC;AL # ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM +FCED;AL # ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM +FCEE;AL # ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM +FCEF;AL # ARABIC LIGATURE NOON WITH HEH MEDIAL FORM +FCF0;AL # ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM +FCF1;AL # ARABIC LIGATURE YEH WITH HEH MEDIAL FORM +FCF2;AL # ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM +FCF3;AL # ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM +FCF4;AL # ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM +FCF5;AL # ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM +FCF6;AL # ARABIC LIGATURE TAH WITH YEH ISOLATED FORM +FCF7;AL # ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM +FCF8;AL # ARABIC LIGATURE AIN WITH YEH ISOLATED FORM +FCF9;AL # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM +FCFA;AL # ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM +FCFB;AL # ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM +FCFC;AL # ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM +FCFD;AL # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM +FCFE;AL # ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM +FCFF;AL # ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM +FD00;AL # ARABIC LIGATURE HAH WITH YEH ISOLATED FORM +FD01;AL # ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM +FD02;AL # ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM +FD03;AL # ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM +FD04;AL # ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM +FD05;AL # ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM +FD06;AL # ARABIC LIGATURE SAD WITH YEH ISOLATED FORM +FD07;AL # ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM +FD08;AL # ARABIC LIGATURE DAD WITH YEH ISOLATED FORM +FD09;AL # ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM +FD0A;AL # ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM +FD0B;AL # ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM +FD0C;AL # ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM +FD0D;AL # ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM +FD0E;AL # ARABIC LIGATURE SEEN WITH REH ISOLATED FORM +FD0F;AL # ARABIC LIGATURE SAD WITH REH ISOLATED FORM +FD10;AL # ARABIC LIGATURE DAD WITH REH ISOLATED FORM +FD11;AL # ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM +FD12;AL # ARABIC LIGATURE TAH WITH YEH FINAL FORM +FD13;AL # ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM +FD14;AL # ARABIC LIGATURE AIN WITH YEH FINAL FORM +FD15;AL # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM +FD16;AL # ARABIC LIGATURE GHAIN WITH YEH FINAL FORM +FD17;AL # ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM +FD18;AL # ARABIC LIGATURE SEEN WITH YEH FINAL FORM +FD19;AL # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM +FD1A;AL # ARABIC LIGATURE SHEEN WITH YEH FINAL FORM +FD1B;AL # ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM +FD1C;AL # ARABIC LIGATURE HAH WITH YEH FINAL FORM +FD1D;AL # ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM +FD1E;AL # ARABIC LIGATURE JEEM WITH YEH FINAL FORM +FD1F;AL # ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM +FD20;AL # ARABIC LIGATURE KHAH WITH YEH FINAL FORM +FD21;AL # ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM +FD22;AL # ARABIC LIGATURE SAD WITH YEH FINAL FORM +FD23;AL # ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM +FD24;AL # ARABIC LIGATURE DAD WITH YEH FINAL FORM +FD25;AL # ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM +FD26;AL # ARABIC LIGATURE SHEEN WITH HAH FINAL FORM +FD27;AL # ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM +FD28;AL # ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM +FD29;AL # ARABIC LIGATURE SHEEN WITH REH FINAL FORM +FD2A;AL # ARABIC LIGATURE SEEN WITH REH FINAL FORM +FD2B;AL # ARABIC LIGATURE SAD WITH REH FINAL FORM +FD2C;AL # ARABIC LIGATURE DAD WITH REH FINAL FORM +FD2D;AL # ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM +FD2E;AL # ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM +FD2F;AL # ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM +FD30;AL # ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM +FD31;AL # ARABIC LIGATURE SEEN WITH HEH INITIAL FORM +FD32;AL # ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM +FD33;AL # ARABIC LIGATURE TAH WITH MEEM INITIAL FORM +FD34;AL # ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM +FD35;AL # ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM +FD36;AL # ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM +FD37;AL # ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM +FD38;AL # ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM +FD39;AL # ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM +FD3A;AL # ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM +FD3B;AL # ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM +FD3C;AL # ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM +FD3D;AL # ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD3E;OP # ORNATE LEFT PARENTHESIS +FD3F;CL # ORNATE RIGHT PARENTHESIS +FD50;AL # ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM +FD51;AL # ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM +FD52;AL # ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM +FD53;AL # ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM +FD54;AL # ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM +FD55;AL # ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM +FD56;AL # ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM +FD57;AL # ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM +FD58;AL # ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM +FD59;AL # ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM +FD5A;AL # ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM +FD5B;AL # ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD5C;AL # ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM +FD5D;AL # ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM +FD5E;AL # ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM +FD5F;AL # ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM +FD60;AL # ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM +FD61;AL # ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM +FD62;AL # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM +FD63;AL # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM +FD64;AL # ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM +FD65;AL # ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM +FD66;AL # ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM +FD67;AL # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM +FD68;AL # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM +FD69;AL # ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM +FD6A;AL # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM +FD6B;AL # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM +FD6C;AL # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM +FD6D;AL # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM +FD6E;AL # ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM +FD6F;AL # ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM +FD70;AL # ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM +FD71;AL # ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM +FD72;AL # ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM +FD73;AL # ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM +FD74;AL # ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM +FD75;AL # ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM +FD76;AL # ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM +FD77;AL # ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM +FD78;AL # ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD79;AL # ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM +FD7A;AL # ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM +FD7B;AL # ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD7C;AL # ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM +FD7D;AL # ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM +FD7E;AL # ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM +FD7F;AL # ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM +FD80;AL # ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM +FD81;AL # ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM +FD82;AL # ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM +FD83;AL # ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM +FD84;AL # ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM +FD85;AL # ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM +FD86;AL # ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM +FD87;AL # ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM +FD88;AL # ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM +FD89;AL # ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM +FD8A;AL # ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM +FD8B;AL # ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM +FD8C;AL # ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM +FD8D;AL # ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM +FD8E;AL # ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM +FD8F;AL # ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD92;AL # ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM +FD93;AL # ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM +FD94;AL # ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM +FD95;AL # ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM +FD96;AL # ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM +FD97;AL # ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM +FD98;AL # ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM +FD99;AL # ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM +FD9A;AL # ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM +FD9B;AL # ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD9C;AL # ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM +FD9D;AL # ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM +FD9E;AL # ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM +FD9F;AL # ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM +FDA0;AL # ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM +FDA1;AL # ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM +FDA2;AL # ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM +FDA3;AL # ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM +FDA4;AL # ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM +FDA5;AL # ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM +FDA6;AL # ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM +FDA7;AL # ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM +FDA8;AL # ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM +FDA9;AL # ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM +FDAA;AL # ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM +FDAB;AL # ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM +FDAC;AL # ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM +FDAD;AL # ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM +FDAE;AL # ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM +FDAF;AL # ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM +FDB0;AL # ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM +FDB1;AL # ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM +FDB2;AL # ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM +FDB3;AL # ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM +FDB4;AL # ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM +FDB5;AL # ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM +FDB6;AL # ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM +FDB7;AL # ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM +FDB8;AL # ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM +FDB9;AL # ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM +FDBA;AL # ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM +FDBB;AL # ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM +FDBC;AL # ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM +FDBD;AL # ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM +FDBE;AL # ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM +FDBF;AL # ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM +FDC0;AL # ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM +FDC1;AL # ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM +FDC2;AL # ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM +FDC3;AL # ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM +FDC4;AL # ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM +FDC5;AL # ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM +FDC6;AL # ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM +FDC7;AL # ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDF0;AL # ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM +FDF1;AL # ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM +FDF2;AL # ARABIC LIGATURE ALLAH ISOLATED FORM +FDF3;AL # ARABIC LIGATURE AKBAR ISOLATED FORM +FDF4;AL # ARABIC LIGATURE MOHAMMAD ISOLATED FORM +FDF5;AL # ARABIC LIGATURE SALAM ISOLATED FORM +FDF6;AL # ARABIC LIGATURE RASOUL ISOLATED FORM +FDF7;AL # ARABIC LIGATURE ALAYHE ISOLATED FORM +FDF8;AL # ARABIC LIGATURE WASALLAM ISOLATED FORM +FDF9;AL # ARABIC LIGATURE SALLA ISOLATED FORM +FDFA;AL # ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM +FDFB;AL # ARABIC LIGATURE JALLAJALALOUHOU +FDFC;PO # RIAL SIGN +FE00;CM # VARIATION SELECTOR-1 +FE01;CM # VARIATION SELECTOR-2 +FE02;CM # VARIATION SELECTOR-3 +FE03;CM # VARIATION SELECTOR-4 +FE04;CM # VARIATION SELECTOR-5 +FE05;CM # VARIATION SELECTOR-6 +FE06;CM # VARIATION SELECTOR-7 +FE07;CM # VARIATION SELECTOR-8 +FE08;CM # VARIATION SELECTOR-9 +FE09;CM # VARIATION SELECTOR-10 +FE0A;CM # VARIATION SELECTOR-11 +FE0B;CM # VARIATION SELECTOR-12 +FE0C;CM # VARIATION SELECTOR-13 +FE0D;CM # VARIATION SELECTOR-14 +FE0E;CM # VARIATION SELECTOR-15 +FE0F;CM # VARIATION SELECTOR-16 +FE20;CM # COMBINING LIGATURE LEFT HALF +FE21;CM # COMBINING LIGATURE RIGHT HALF +FE22;CM # COMBINING DOUBLE TILDE LEFT HALF +FE23;CM # COMBINING DOUBLE TILDE RIGHT HALF +FE30;ID # PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +FE31;ID # PRESENTATION FORM FOR VERTICAL EM DASH +FE32;ID # PRESENTATION FORM FOR VERTICAL EN DASH +FE33;ID # PRESENTATION FORM FOR VERTICAL LOW LINE +FE34;ID # PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +FE35;OP # PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +FE36;CL # PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +FE37;OP # PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +FE38;CL # PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +FE39;OP # PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +FE3A;CL # PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +FE3B;OP # PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +FE3C;CL # PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +FE3D;OP # PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +FE3E;CL # PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +FE3F;OP # PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +FE40;CL # PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +FE41;OP # PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42;CL # PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43;OP # PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44;CL # PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FE45;ID # SESAME DOT +FE46;ID # WHITE SESAME DOT +FE49;ID # DASHED OVERLINE +FE4A;ID # CENTRELINE OVERLINE +FE4B;ID # WAVY OVERLINE +FE4C;ID # DOUBLE WAVY OVERLINE +FE4D;ID # DASHED LOW LINE +FE4E;ID # CENTRELINE LOW LINE +FE4F;ID # WAVY LOW LINE +FE50;CL # SMALL COMMA +FE51;ID # SMALL IDEOGRAPHIC COMMA +FE52;CL # SMALL FULL STOP +FE54;NS # SMALL SEMICOLON +FE55;NS # SMALL COLON +FE56;EX # SMALL QUESTION MARK +FE57;EX # SMALL EXCLAMATION MARK +FE58;ID # SMALL EM DASH +FE59;OP # SMALL LEFT PARENTHESIS +FE5A;CL # SMALL RIGHT PARENTHESIS +FE5B;OP # SMALL LEFT CURLY BRACKET +FE5C;CL # SMALL RIGHT CURLY BRACKET +FE5D;OP # SMALL LEFT TORTOISE SHELL BRACKET +FE5E;CL # SMALL RIGHT TORTOISE SHELL BRACKET +FE5F;ID # SMALL NUMBER SIGN +FE60;ID # SMALL AMPERSAND +FE61;ID # SMALL ASTERISK +FE62;ID # SMALL PLUS SIGN +FE63;ID # SMALL HYPHEN-MINUS +FE64;ID # SMALL LESS-THAN SIGN +FE65;ID # SMALL GREATER-THAN SIGN +FE66;ID # SMALL EQUALS SIGN +FE68;ID # SMALL REVERSE SOLIDUS +FE69;PR # SMALL DOLLAR SIGN +FE6A;PO # SMALL PERCENT SIGN +FE6B;ID # SMALL COMMERCIAL AT +FE70;AL # ARABIC FATHATAN ISOLATED FORM +FE71;AL # ARABIC TATWEEL WITH FATHATAN ABOVE +FE72;AL # ARABIC DAMMATAN ISOLATED FORM +FE73;AL # ARABIC TAIL FRAGMENT +FE74;AL # ARABIC KASRATAN ISOLATED FORM +FE76;AL # ARABIC FATHA ISOLATED FORM +FE77;AL # ARABIC FATHA MEDIAL FORM +FE78;AL # ARABIC DAMMA ISOLATED FORM +FE79;AL # ARABIC DAMMA MEDIAL FORM +FE7A;AL # ARABIC KASRA ISOLATED FORM +FE7B;AL # ARABIC KASRA MEDIAL FORM +FE7C;AL # ARABIC SHADDA ISOLATED FORM +FE7D;AL # ARABIC SHADDA MEDIAL FORM +FE7E;AL # ARABIC SUKUN ISOLATED FORM +FE7F;AL # ARABIC SUKUN MEDIAL FORM +FE80;AL # ARABIC LETTER HAMZA ISOLATED FORM +FE81;AL # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM +FE82;AL # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM +FE83;AL # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM +FE84;AL # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM +FE85;AL # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM +FE86;AL # ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM +FE87;AL # ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM +FE88;AL # ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM +FE89;AL # ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM +FE8A;AL # ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM +FE8B;AL # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM +FE8C;AL # ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM +FE8D;AL # ARABIC LETTER ALEF ISOLATED FORM +FE8E;AL # ARABIC LETTER ALEF FINAL FORM +FE8F;AL # ARABIC LETTER BEH ISOLATED FORM +FE90;AL # ARABIC LETTER BEH FINAL FORM +FE91;AL # ARABIC LETTER BEH INITIAL FORM +FE92;AL # ARABIC LETTER BEH MEDIAL FORM +FE93;AL # ARABIC LETTER TEH MARBUTA ISOLATED FORM +FE94;AL # ARABIC LETTER TEH MARBUTA FINAL FORM +FE95;AL # ARABIC LETTER TEH ISOLATED FORM +FE96;AL # ARABIC LETTER TEH FINAL FORM +FE97;AL # ARABIC LETTER TEH INITIAL FORM +FE98;AL # ARABIC LETTER TEH MEDIAL FORM +FE99;AL # ARABIC LETTER THEH ISOLATED FORM +FE9A;AL # ARABIC LETTER THEH FINAL FORM +FE9B;AL # ARABIC LETTER THEH INITIAL FORM +FE9C;AL # ARABIC LETTER THEH MEDIAL FORM +FE9D;AL # ARABIC LETTER JEEM ISOLATED FORM +FE9E;AL # ARABIC LETTER JEEM FINAL FORM +FE9F;AL # ARABIC LETTER JEEM INITIAL FORM +FEA0;AL # ARABIC LETTER JEEM MEDIAL FORM +FEA1;AL # ARABIC LETTER HAH ISOLATED FORM +FEA2;AL # ARABIC LETTER HAH FINAL FORM +FEA3;AL # ARABIC LETTER HAH INITIAL FORM +FEA4;AL # ARABIC LETTER HAH MEDIAL FORM +FEA5;AL # ARABIC LETTER KHAH ISOLATED FORM +FEA6;AL # ARABIC LETTER KHAH FINAL FORM +FEA7;AL # ARABIC LETTER KHAH INITIAL FORM +FEA8;AL # ARABIC LETTER KHAH MEDIAL FORM +FEA9;AL # ARABIC LETTER DAL ISOLATED FORM +FEAA;AL # ARABIC LETTER DAL FINAL FORM +FEAB;AL # ARABIC LETTER THAL ISOLATED FORM +FEAC;AL # ARABIC LETTER THAL FINAL FORM +FEAD;AL # ARABIC LETTER REH ISOLATED FORM +FEAE;AL # ARABIC LETTER REH FINAL FORM +FEAF;AL # ARABIC LETTER ZAIN ISOLATED FORM +FEB0;AL # ARABIC LETTER ZAIN FINAL FORM +FEB1;AL # ARABIC LETTER SEEN ISOLATED FORM +FEB2;AL # ARABIC LETTER SEEN FINAL FORM +FEB3;AL # ARABIC LETTER SEEN INITIAL FORM +FEB4;AL # ARABIC LETTER SEEN MEDIAL FORM +FEB5;AL # ARABIC LETTER SHEEN ISOLATED FORM +FEB6;AL # ARABIC LETTER SHEEN FINAL FORM +FEB7;AL # ARABIC LETTER SHEEN INITIAL FORM +FEB8;AL # ARABIC LETTER SHEEN MEDIAL FORM +FEB9;AL # ARABIC LETTER SAD ISOLATED FORM +FEBA;AL # ARABIC LETTER SAD FINAL FORM +FEBB;AL # ARABIC LETTER SAD INITIAL FORM +FEBC;AL # ARABIC LETTER SAD MEDIAL FORM +FEBD;AL # ARABIC LETTER DAD ISOLATED FORM +FEBE;AL # ARABIC LETTER DAD FINAL FORM +FEBF;AL # ARABIC LETTER DAD INITIAL FORM +FEC0;AL # ARABIC LETTER DAD MEDIAL FORM +FEC1;AL # ARABIC LETTER TAH ISOLATED FORM +FEC2;AL # ARABIC LETTER TAH FINAL FORM +FEC3;AL # ARABIC LETTER TAH INITIAL FORM +FEC4;AL # ARABIC LETTER TAH MEDIAL FORM +FEC5;AL # ARABIC LETTER ZAH ISOLATED FORM +FEC6;AL # ARABIC LETTER ZAH FINAL FORM +FEC7;AL # ARABIC LETTER ZAH INITIAL FORM +FEC8;AL # ARABIC LETTER ZAH MEDIAL FORM +FEC9;AL # ARABIC LETTER AIN ISOLATED FORM +FECA;AL # ARABIC LETTER AIN FINAL FORM +FECB;AL # ARABIC LETTER AIN INITIAL FORM +FECC;AL # ARABIC LETTER AIN MEDIAL FORM +FECD;AL # ARABIC LETTER GHAIN ISOLATED FORM +FECE;AL # ARABIC LETTER GHAIN FINAL FORM +FECF;AL # ARABIC LETTER GHAIN INITIAL FORM +FED0;AL # ARABIC LETTER GHAIN MEDIAL FORM +FED1;AL # ARABIC LETTER FEH ISOLATED FORM +FED2;AL # ARABIC LETTER FEH FINAL FORM +FED3;AL # ARABIC LETTER FEH INITIAL FORM +FED4;AL # ARABIC LETTER FEH MEDIAL FORM +FED5;AL # ARABIC LETTER QAF ISOLATED FORM +FED6;AL # ARABIC LETTER QAF FINAL FORM +FED7;AL # ARABIC LETTER QAF INITIAL FORM +FED8;AL # ARABIC LETTER QAF MEDIAL FORM +FED9;AL # ARABIC LETTER KAF ISOLATED FORM +FEDA;AL # ARABIC LETTER KAF FINAL FORM +FEDB;AL # ARABIC LETTER KAF INITIAL FORM +FEDC;AL # ARABIC LETTER KAF MEDIAL FORM +FEDD;AL # ARABIC LETTER LAM ISOLATED FORM +FEDE;AL # ARABIC LETTER LAM FINAL FORM +FEDF;AL # ARABIC LETTER LAM INITIAL FORM +FEE0;AL # ARABIC LETTER LAM MEDIAL FORM +FEE1;AL # ARABIC LETTER MEEM ISOLATED FORM +FEE2;AL # ARABIC LETTER MEEM FINAL FORM +FEE3;AL # ARABIC LETTER MEEM INITIAL FORM +FEE4;AL # ARABIC LETTER MEEM MEDIAL FORM +FEE5;AL # ARABIC LETTER NOON ISOLATED FORM +FEE6;AL # ARABIC LETTER NOON FINAL FORM +FEE7;AL # ARABIC LETTER NOON INITIAL FORM +FEE8;AL # ARABIC LETTER NOON MEDIAL FORM +FEE9;AL # ARABIC LETTER HEH ISOLATED FORM +FEEA;AL # ARABIC LETTER HEH FINAL FORM +FEEB;AL # ARABIC LETTER HEH INITIAL FORM +FEEC;AL # ARABIC LETTER HEH MEDIAL FORM +FEED;AL # ARABIC LETTER WAW ISOLATED FORM +FEEE;AL # ARABIC LETTER WAW FINAL FORM +FEEF;AL # ARABIC LETTER ALEF MAKSURA ISOLATED FORM +FEF0;AL # ARABIC LETTER ALEF MAKSURA FINAL FORM +FEF1;AL # ARABIC LETTER YEH ISOLATED FORM +FEF2;AL # ARABIC LETTER YEH FINAL FORM +FEF3;AL # ARABIC LETTER YEH INITIAL FORM +FEF4;AL # ARABIC LETTER YEH MEDIAL FORM +FEF5;AL # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM +FEF6;AL # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM +FEF7;AL # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM +FEF8;AL # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM +FEF9;AL # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM +FEFA;AL # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM +FEFB;AL # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM +FEFC;AL # ARABIC LIGATURE LAM WITH ALEF FINAL FORM +FEFF;GL # ZERO WIDTH NO-BREAK SPACE +FF01;EX # FULLWIDTH EXCLAMATION MARK +FF02;ID # FULLWIDTH QUOTATION MARK +FF03;ID # FULLWIDTH NUMBER SIGN +FF04;PR # FULLWIDTH DOLLAR SIGN +FF05;PO # FULLWIDTH PERCENT SIGN +FF06;ID # FULLWIDTH AMPERSAND +FF07;ID # FULLWIDTH APOSTROPHE +FF08;OP # FULLWIDTH LEFT PARENTHESIS +FF09;CL # FULLWIDTH RIGHT PARENTHESIS +FF0A;ID # FULLWIDTH ASTERISK +FF0B;ID # FULLWIDTH PLUS SIGN +FF0C;CL # FULLWIDTH COMMA +FF0D;ID # FULLWIDTH HYPHEN-MINUS +FF0E;CL # FULLWIDTH FULL STOP +FF0F;ID # FULLWIDTH SOLIDUS +FF10;ID # FULLWIDTH DIGIT ZERO +FF11;ID # FULLWIDTH DIGIT ONE +FF12;ID # FULLWIDTH DIGIT TWO +FF13;ID # FULLWIDTH DIGIT THREE +FF14;ID # FULLWIDTH DIGIT FOUR +FF15;ID # FULLWIDTH DIGIT FIVE +FF16;ID # FULLWIDTH DIGIT SIX +FF17;ID # FULLWIDTH DIGIT SEVEN +FF18;ID # FULLWIDTH DIGIT EIGHT +FF19;ID # FULLWIDTH DIGIT NINE +FF1A;NS # FULLWIDTH COLON +FF1B;NS # FULLWIDTH SEMICOLON +FF1C;ID # FULLWIDTH LESS-THAN SIGN +FF1D;ID # FULLWIDTH EQUALS SIGN +FF1E;ID # FULLWIDTH GREATER-THAN SIGN +FF1F;EX # FULLWIDTH QUESTION MARK +FF20;ID # FULLWIDTH COMMERCIAL AT +FF21;ID # FULLWIDTH LATIN CAPITAL LETTER A +FF22;ID # FULLWIDTH LATIN CAPITAL LETTER B +FF23;ID # FULLWIDTH LATIN CAPITAL LETTER C +FF24;ID # FULLWIDTH LATIN CAPITAL LETTER D +FF25;ID # FULLWIDTH LATIN CAPITAL LETTER E +FF26;ID # FULLWIDTH LATIN CAPITAL LETTER F +FF27;ID # FULLWIDTH LATIN CAPITAL LETTER G +FF28;ID # FULLWIDTH LATIN CAPITAL LETTER H +FF29;ID # FULLWIDTH LATIN CAPITAL LETTER I +FF2A;ID # FULLWIDTH LATIN CAPITAL LETTER J +FF2B;ID # FULLWIDTH LATIN CAPITAL LETTER K +FF2C;ID # FULLWIDTH LATIN CAPITAL LETTER L +FF2D;ID # FULLWIDTH LATIN CAPITAL LETTER M +FF2E;ID # FULLWIDTH LATIN CAPITAL LETTER N +FF2F;ID # FULLWIDTH LATIN CAPITAL LETTER O +FF30;ID # FULLWIDTH LATIN CAPITAL LETTER P +FF31;ID # FULLWIDTH LATIN CAPITAL LETTER Q +FF32;ID # FULLWIDTH LATIN CAPITAL LETTER R +FF33;ID # FULLWIDTH LATIN CAPITAL LETTER S +FF34;ID # FULLWIDTH LATIN CAPITAL LETTER T +FF35;ID # FULLWIDTH LATIN CAPITAL LETTER U +FF36;ID # FULLWIDTH LATIN CAPITAL LETTER V +FF37;ID # FULLWIDTH LATIN CAPITAL LETTER W +FF38;ID # FULLWIDTH LATIN CAPITAL LETTER X +FF39;ID # FULLWIDTH LATIN CAPITAL LETTER Y +FF3A;ID # FULLWIDTH LATIN CAPITAL LETTER Z +FF3B;OP # FULLWIDTH LEFT SQUARE BRACKET +FF3C;ID # FULLWIDTH REVERSE SOLIDUS +FF3D;CL # FULLWIDTH RIGHT SQUARE BRACKET +FF3E;ID # FULLWIDTH CIRCUMFLEX ACCENT +FF3F;ID # FULLWIDTH LOW LINE +FF40;ID # FULLWIDTH GRAVE ACCENT +FF41;ID # FULLWIDTH LATIN SMALL LETTER A +FF42;ID # FULLWIDTH LATIN SMALL LETTER B +FF43;ID # FULLWIDTH LATIN SMALL LETTER C +FF44;ID # FULLWIDTH LATIN SMALL LETTER D +FF45;ID # FULLWIDTH LATIN SMALL LETTER E +FF46;ID # FULLWIDTH LATIN SMALL LETTER F +FF47;ID # FULLWIDTH LATIN SMALL LETTER G +FF48;ID # FULLWIDTH LATIN SMALL LETTER H +FF49;ID # FULLWIDTH LATIN SMALL LETTER I +FF4A;ID # FULLWIDTH LATIN SMALL LETTER J +FF4B;ID # FULLWIDTH LATIN SMALL LETTER K +FF4C;ID # FULLWIDTH LATIN SMALL LETTER L +FF4D;ID # FULLWIDTH LATIN SMALL LETTER M +FF4E;ID # FULLWIDTH LATIN SMALL LETTER N +FF4F;ID # FULLWIDTH LATIN SMALL LETTER O +FF50;ID # FULLWIDTH LATIN SMALL LETTER P +FF51;ID # FULLWIDTH LATIN SMALL LETTER Q +FF52;ID # FULLWIDTH LATIN SMALL LETTER R +FF53;ID # FULLWIDTH LATIN SMALL LETTER S +FF54;ID # FULLWIDTH LATIN SMALL LETTER T +FF55;ID # FULLWIDTH LATIN SMALL LETTER U +FF56;ID # FULLWIDTH LATIN SMALL LETTER V +FF57;ID # FULLWIDTH LATIN SMALL LETTER W +FF58;ID # FULLWIDTH LATIN SMALL LETTER X +FF59;ID # FULLWIDTH LATIN SMALL LETTER Y +FF5A;ID # FULLWIDTH LATIN SMALL LETTER Z +FF5B;OP # FULLWIDTH LEFT CURLY BRACKET +FF5C;ID # FULLWIDTH VERTICAL LINE +FF5D;CL # FULLWIDTH RIGHT CURLY BRACKET +FF5E;ID # FULLWIDTH TILDE +FF5F;OP # FULLWIDTH LEFT WHITE PARENTHESIS +FF60;CL # FULLWIDTH RIGHT WHITE PARENTHESIS +FF61;CL # HALFWIDTH IDEOGRAPHIC FULL STOP +FF62;OP # HALFWIDTH LEFT CORNER BRACKET +FF63;CL # HALFWIDTH RIGHT CORNER BRACKET +FF64;CL # HALFWIDTH IDEOGRAPHIC COMMA +FF65;NS # HALFWIDTH KATAKANA MIDDLE DOT +FF66;AL # HALFWIDTH KATAKANA LETTER WO +FF67;NS # HALFWIDTH KATAKANA LETTER SMALL A +FF68;NS # HALFWIDTH KATAKANA LETTER SMALL I +FF69;NS # HALFWIDTH KATAKANA LETTER SMALL U +FF6A;NS # HALFWIDTH KATAKANA LETTER SMALL E +FF6B;NS # HALFWIDTH KATAKANA LETTER SMALL O +FF6C;NS # HALFWIDTH KATAKANA LETTER SMALL YA +FF6D;NS # HALFWIDTH KATAKANA LETTER SMALL YU +FF6E;NS # HALFWIDTH KATAKANA LETTER SMALL YO +FF6F;NS # HALFWIDTH KATAKANA LETTER SMALL TU +FF70;NS # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF71;AL # HALFWIDTH KATAKANA LETTER A +FF72;AL # HALFWIDTH KATAKANA LETTER I +FF73;AL # HALFWIDTH KATAKANA LETTER U +FF74;AL # HALFWIDTH KATAKANA LETTER E +FF75;AL # HALFWIDTH KATAKANA LETTER O +FF76;AL # HALFWIDTH KATAKANA LETTER KA +FF77;AL # HALFWIDTH KATAKANA LETTER KI +FF78;AL # HALFWIDTH KATAKANA LETTER KU +FF79;AL # HALFWIDTH KATAKANA LETTER KE +FF7A;AL # HALFWIDTH KATAKANA LETTER KO +FF7B;AL # HALFWIDTH KATAKANA LETTER SA +FF7C;AL # HALFWIDTH KATAKANA LETTER SI +FF7D;AL # HALFWIDTH KATAKANA LETTER SU +FF7E;AL # HALFWIDTH KATAKANA LETTER SE +FF7F;AL # HALFWIDTH KATAKANA LETTER SO +FF80;AL # HALFWIDTH KATAKANA LETTER TA +FF81;AL # HALFWIDTH KATAKANA LETTER TI +FF82;AL # HALFWIDTH KATAKANA LETTER TU +FF83;AL # HALFWIDTH KATAKANA LETTER TE +FF84;AL # HALFWIDTH KATAKANA LETTER TO +FF85;AL # HALFWIDTH KATAKANA LETTER NA +FF86;AL # HALFWIDTH KATAKANA LETTER NI +FF87;AL # HALFWIDTH KATAKANA LETTER NU +FF88;AL # HALFWIDTH KATAKANA LETTER NE +FF89;AL # HALFWIDTH KATAKANA LETTER NO +FF8A;AL # HALFWIDTH KATAKANA LETTER HA +FF8B;AL # HALFWIDTH KATAKANA LETTER HI +FF8C;AL # HALFWIDTH KATAKANA LETTER HU +FF8D;AL # HALFWIDTH KATAKANA LETTER HE +FF8E;AL # HALFWIDTH KATAKANA LETTER HO +FF8F;AL # HALFWIDTH KATAKANA LETTER MA +FF90;AL # HALFWIDTH KATAKANA LETTER MI +FF91;AL # HALFWIDTH KATAKANA LETTER MU +FF92;AL # HALFWIDTH KATAKANA LETTER ME +FF93;AL # HALFWIDTH KATAKANA LETTER MO +FF94;AL # HALFWIDTH KATAKANA LETTER YA +FF95;AL # HALFWIDTH KATAKANA LETTER YU +FF96;AL # HALFWIDTH KATAKANA LETTER YO +FF97;AL # HALFWIDTH KATAKANA LETTER RA +FF98;AL # HALFWIDTH KATAKANA LETTER RI +FF99;AL # HALFWIDTH KATAKANA LETTER RU +FF9A;AL # HALFWIDTH KATAKANA LETTER RE +FF9B;AL # HALFWIDTH KATAKANA LETTER RO +FF9C;AL # HALFWIDTH KATAKANA LETTER WA +FF9D;AL # HALFWIDTH KATAKANA LETTER N +FF9E;NS # HALFWIDTH KATAKANA VOICED SOUND MARK +FF9F;NS # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFA0;AL # HALFWIDTH HANGUL FILLER +FFA1;AL # HALFWIDTH HANGUL LETTER KIYEOK +FFA2;AL # HALFWIDTH HANGUL LETTER SSANGKIYEOK +FFA3;AL # HALFWIDTH HANGUL LETTER KIYEOK-SIOS +FFA4;AL # HALFWIDTH HANGUL LETTER NIEUN +FFA5;AL # HALFWIDTH HANGUL LETTER NIEUN-CIEUC +FFA6;AL # HALFWIDTH HANGUL LETTER NIEUN-HIEUH +FFA7;AL # HALFWIDTH HANGUL LETTER TIKEUT +FFA8;AL # HALFWIDTH HANGUL LETTER SSANGTIKEUT +FFA9;AL # HALFWIDTH HANGUL LETTER RIEUL +FFAA;AL # HALFWIDTH HANGUL LETTER RIEUL-KIYEOK +FFAB;AL # HALFWIDTH HANGUL LETTER RIEUL-MIEUM +FFAC;AL # HALFWIDTH HANGUL LETTER RIEUL-PIEUP +FFAD;AL # HALFWIDTH HANGUL LETTER RIEUL-SIOS +FFAE;AL # HALFWIDTH HANGUL LETTER RIEUL-THIEUTH +FFAF;AL # HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH +FFB0;AL # HALFWIDTH HANGUL LETTER RIEUL-HIEUH +FFB1;AL # HALFWIDTH HANGUL LETTER MIEUM +FFB2;AL # HALFWIDTH HANGUL LETTER PIEUP +FFB3;AL # HALFWIDTH HANGUL LETTER SSANGPIEUP +FFB4;AL # HALFWIDTH HANGUL LETTER PIEUP-SIOS +FFB5;AL # HALFWIDTH HANGUL LETTER SIOS +FFB6;AL # HALFWIDTH HANGUL LETTER SSANGSIOS +FFB7;AL # HALFWIDTH HANGUL LETTER IEUNG +FFB8;AL # HALFWIDTH HANGUL LETTER CIEUC +FFB9;AL # HALFWIDTH HANGUL LETTER SSANGCIEUC +FFBA;AL # HALFWIDTH HANGUL LETTER CHIEUCH +FFBB;AL # HALFWIDTH HANGUL LETTER KHIEUKH +FFBC;AL # HALFWIDTH HANGUL LETTER THIEUTH +FFBD;AL # HALFWIDTH HANGUL LETTER PHIEUPH +FFBE;AL # HALFWIDTH HANGUL LETTER HIEUH +FFC2;AL # HALFWIDTH HANGUL LETTER A +FFC3;AL # HALFWIDTH HANGUL LETTER AE +FFC4;AL # HALFWIDTH HANGUL LETTER YA +FFC5;AL # HALFWIDTH HANGUL LETTER YAE +FFC6;AL # HALFWIDTH HANGUL LETTER EO +FFC7;AL # HALFWIDTH HANGUL LETTER E +FFCA;AL # HALFWIDTH HANGUL LETTER YEO +FFCB;AL # HALFWIDTH HANGUL LETTER YE +FFCC;AL # HALFWIDTH HANGUL LETTER O +FFCD;AL # HALFWIDTH HANGUL LETTER WA +FFCE;AL # HALFWIDTH HANGUL LETTER WAE +FFCF;AL # HALFWIDTH HANGUL LETTER OE +FFD2;AL # HALFWIDTH HANGUL LETTER YO +FFD3;AL # HALFWIDTH HANGUL LETTER U +FFD4;AL # HALFWIDTH HANGUL LETTER WEO +FFD5;AL # HALFWIDTH HANGUL LETTER WE +FFD6;AL # HALFWIDTH HANGUL LETTER WI +FFD7;AL # HALFWIDTH HANGUL LETTER YU +FFDA;AL # HALFWIDTH HANGUL LETTER EU +FFDB;AL # HALFWIDTH HANGUL LETTER YI +FFDC;AL # HALFWIDTH HANGUL LETTER I +FFE0;PO # FULLWIDTH CENT SIGN +FFE1;PR # FULLWIDTH POUND SIGN +FFE2;ID # FULLWIDTH NOT SIGN +FFE3;ID # FULLWIDTH MACRON +FFE4;ID # FULLWIDTH BROKEN BAR +FFE5;PR # FULLWIDTH YEN SIGN +FFE6;PR # FULLWIDTH WON SIGN +FFE8;AL # HALFWIDTH FORMS LIGHT VERTICAL +FFE9;AL # HALFWIDTH LEFTWARDS ARROW +FFEA;AL # HALFWIDTH UPWARDS ARROW +FFEB;AL # HALFWIDTH RIGHTWARDS ARROW +FFEC;AL # HALFWIDTH DOWNWARDS ARROW +FFED;AL # HALFWIDTH BLACK SQUARE +FFEE;AL # HALFWIDTH WHITE CIRCLE +FFF9;CM # INTERLINEAR ANNOTATION ANCHOR +FFFA;CM # INTERLINEAR ANNOTATION SEPARATOR +FFFB;CM # INTERLINEAR ANNOTATION TERMINATOR +FFFC;CB # OBJECT REPLACEMENT CHARACTER +FFFD;AI # REPLACEMENT CHARACTER +10300;AL # OLD ITALIC LETTER A +10301;AL # OLD ITALIC LETTER BE +10302;AL # OLD ITALIC LETTER KE +10303;AL # OLD ITALIC LETTER DE +10304;AL # OLD ITALIC LETTER E +10305;AL # OLD ITALIC LETTER VE +10306;AL # OLD ITALIC LETTER ZE +10307;AL # OLD ITALIC LETTER HE +10308;AL # OLD ITALIC LETTER THE +10309;AL # OLD ITALIC LETTER I +1030A;AL # OLD ITALIC LETTER KA +1030B;AL # OLD ITALIC LETTER EL +1030C;AL # OLD ITALIC LETTER EM +1030D;AL # OLD ITALIC LETTER EN +1030E;AL # OLD ITALIC LETTER ESH +1030F;AL # OLD ITALIC LETTER O +10310;AL # OLD ITALIC LETTER PE +10311;AL # OLD ITALIC LETTER SHE +10312;AL # OLD ITALIC LETTER KU +10313;AL # OLD ITALIC LETTER ER +10314;AL # OLD ITALIC LETTER ES +10315;AL # OLD ITALIC LETTER TE +10316;AL # OLD ITALIC LETTER U +10317;AL # OLD ITALIC LETTER EKS +10318;AL # OLD ITALIC LETTER PHE +10319;AL # OLD ITALIC LETTER KHE +1031A;AL # OLD ITALIC LETTER EF +1031B;AL # OLD ITALIC LETTER ERS +1031C;AL # OLD ITALIC LETTER CHE +1031D;AL # OLD ITALIC LETTER II +1031E;AL # OLD ITALIC LETTER UU +10320;AL # OLD ITALIC NUMERAL ONE +10321;AL # OLD ITALIC NUMERAL FIVE +10322;AL # OLD ITALIC NUMERAL TEN +10323;AL # OLD ITALIC NUMERAL FIFTY +10330;AL # GOTHIC LETTER AHSA +10331;AL # GOTHIC LETTER BAIRKAN +10332;AL # GOTHIC LETTER GIBA +10333;AL # GOTHIC LETTER DAGS +10334;AL # GOTHIC LETTER AIHVUS +10335;AL # GOTHIC LETTER QAIRTHRA +10336;AL # GOTHIC LETTER IUJA +10337;AL # GOTHIC LETTER HAGL +10338;AL # GOTHIC LETTER THIUTH +10339;AL # GOTHIC LETTER EIS +1033A;AL # GOTHIC LETTER KUSMA +1033B;AL # GOTHIC LETTER LAGUS +1033C;AL # GOTHIC LETTER MANNA +1033D;AL # GOTHIC LETTER NAUTHS +1033E;AL # GOTHIC LETTER JER +1033F;AL # GOTHIC LETTER URUS +10340;AL # GOTHIC LETTER PAIRTHRA +10341;AL # GOTHIC LETTER NINETY +10342;AL # GOTHIC LETTER RAIDA +10343;AL # GOTHIC LETTER SAUIL +10344;AL # GOTHIC LETTER TEIWS +10345;AL # GOTHIC LETTER WINJA +10346;AL # GOTHIC LETTER FAIHU +10347;AL # GOTHIC LETTER IGGWS +10348;AL # GOTHIC LETTER HWAIR +10349;AL # GOTHIC LETTER OTHAL +1034A;AL # GOTHIC LETTER NINE HUNDRED +10400;AL # DESERET CAPITAL LETTER LONG I +10401;AL # DESERET CAPITAL LETTER LONG E +10402;AL # DESERET CAPITAL LETTER LONG A +10403;AL # DESERET CAPITAL LETTER LONG AH +10404;AL # DESERET CAPITAL LETTER LONG O +10405;AL # DESERET CAPITAL LETTER LONG OO +10406;AL # DESERET CAPITAL LETTER SHORT I +10407;AL # DESERET CAPITAL LETTER SHORT E +10408;AL # DESERET CAPITAL LETTER SHORT A +10409;AL # DESERET CAPITAL LETTER SHORT AH +1040A;AL # DESERET CAPITAL LETTER SHORT O +1040B;AL # DESERET CAPITAL LETTER SHORT OO +1040C;AL # DESERET CAPITAL LETTER AY +1040D;AL # DESERET CAPITAL LETTER OW +1040E;AL # DESERET CAPITAL LETTER WU +1040F;AL # DESERET CAPITAL LETTER YEE +10410;AL # DESERET CAPITAL LETTER H +10411;AL # DESERET CAPITAL LETTER PEE +10412;AL # DESERET CAPITAL LETTER BEE +10413;AL # DESERET CAPITAL LETTER TEE +10414;AL # DESERET CAPITAL LETTER DEE +10415;AL # DESERET CAPITAL LETTER CHEE +10416;AL # DESERET CAPITAL LETTER JEE +10417;AL # DESERET CAPITAL LETTER KAY +10418;AL # DESERET CAPITAL LETTER GAY +10419;AL # DESERET CAPITAL LETTER EF +1041A;AL # DESERET CAPITAL LETTER VEE +1041B;AL # DESERET CAPITAL LETTER ETH +1041C;AL # DESERET CAPITAL LETTER THEE +1041D;AL # DESERET CAPITAL LETTER ES +1041E;AL # DESERET CAPITAL LETTER ZEE +1041F;AL # DESERET CAPITAL LETTER ESH +10420;AL # DESERET CAPITAL LETTER ZHEE +10421;AL # DESERET CAPITAL LETTER ER +10422;AL # DESERET CAPITAL LETTER EL +10423;AL # DESERET CAPITAL LETTER EM +10424;AL # DESERET CAPITAL LETTER EN +10425;AL # DESERET CAPITAL LETTER ENG +10428;AL # DESERET SMALL LETTER LONG I +10429;AL # DESERET SMALL LETTER LONG E +1042A;AL # DESERET SMALL LETTER LONG A +1042B;AL # DESERET SMALL LETTER LONG AH +1042C;AL # DESERET SMALL LETTER LONG O +1042D;AL # DESERET SMALL LETTER LONG OO +1042E;AL # DESERET SMALL LETTER SHORT I +1042F;AL # DESERET SMALL LETTER SHORT E +10430;AL # DESERET SMALL LETTER SHORT A +10431;AL # DESERET SMALL LETTER SHORT AH +10432;AL # DESERET SMALL LETTER SHORT O +10433;AL # DESERET SMALL LETTER SHORT OO +10434;AL # DESERET SMALL LETTER AY +10435;AL # DESERET SMALL LETTER OW +10436;AL # DESERET SMALL LETTER WU +10437;AL # DESERET SMALL LETTER YEE +10438;AL # DESERET SMALL LETTER H +10439;AL # DESERET SMALL LETTER PEE +1043A;AL # DESERET SMALL LETTER BEE +1043B;AL # DESERET SMALL LETTER TEE +1043C;AL # DESERET SMALL LETTER DEE +1043D;AL # DESERET SMALL LETTER CHEE +1043E;AL # DESERET SMALL LETTER JEE +1043F;AL # DESERET SMALL LETTER KAY +10440;AL # DESERET SMALL LETTER GAY +10441;AL # DESERET SMALL LETTER EF +10442;AL # DESERET SMALL LETTER VEE +10443;AL # DESERET SMALL LETTER ETH +10444;AL # DESERET SMALL LETTER THEE +10445;AL # DESERET SMALL LETTER ES +10446;AL # DESERET SMALL LETTER ZEE +10447;AL # DESERET SMALL LETTER ESH +10448;AL # DESERET SMALL LETTER ZHEE +10449;AL # DESERET SMALL LETTER ER +1044A;AL # DESERET SMALL LETTER EL +1044B;AL # DESERET SMALL LETTER EM +1044C;AL # DESERET SMALL LETTER EN +1044D;AL # DESERET SMALL LETTER ENG +1D000;AL # BYZANTINE MUSICAL SYMBOL PSILI +1D001;AL # BYZANTINE MUSICAL SYMBOL DASEIA +1D002;AL # BYZANTINE MUSICAL SYMBOL PERISPOMENI +1D003;AL # BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON +1D004;AL # BYZANTINE MUSICAL SYMBOL OXEIA DIPLI +1D005;AL # BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON +1D006;AL # BYZANTINE MUSICAL SYMBOL VAREIA DIPLI +1D007;AL # BYZANTINE MUSICAL SYMBOL KATHISTI +1D008;AL # BYZANTINE MUSICAL SYMBOL SYRMATIKI +1D009;AL # BYZANTINE MUSICAL SYMBOL PARAKLITIKI +1D00A;AL # BYZANTINE MUSICAL SYMBOL YPOKRISIS +1D00B;AL # BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI +1D00C;AL # BYZANTINE MUSICAL SYMBOL KREMASTI +1D00D;AL # BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON +1D00E;AL # BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON +1D00F;AL # BYZANTINE MUSICAL SYMBOL TELEIA +1D010;AL # BYZANTINE MUSICAL SYMBOL KENTIMATA +1D011;AL # BYZANTINE MUSICAL SYMBOL APOSTROFOS +1D012;AL # BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI +1D013;AL # BYZANTINE MUSICAL SYMBOL SYNEVMA +1D014;AL # BYZANTINE MUSICAL SYMBOL THITA +1D015;AL # BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION +1D016;AL # BYZANTINE MUSICAL SYMBOL GORGON ARCHAION +1D017;AL # BYZANTINE MUSICAL SYMBOL PSILON +1D018;AL # BYZANTINE MUSICAL SYMBOL CHAMILON +1D019;AL # BYZANTINE MUSICAL SYMBOL VATHY +1D01A;AL # BYZANTINE MUSICAL SYMBOL ISON ARCHAION +1D01B;AL # BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION +1D01C;AL # BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION +1D01D;AL # BYZANTINE MUSICAL SYMBOL SAXIMATA +1D01E;AL # BYZANTINE MUSICAL SYMBOL PARICHON +1D01F;AL # BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA +1D020;AL # BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION +1D021;AL # BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION +1D022;AL # BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION +1D023;AL # BYZANTINE MUSICAL SYMBOL APOTHEMA +1D024;AL # BYZANTINE MUSICAL SYMBOL KLASMA +1D025;AL # BYZANTINE MUSICAL SYMBOL REVMA +1D026;AL # BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION +1D027;AL # BYZANTINE MUSICAL SYMBOL TINAGMA +1D028;AL # BYZANTINE MUSICAL SYMBOL ANATRICHISMA +1D029;AL # BYZANTINE MUSICAL SYMBOL SEISMA +1D02A;AL # BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION +1D02B;AL # BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU +1D02C;AL # BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION +1D02D;AL # BYZANTINE MUSICAL SYMBOL THEMA +1D02E;AL # BYZANTINE MUSICAL SYMBOL LEMOI +1D02F;AL # BYZANTINE MUSICAL SYMBOL DYO +1D030;AL # BYZANTINE MUSICAL SYMBOL TRIA +1D031;AL # BYZANTINE MUSICAL SYMBOL TESSERA +1D032;AL # BYZANTINE MUSICAL SYMBOL KRATIMATA +1D033;AL # BYZANTINE MUSICAL SYMBOL APESO EXO NEO +1D034;AL # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION +1D035;AL # BYZANTINE MUSICAL SYMBOL IMIFTHORA +1D036;AL # BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION +1D037;AL # BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON +1D038;AL # BYZANTINE MUSICAL SYMBOL PELASTON +1D039;AL # BYZANTINE MUSICAL SYMBOL PSIFISTON +1D03A;AL # BYZANTINE MUSICAL SYMBOL KONTEVMA +1D03B;AL # BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION +1D03C;AL # BYZANTINE MUSICAL SYMBOL RAPISMA +1D03D;AL # BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION +1D03E;AL # BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION +1D03F;AL # BYZANTINE MUSICAL SYMBOL ICHADIN +1D040;AL # BYZANTINE MUSICAL SYMBOL NANA +1D041;AL # BYZANTINE MUSICAL SYMBOL PETASMA +1D042;AL # BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO +1D043;AL # BYZANTINE MUSICAL SYMBOL TROMIKON ALLO +1D044;AL # BYZANTINE MUSICAL SYMBOL STRAGGISMATA +1D045;AL # BYZANTINE MUSICAL SYMBOL GRONTHISMATA +1D046;AL # BYZANTINE MUSICAL SYMBOL ISON NEO +1D047;AL # BYZANTINE MUSICAL SYMBOL OLIGON NEO +1D048;AL # BYZANTINE MUSICAL SYMBOL OXEIA NEO +1D049;AL # BYZANTINE MUSICAL SYMBOL PETASTI +1D04A;AL # BYZANTINE MUSICAL SYMBOL KOUFISMA +1D04B;AL # BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA +1D04C;AL # BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA +1D04D;AL # BYZANTINE MUSICAL SYMBOL PELASTON NEO +1D04E;AL # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO +1D04F;AL # BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO +1D050;AL # BYZANTINE MUSICAL SYMBOL YPSILI +1D051;AL # BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO +1D052;AL # BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO +1D053;AL # BYZANTINE MUSICAL SYMBOL YPORROI +1D054;AL # BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON +1D055;AL # BYZANTINE MUSICAL SYMBOL ELAFRON +1D056;AL # BYZANTINE MUSICAL SYMBOL CHAMILI +1D057;AL # BYZANTINE MUSICAL SYMBOL MIKRON ISON +1D058;AL # BYZANTINE MUSICAL SYMBOL VAREIA NEO +1D059;AL # BYZANTINE MUSICAL SYMBOL PIASMA NEO +1D05A;AL # BYZANTINE MUSICAL SYMBOL PSIFISTON NEO +1D05B;AL # BYZANTINE MUSICAL SYMBOL OMALON +1D05C;AL # BYZANTINE MUSICAL SYMBOL ANTIKENOMA +1D05D;AL # BYZANTINE MUSICAL SYMBOL LYGISMA +1D05E;AL # BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO +1D05F;AL # BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO +1D060;AL # BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA +1D061;AL # BYZANTINE MUSICAL SYMBOL KYLISMA +1D062;AL # BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA +1D063;AL # BYZANTINE MUSICAL SYMBOL TROMIKON NEO +1D064;AL # BYZANTINE MUSICAL SYMBOL EKSTREPTON +1D065;AL # BYZANTINE MUSICAL SYMBOL SYNAGMA NEO +1D066;AL # BYZANTINE MUSICAL SYMBOL SYRMA +1D067;AL # BYZANTINE MUSICAL SYMBOL CHOREVMA NEO +1D068;AL # BYZANTINE MUSICAL SYMBOL EPEGERMA +1D069;AL # BYZANTINE MUSICAL SYMBOL SEISMA NEO +1D06A;AL # BYZANTINE MUSICAL SYMBOL XIRON KLASMA +1D06B;AL # BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON +1D06C;AL # BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA +1D06D;AL # BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA +1D06E;AL # BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA +1D06F;AL # BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA +1D070;AL # BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA +1D071;AL # BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA +1D072;AL # BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON +1D073;AL # BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON +1D074;AL # BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON +1D075;AL # BYZANTINE MUSICAL SYMBOL OYRANISMA NEO +1D076;AL # BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO +1D077;AL # BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO +1D078;AL # BYZANTINE MUSICAL SYMBOL THEMA APLOUN +1D079;AL # BYZANTINE MUSICAL SYMBOL THES KAI APOTHES +1D07A;AL # BYZANTINE MUSICAL SYMBOL KATAVASMA +1D07B;AL # BYZANTINE MUSICAL SYMBOL ENDOFONON +1D07C;AL # BYZANTINE MUSICAL SYMBOL YFEN KATO +1D07D;AL # BYZANTINE MUSICAL SYMBOL YFEN ANO +1D07E;AL # BYZANTINE MUSICAL SYMBOL STAVROS +1D07F;AL # BYZANTINE MUSICAL SYMBOL KLASMA ANO +1D080;AL # BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION +1D081;AL # BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION +1D082;AL # BYZANTINE MUSICAL SYMBOL KRATIMA ALLO +1D083;AL # BYZANTINE MUSICAL SYMBOL KRATIMA NEO +1D084;AL # BYZANTINE MUSICAL SYMBOL APODERMA NEO +1D085;AL # BYZANTINE MUSICAL SYMBOL APLI +1D086;AL # BYZANTINE MUSICAL SYMBOL DIPLI +1D087;AL # BYZANTINE MUSICAL SYMBOL TRIPLI +1D088;AL # BYZANTINE MUSICAL SYMBOL TETRAPLI +1D089;AL # BYZANTINE MUSICAL SYMBOL KORONIS +1D08A;AL # BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU +1D08B;AL # BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON +1D08C;AL # BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON +1D08D;AL # BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON +1D08E;AL # BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU +1D08F;AL # BYZANTINE MUSICAL SYMBOL GORGON NEO ANO +1D090;AL # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA +1D091;AL # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA +1D092;AL # BYZANTINE MUSICAL SYMBOL DIGORGON +1D093;AL # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO +1D094;AL # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO +1D095;AL # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA +1D096;AL # BYZANTINE MUSICAL SYMBOL TRIGORGON +1D097;AL # BYZANTINE MUSICAL SYMBOL ARGON +1D098;AL # BYZANTINE MUSICAL SYMBOL IMIDIARGON +1D099;AL # BYZANTINE MUSICAL SYMBOL DIARGON +1D09A;AL # BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI +1D09B;AL # BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI +1D09C;AL # BYZANTINE MUSICAL SYMBOL AGOGI ARGI +1D09D;AL # BYZANTINE MUSICAL SYMBOL AGOGI METRIA +1D09E;AL # BYZANTINE MUSICAL SYMBOL AGOGI MESI +1D09F;AL # BYZANTINE MUSICAL SYMBOL AGOGI GORGI +1D0A0;AL # BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI +1D0A1;AL # BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI +1D0A2;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS +1D0A3;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS +1D0A4;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS +1D0A5;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS +1D0A6;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS +1D0A7;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS +1D0A8;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS +1D0A9;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS +1D0AA;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS +1D0AB;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS +1D0AC;AL # BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS +1D0AD;AL # BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS +1D0AE;AL # BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS +1D0AF;AL # BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS +1D0B0;AL # BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS +1D0B1;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS +1D0B2;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS +1D0B3;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS +1D0B4;AL # BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN +1D0B5;AL # BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN +1D0B6;AL # BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU +1D0B7;AL # BYZANTINE MUSICAL SYMBOL IMIFONON +1D0B8;AL # BYZANTINE MUSICAL SYMBOL IMIFTHORON +1D0B9;AL # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU +1D0BA;AL # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA +1D0BB;AL # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA +1D0BC;AL # BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS +1D0BD;AL # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI +1D0BE;AL # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI +1D0BF;AL # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE +1D0C0;AL # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO +1D0C1;AL # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO +1D0C2;AL # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO +1D0C3;AL # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS +1D0C4;AL # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS +1D0C5;AL # BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS +1D0C6;AL # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI +1D0C7;AL # BYZANTINE MUSICAL SYMBOL FTHORA NENANO +1D0C8;AL # BYZANTINE MUSICAL SYMBOL CHROA ZYGOS +1D0C9;AL # BYZANTINE MUSICAL SYMBOL CHROA KLITON +1D0CA;AL # BYZANTINE MUSICAL SYMBOL CHROA SPATHI +1D0CB;AL # BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION +1D0CC;AL # BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA +1D0CD;AL # BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION +1D0CE;AL # BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION +1D0CF;AL # BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION +1D0D0;AL # BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA +1D0D1;AL # BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA +1D0D2;AL # BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA +1D0D3;AL # BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA +1D0D4;AL # BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA +1D0D5;AL # BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA +1D0D6;AL # BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA +1D0D7;AL # BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA +1D0D8;AL # BYZANTINE MUSICAL SYMBOL GENIKI DIESIS +1D0D9;AL # BYZANTINE MUSICAL SYMBOL GENIKI YFESIS +1D0DA;AL # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI +1D0DB;AL # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI +1D0DC;AL # BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI +1D0DD;AL # BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS +1D0DE;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS +1D0DF;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU +1D0E0;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU +1D0E1;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU +1D0E2;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS +1D0E3;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU +1D0E4;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU +1D0E5;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU +1D0E6;AL # BYZANTINE MUSICAL SYMBOL DIGRAMMA GG +1D0E7;AL # BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU +1D0E8;AL # BYZANTINE MUSICAL SYMBOL STIGMA +1D0E9;AL # BYZANTINE MUSICAL SYMBOL ARKTIKO PA +1D0EA;AL # BYZANTINE MUSICAL SYMBOL ARKTIKO VOU +1D0EB;AL # BYZANTINE MUSICAL SYMBOL ARKTIKO GA +1D0EC;AL # BYZANTINE MUSICAL SYMBOL ARKTIKO DI +1D0ED;AL # BYZANTINE MUSICAL SYMBOL ARKTIKO KE +1D0EE;AL # BYZANTINE MUSICAL SYMBOL ARKTIKO ZO +1D0EF;AL # BYZANTINE MUSICAL SYMBOL ARKTIKO NI +1D0F0;AL # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO +1D0F1;AL # BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO +1D0F2;AL # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO +1D0F3;AL # BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO +1D0F4;AL # BYZANTINE MUSICAL SYMBOL KLASMA KATO +1D0F5;AL # BYZANTINE MUSICAL SYMBOL GORGON NEO KATO +1D100;AL # MUSICAL SYMBOL SINGLE BARLINE +1D101;AL # MUSICAL SYMBOL DOUBLE BARLINE +1D102;AL # MUSICAL SYMBOL FINAL BARLINE +1D103;AL # MUSICAL SYMBOL REVERSE FINAL BARLINE +1D104;AL # MUSICAL SYMBOL DASHED BARLINE +1D105;AL # MUSICAL SYMBOL SHORT BARLINE +1D106;AL # MUSICAL SYMBOL LEFT REPEAT SIGN +1D107;AL # MUSICAL SYMBOL RIGHT REPEAT SIGN +1D108;AL # MUSICAL SYMBOL REPEAT DOTS +1D109;AL # MUSICAL SYMBOL DAL SEGNO +1D10A;AL # MUSICAL SYMBOL DA CAPO +1D10B;AL # MUSICAL SYMBOL SEGNO +1D10C;AL # MUSICAL SYMBOL CODA +1D10D;AL # MUSICAL SYMBOL REPEATED FIGURE-1 +1D10E;AL # MUSICAL SYMBOL REPEATED FIGURE-2 +1D10F;AL # MUSICAL SYMBOL REPEATED FIGURE-3 +1D110;AL # MUSICAL SYMBOL FERMATA +1D111;AL # MUSICAL SYMBOL FERMATA BELOW +1D112;AL # MUSICAL SYMBOL BREATH MARK +1D113;AL # MUSICAL SYMBOL CAESURA +1D114;AL # MUSICAL SYMBOL BRACE +1D115;AL # MUSICAL SYMBOL BRACKET +1D116;AL # MUSICAL SYMBOL ONE-LINE STAFF +1D117;AL # MUSICAL SYMBOL TWO-LINE STAFF +1D118;AL # MUSICAL SYMBOL THREE-LINE STAFF +1D119;AL # MUSICAL SYMBOL FOUR-LINE STAFF +1D11A;AL # MUSICAL SYMBOL FIVE-LINE STAFF +1D11B;AL # MUSICAL SYMBOL SIX-LINE STAFF +1D11C;AL # MUSICAL SYMBOL SIX-STRING FRETBOARD +1D11D;AL # MUSICAL SYMBOL FOUR-STRING FRETBOARD +1D11E;AL # MUSICAL SYMBOL G CLEF +1D11F;AL # MUSICAL SYMBOL G CLEF OTTAVA ALTA +1D120;AL # MUSICAL SYMBOL G CLEF OTTAVA BASSA +1D121;AL # MUSICAL SYMBOL C CLEF +1D122;AL # MUSICAL SYMBOL F CLEF +1D123;AL # MUSICAL SYMBOL F CLEF OTTAVA ALTA +1D124;AL # MUSICAL SYMBOL F CLEF OTTAVA BASSA +1D125;AL # MUSICAL SYMBOL DRUM CLEF-1 +1D126;AL # MUSICAL SYMBOL DRUM CLEF-2 +1D12A;AL # MUSICAL SYMBOL DOUBLE SHARP +1D12B;AL # MUSICAL SYMBOL DOUBLE FLAT +1D12C;AL # MUSICAL SYMBOL FLAT UP +1D12D;AL # MUSICAL SYMBOL FLAT DOWN +1D12E;AL # MUSICAL SYMBOL NATURAL UP +1D12F;AL # MUSICAL SYMBOL NATURAL DOWN +1D130;AL # MUSICAL SYMBOL SHARP UP +1D131;AL # MUSICAL SYMBOL SHARP DOWN +1D132;AL # MUSICAL SYMBOL QUARTER TONE SHARP +1D133;AL # MUSICAL SYMBOL QUARTER TONE FLAT +1D134;AL # MUSICAL SYMBOL COMMON TIME +1D135;AL # MUSICAL SYMBOL CUT TIME +1D136;AL # MUSICAL SYMBOL OTTAVA ALTA +1D137;AL # MUSICAL SYMBOL OTTAVA BASSA +1D138;AL # MUSICAL SYMBOL QUINDICESIMA ALTA +1D139;AL # MUSICAL SYMBOL QUINDICESIMA BASSA +1D13A;AL # MUSICAL SYMBOL MULTI REST +1D13B;AL # MUSICAL SYMBOL WHOLE REST +1D13C;AL # MUSICAL SYMBOL HALF REST +1D13D;AL # MUSICAL SYMBOL QUARTER REST +1D13E;AL # MUSICAL SYMBOL EIGHTH REST +1D13F;AL # MUSICAL SYMBOL SIXTEENTH REST +1D140;AL # MUSICAL SYMBOL THIRTY-SECOND REST +1D141;AL # MUSICAL SYMBOL SIXTY-FOURTH REST +1D142;AL # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST +1D143;AL # MUSICAL SYMBOL X NOTEHEAD +1D144;AL # MUSICAL SYMBOL PLUS NOTEHEAD +1D145;AL # MUSICAL SYMBOL CIRCLE X NOTEHEAD +1D146;AL # MUSICAL SYMBOL SQUARE NOTEHEAD WHITE +1D147;AL # MUSICAL SYMBOL SQUARE NOTEHEAD BLACK +1D148;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE +1D149;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK +1D14A;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE +1D14B;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK +1D14C;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE +1D14D;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK +1D14E;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE +1D14F;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK +1D150;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE +1D151;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK +1D152;AL # MUSICAL SYMBOL MOON NOTEHEAD WHITE +1D153;AL # MUSICAL SYMBOL MOON NOTEHEAD BLACK +1D154;AL # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE +1D155;AL # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK +1D156;AL # MUSICAL SYMBOL PARENTHESIS NOTEHEAD +1D157;AL # MUSICAL SYMBOL VOID NOTEHEAD +1D158;AL # MUSICAL SYMBOL NOTEHEAD BLACK +1D159;AL # MUSICAL SYMBOL NULL NOTEHEAD +1D15A;AL # MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE +1D15B;AL # MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK +1D15C;AL # MUSICAL SYMBOL BREVE +1D15D;AL # MUSICAL SYMBOL WHOLE NOTE +1D15E;AL # MUSICAL SYMBOL HALF NOTE +1D15F;AL # MUSICAL SYMBOL QUARTER NOTE +1D160;AL # MUSICAL SYMBOL EIGHTH NOTE +1D161;AL # MUSICAL SYMBOL SIXTEENTH NOTE +1D162;AL # MUSICAL SYMBOL THIRTY-SECOND NOTE +1D163;AL # MUSICAL SYMBOL SIXTY-FOURTH NOTE +1D164;AL # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D165;CM # MUSICAL SYMBOL COMBINING STEM +1D166;CM # MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +1D167;CM # MUSICAL SYMBOL COMBINING TREMOLO-1 +1D168;CM # MUSICAL SYMBOL COMBINING TREMOLO-2 +1D169;CM # MUSICAL SYMBOL COMBINING TREMOLO-3 +1D16A;AL # MUSICAL SYMBOL FINGERED TREMOLO-1 +1D16B;AL # MUSICAL SYMBOL FINGERED TREMOLO-2 +1D16C;AL # MUSICAL SYMBOL FINGERED TREMOLO-3 +1D16D;CM # MUSICAL SYMBOL COMBINING AUGMENTATION DOT +1D16E;CM # MUSICAL SYMBOL COMBINING FLAG-1 +1D16F;CM # MUSICAL SYMBOL COMBINING FLAG-2 +1D170;CM # MUSICAL SYMBOL COMBINING FLAG-3 +1D171;CM # MUSICAL SYMBOL COMBINING FLAG-4 +1D172;CM # MUSICAL SYMBOL COMBINING FLAG-5 +1D173;CM # MUSICAL SYMBOL BEGIN BEAM +1D174;CM # MUSICAL SYMBOL END BEAM +1D175;CM # MUSICAL SYMBOL BEGIN TIE +1D176;CM # MUSICAL SYMBOL END TIE +1D177;CM # MUSICAL SYMBOL BEGIN SLUR +1D178;CM # MUSICAL SYMBOL END SLUR +1D179;CM # MUSICAL SYMBOL BEGIN PHRASE +1D17A;CM # MUSICAL SYMBOL END PHRASE +1D17B;CM # MUSICAL SYMBOL COMBINING ACCENT +1D17C;CM # MUSICAL SYMBOL COMBINING STACCATO +1D17D;CM # MUSICAL SYMBOL COMBINING TENUTO +1D17E;CM # MUSICAL SYMBOL COMBINING STACCATISSIMO +1D17F;CM # MUSICAL SYMBOL COMBINING MARCATO +1D180;CM # MUSICAL SYMBOL COMBINING MARCATO-STACCATO +1D181;CM # MUSICAL SYMBOL COMBINING ACCENT-STACCATO +1D182;CM # MUSICAL SYMBOL COMBINING LOURE +1D183;AL # MUSICAL SYMBOL ARPEGGIATO UP +1D184;AL # MUSICAL SYMBOL ARPEGGIATO DOWN +1D185;CM # MUSICAL SYMBOL COMBINING DOIT +1D186;CM # MUSICAL SYMBOL COMBINING RIP +1D187;CM # MUSICAL SYMBOL COMBINING FLIP +1D188;CM # MUSICAL SYMBOL COMBINING SMEAR +1D189;CM # MUSICAL SYMBOL COMBINING BEND +1D18A;CM # MUSICAL SYMBOL COMBINING DOUBLE TONGUE +1D18B;CM # MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D18C;AL # MUSICAL SYMBOL RINFORZANDO +1D18D;AL # MUSICAL SYMBOL SUBITO +1D18E;AL # MUSICAL SYMBOL Z +1D18F;AL # MUSICAL SYMBOL PIANO +1D190;AL # MUSICAL SYMBOL MEZZO +1D191;AL # MUSICAL SYMBOL FORTE +1D192;AL # MUSICAL SYMBOL CRESCENDO +1D193;AL # MUSICAL SYMBOL DECRESCENDO +1D194;AL # MUSICAL SYMBOL GRACE NOTE SLASH +1D195;AL # MUSICAL SYMBOL GRACE NOTE NO SLASH +1D196;AL # MUSICAL SYMBOL TR +1D197;AL # MUSICAL SYMBOL TURN +1D198;AL # MUSICAL SYMBOL INVERTED TURN +1D199;AL # MUSICAL SYMBOL TURN SLASH +1D19A;AL # MUSICAL SYMBOL TURN UP +1D19B;AL # MUSICAL SYMBOL ORNAMENT STROKE-1 +1D19C;AL # MUSICAL SYMBOL ORNAMENT STROKE-2 +1D19D;AL # MUSICAL SYMBOL ORNAMENT STROKE-3 +1D19E;AL # MUSICAL SYMBOL ORNAMENT STROKE-4 +1D19F;AL # MUSICAL SYMBOL ORNAMENT STROKE-5 +1D1A0;AL # MUSICAL SYMBOL ORNAMENT STROKE-6 +1D1A1;AL # MUSICAL SYMBOL ORNAMENT STROKE-7 +1D1A2;AL # MUSICAL SYMBOL ORNAMENT STROKE-8 +1D1A3;AL # MUSICAL SYMBOL ORNAMENT STROKE-9 +1D1A4;AL # MUSICAL SYMBOL ORNAMENT STROKE-10 +1D1A5;AL # MUSICAL SYMBOL ORNAMENT STROKE-11 +1D1A6;AL # MUSICAL SYMBOL HAUPTSTIMME +1D1A7;AL # MUSICAL SYMBOL NEBENSTIMME +1D1A8;AL # MUSICAL SYMBOL END OF STIMME +1D1A9;AL # MUSICAL SYMBOL DEGREE SLASH +1D1AA;CM # MUSICAL SYMBOL COMBINING DOWN BOW +1D1AB;CM # MUSICAL SYMBOL COMBINING UP BOW +1D1AC;CM # MUSICAL SYMBOL COMBINING HARMONIC +1D1AD;CM # MUSICAL SYMBOL COMBINING SNAP PIZZICATO +1D1AE;AL # MUSICAL SYMBOL PEDAL MARK +1D1AF;AL # MUSICAL SYMBOL PEDAL UP MARK +1D1B0;AL # MUSICAL SYMBOL HALF PEDAL MARK +1D1B1;AL # MUSICAL SYMBOL GLISSANDO UP +1D1B2;AL # MUSICAL SYMBOL GLISSANDO DOWN +1D1B3;AL # MUSICAL SYMBOL WITH FINGERNAILS +1D1B4;AL # MUSICAL SYMBOL DAMP +1D1B5;AL # MUSICAL SYMBOL DAMP ALL +1D1B6;AL # MUSICAL SYMBOL MAXIMA +1D1B7;AL # MUSICAL SYMBOL LONGA +1D1B8;AL # MUSICAL SYMBOL BREVIS +1D1B9;AL # MUSICAL SYMBOL SEMIBREVIS WHITE +1D1BA;AL # MUSICAL SYMBOL SEMIBREVIS BLACK +1D1BB;AL # MUSICAL SYMBOL MINIMA +1D1BC;AL # MUSICAL SYMBOL MINIMA BLACK +1D1BD;AL # MUSICAL SYMBOL SEMIMINIMA WHITE +1D1BE;AL # MUSICAL SYMBOL SEMIMINIMA BLACK +1D1BF;AL # MUSICAL SYMBOL FUSA WHITE +1D1C0;AL # MUSICAL SYMBOL FUSA BLACK +1D1C1;AL # MUSICAL SYMBOL LONGA PERFECTA REST +1D1C2;AL # MUSICAL SYMBOL LONGA IMPERFECTA REST +1D1C3;AL # MUSICAL SYMBOL BREVIS REST +1D1C4;AL # MUSICAL SYMBOL SEMIBREVIS REST +1D1C5;AL # MUSICAL SYMBOL MINIMA REST +1D1C6;AL # MUSICAL SYMBOL SEMIMINIMA REST +1D1C7;AL # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA +1D1C8;AL # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA +1D1C9;AL # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1 +1D1CA;AL # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA +1D1CB;AL # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA +1D1CC;AL # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1 +1D1CD;AL # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2 +1D1CE;AL # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3 +1D1CF;AL # MUSICAL SYMBOL CROIX +1D1D0;AL # MUSICAL SYMBOL GREGORIAN C CLEF +1D1D1;AL # MUSICAL SYMBOL GREGORIAN F CLEF +1D1D2;AL # MUSICAL SYMBOL SQUARE B +1D1D3;AL # MUSICAL SYMBOL VIRGA +1D1D4;AL # MUSICAL SYMBOL PODATUS +1D1D5;AL # MUSICAL SYMBOL CLIVIS +1D1D6;AL # MUSICAL SYMBOL SCANDICUS +1D1D7;AL # MUSICAL SYMBOL CLIMACUS +1D1D8;AL # MUSICAL SYMBOL TORCULUS +1D1D9;AL # MUSICAL SYMBOL PORRECTUS +1D1DA;AL # MUSICAL SYMBOL PORRECTUS FLEXUS +1D1DB;AL # MUSICAL SYMBOL SCANDICUS FLEXUS +1D1DC;AL # MUSICAL SYMBOL TORCULUS RESUPINUS +1D1DD;AL # MUSICAL SYMBOL PES SUBPUNCTIS +1D400;AL # MATHEMATICAL BOLD CAPITAL A +1D401;AL # MATHEMATICAL BOLD CAPITAL B +1D402;AL # MATHEMATICAL BOLD CAPITAL C +1D403;AL # MATHEMATICAL BOLD CAPITAL D +1D404;AL # MATHEMATICAL BOLD CAPITAL E +1D405;AL # MATHEMATICAL BOLD CAPITAL F +1D406;AL # MATHEMATICAL BOLD CAPITAL G +1D407;AL # MATHEMATICAL BOLD CAPITAL H +1D408;AL # MATHEMATICAL BOLD CAPITAL I +1D409;AL # MATHEMATICAL BOLD CAPITAL J +1D40A;AL # MATHEMATICAL BOLD CAPITAL K +1D40B;AL # MATHEMATICAL BOLD CAPITAL L +1D40C;AL # MATHEMATICAL BOLD CAPITAL M +1D40D;AL # MATHEMATICAL BOLD CAPITAL N +1D40E;AL # MATHEMATICAL BOLD CAPITAL O +1D40F;AL # MATHEMATICAL BOLD CAPITAL P +1D410;AL # MATHEMATICAL BOLD CAPITAL Q +1D411;AL # MATHEMATICAL BOLD CAPITAL R +1D412;AL # MATHEMATICAL BOLD CAPITAL S +1D413;AL # MATHEMATICAL BOLD CAPITAL T +1D414;AL # MATHEMATICAL BOLD CAPITAL U +1D415;AL # MATHEMATICAL BOLD CAPITAL V +1D416;AL # MATHEMATICAL BOLD CAPITAL W +1D417;AL # MATHEMATICAL BOLD CAPITAL X +1D418;AL # MATHEMATICAL BOLD CAPITAL Y +1D419;AL # MATHEMATICAL BOLD CAPITAL Z +1D41A;AL # MATHEMATICAL BOLD SMALL A +1D41B;AL # MATHEMATICAL BOLD SMALL B +1D41C;AL # MATHEMATICAL BOLD SMALL C +1D41D;AL # MATHEMATICAL BOLD SMALL D +1D41E;AL # MATHEMATICAL BOLD SMALL E +1D41F;AL # MATHEMATICAL BOLD SMALL F +1D420;AL # MATHEMATICAL BOLD SMALL G +1D421;AL # MATHEMATICAL BOLD SMALL H +1D422;AL # MATHEMATICAL BOLD SMALL I +1D423;AL # MATHEMATICAL BOLD SMALL J +1D424;AL # MATHEMATICAL BOLD SMALL K +1D425;AL # MATHEMATICAL BOLD SMALL L +1D426;AL # MATHEMATICAL BOLD SMALL M +1D427;AL # MATHEMATICAL BOLD SMALL N +1D428;AL # MATHEMATICAL BOLD SMALL O +1D429;AL # MATHEMATICAL BOLD SMALL P +1D42A;AL # MATHEMATICAL BOLD SMALL Q +1D42B;AL # MATHEMATICAL BOLD SMALL R +1D42C;AL # MATHEMATICAL BOLD SMALL S +1D42D;AL # MATHEMATICAL BOLD SMALL T +1D42E;AL # MATHEMATICAL BOLD SMALL U +1D42F;AL # MATHEMATICAL BOLD SMALL V +1D430;AL # MATHEMATICAL BOLD SMALL W +1D431;AL # MATHEMATICAL BOLD SMALL X +1D432;AL # MATHEMATICAL BOLD SMALL Y +1D433;AL # MATHEMATICAL BOLD SMALL Z +1D434;AL # MATHEMATICAL ITALIC CAPITAL A +1D435;AL # MATHEMATICAL ITALIC CAPITAL B +1D436;AL # MATHEMATICAL ITALIC CAPITAL C +1D437;AL # MATHEMATICAL ITALIC CAPITAL D +1D438;AL # MATHEMATICAL ITALIC CAPITAL E +1D439;AL # MATHEMATICAL ITALIC CAPITAL F +1D43A;AL # MATHEMATICAL ITALIC CAPITAL G +1D43B;AL # MATHEMATICAL ITALIC CAPITAL H +1D43C;AL # MATHEMATICAL ITALIC CAPITAL I +1D43D;AL # MATHEMATICAL ITALIC CAPITAL J +1D43E;AL # MATHEMATICAL ITALIC CAPITAL K +1D43F;AL # MATHEMATICAL ITALIC CAPITAL L +1D440;AL # MATHEMATICAL ITALIC CAPITAL M +1D441;AL # MATHEMATICAL ITALIC CAPITAL N +1D442;AL # MATHEMATICAL ITALIC CAPITAL O +1D443;AL # MATHEMATICAL ITALIC CAPITAL P +1D444;AL # MATHEMATICAL ITALIC CAPITAL Q +1D445;AL # MATHEMATICAL ITALIC CAPITAL R +1D446;AL # MATHEMATICAL ITALIC CAPITAL S +1D447;AL # MATHEMATICAL ITALIC CAPITAL T +1D448;AL # MATHEMATICAL ITALIC CAPITAL U +1D449;AL # MATHEMATICAL ITALIC CAPITAL V +1D44A;AL # MATHEMATICAL ITALIC CAPITAL W +1D44B;AL # MATHEMATICAL ITALIC CAPITAL X +1D44C;AL # MATHEMATICAL ITALIC CAPITAL Y +1D44D;AL # MATHEMATICAL ITALIC CAPITAL Z +1D44E;AL # MATHEMATICAL ITALIC SMALL A +1D44F;AL # MATHEMATICAL ITALIC SMALL B +1D450;AL # MATHEMATICAL ITALIC SMALL C +1D451;AL # MATHEMATICAL ITALIC SMALL D +1D452;AL # MATHEMATICAL ITALIC SMALL E +1D453;AL # MATHEMATICAL ITALIC SMALL F +1D454;AL # MATHEMATICAL ITALIC SMALL G +1D456;AL # MATHEMATICAL ITALIC SMALL I +1D457;AL # MATHEMATICAL ITALIC SMALL J +1D458;AL # MATHEMATICAL ITALIC SMALL K +1D459;AL # MATHEMATICAL ITALIC SMALL L +1D45A;AL # MATHEMATICAL ITALIC SMALL M +1D45B;AL # MATHEMATICAL ITALIC SMALL N +1D45C;AL # MATHEMATICAL ITALIC SMALL O +1D45D;AL # MATHEMATICAL ITALIC SMALL P +1D45E;AL # MATHEMATICAL ITALIC SMALL Q +1D45F;AL # MATHEMATICAL ITALIC SMALL R +1D460;AL # MATHEMATICAL ITALIC SMALL S +1D461;AL # MATHEMATICAL ITALIC SMALL T +1D462;AL # MATHEMATICAL ITALIC SMALL U +1D463;AL # MATHEMATICAL ITALIC SMALL V +1D464;AL # MATHEMATICAL ITALIC SMALL W +1D465;AL # MATHEMATICAL ITALIC SMALL X +1D466;AL # MATHEMATICAL ITALIC SMALL Y +1D467;AL # MATHEMATICAL ITALIC SMALL Z +1D468;AL # MATHEMATICAL BOLD ITALIC CAPITAL A +1D469;AL # MATHEMATICAL BOLD ITALIC CAPITAL B +1D46A;AL # MATHEMATICAL BOLD ITALIC CAPITAL C +1D46B;AL # MATHEMATICAL BOLD ITALIC CAPITAL D +1D46C;AL # MATHEMATICAL BOLD ITALIC CAPITAL E +1D46D;AL # MATHEMATICAL BOLD ITALIC CAPITAL F +1D46E;AL # MATHEMATICAL BOLD ITALIC CAPITAL G +1D46F;AL # MATHEMATICAL BOLD ITALIC CAPITAL H +1D470;AL # MATHEMATICAL BOLD ITALIC CAPITAL I +1D471;AL # MATHEMATICAL BOLD ITALIC CAPITAL J +1D472;AL # MATHEMATICAL BOLD ITALIC CAPITAL K +1D473;AL # MATHEMATICAL BOLD ITALIC CAPITAL L +1D474;AL # MATHEMATICAL BOLD ITALIC CAPITAL M +1D475;AL # MATHEMATICAL BOLD ITALIC CAPITAL N +1D476;AL # MATHEMATICAL BOLD ITALIC CAPITAL O +1D477;AL # MATHEMATICAL BOLD ITALIC CAPITAL P +1D478;AL # MATHEMATICAL BOLD ITALIC CAPITAL Q +1D479;AL # MATHEMATICAL BOLD ITALIC CAPITAL R +1D47A;AL # MATHEMATICAL BOLD ITALIC CAPITAL S +1D47B;AL # MATHEMATICAL BOLD ITALIC CAPITAL T +1D47C;AL # MATHEMATICAL BOLD ITALIC CAPITAL U +1D47D;AL # MATHEMATICAL BOLD ITALIC CAPITAL V +1D47E;AL # MATHEMATICAL BOLD ITALIC CAPITAL W +1D47F;AL # MATHEMATICAL BOLD ITALIC CAPITAL X +1D480;AL # MATHEMATICAL BOLD ITALIC CAPITAL Y +1D481;AL # MATHEMATICAL BOLD ITALIC CAPITAL Z +1D482;AL # MATHEMATICAL BOLD ITALIC SMALL A +1D483;AL # MATHEMATICAL BOLD ITALIC SMALL B +1D484;AL # MATHEMATICAL BOLD ITALIC SMALL C +1D485;AL # MATHEMATICAL BOLD ITALIC SMALL D +1D486;AL # MATHEMATICAL BOLD ITALIC SMALL E +1D487;AL # MATHEMATICAL BOLD ITALIC SMALL F +1D488;AL # MATHEMATICAL BOLD ITALIC SMALL G +1D489;AL # MATHEMATICAL BOLD ITALIC SMALL H +1D48A;AL # MATHEMATICAL BOLD ITALIC SMALL I +1D48B;AL # MATHEMATICAL BOLD ITALIC SMALL J +1D48C;AL # MATHEMATICAL BOLD ITALIC SMALL K +1D48D;AL # MATHEMATICAL BOLD ITALIC SMALL L +1D48E;AL # MATHEMATICAL BOLD ITALIC SMALL M +1D48F;AL # MATHEMATICAL BOLD ITALIC SMALL N +1D490;AL # MATHEMATICAL BOLD ITALIC SMALL O +1D491;AL # MATHEMATICAL BOLD ITALIC SMALL P +1D492;AL # MATHEMATICAL BOLD ITALIC SMALL Q +1D493;AL # MATHEMATICAL BOLD ITALIC SMALL R +1D494;AL # MATHEMATICAL BOLD ITALIC SMALL S +1D495;AL # MATHEMATICAL BOLD ITALIC SMALL T +1D496;AL # MATHEMATICAL BOLD ITALIC SMALL U +1D497;AL # MATHEMATICAL BOLD ITALIC SMALL V +1D498;AL # MATHEMATICAL BOLD ITALIC SMALL W +1D499;AL # MATHEMATICAL BOLD ITALIC SMALL X +1D49A;AL # MATHEMATICAL BOLD ITALIC SMALL Y +1D49B;AL # MATHEMATICAL BOLD ITALIC SMALL Z +1D49C;AL # MATHEMATICAL SCRIPT CAPITAL A +1D49E;AL # MATHEMATICAL SCRIPT CAPITAL C +1D49F;AL # MATHEMATICAL SCRIPT CAPITAL D +1D4A2;AL # MATHEMATICAL SCRIPT CAPITAL G +1D4A5;AL # MATHEMATICAL SCRIPT CAPITAL J +1D4A6;AL # MATHEMATICAL SCRIPT CAPITAL K +1D4A9;AL # MATHEMATICAL SCRIPT CAPITAL N +1D4AA;AL # MATHEMATICAL SCRIPT CAPITAL O +1D4AB;AL # MATHEMATICAL SCRIPT CAPITAL P +1D4AC;AL # MATHEMATICAL SCRIPT CAPITAL Q +1D4AE;AL # MATHEMATICAL SCRIPT CAPITAL S +1D4AF;AL # MATHEMATICAL SCRIPT CAPITAL T +1D4B0;AL # MATHEMATICAL SCRIPT CAPITAL U +1D4B1;AL # MATHEMATICAL SCRIPT CAPITAL V +1D4B2;AL # MATHEMATICAL SCRIPT CAPITAL W +1D4B3;AL # MATHEMATICAL SCRIPT CAPITAL X +1D4B4;AL # MATHEMATICAL SCRIPT CAPITAL Y +1D4B5;AL # MATHEMATICAL SCRIPT CAPITAL Z +1D4B6;AL # MATHEMATICAL SCRIPT SMALL A +1D4B7;AL # MATHEMATICAL SCRIPT SMALL B +1D4B8;AL # MATHEMATICAL SCRIPT SMALL C +1D4B9;AL # MATHEMATICAL SCRIPT SMALL D +1D4BB;AL # MATHEMATICAL SCRIPT SMALL F +1D4BD;AL # MATHEMATICAL SCRIPT SMALL H +1D4BE;AL # MATHEMATICAL SCRIPT SMALL I +1D4BF;AL # MATHEMATICAL SCRIPT SMALL J +1D4C0;AL # MATHEMATICAL SCRIPT SMALL K +1D4C2;AL # MATHEMATICAL SCRIPT SMALL M +1D4C3;AL # MATHEMATICAL SCRIPT SMALL N +1D4C5;AL # MATHEMATICAL SCRIPT SMALL P +1D4C6;AL # MATHEMATICAL SCRIPT SMALL Q +1D4C7;AL # MATHEMATICAL SCRIPT SMALL R +1D4C8;AL # MATHEMATICAL SCRIPT SMALL S +1D4C9;AL # MATHEMATICAL SCRIPT SMALL T +1D4CA;AL # MATHEMATICAL SCRIPT SMALL U +1D4CB;AL # MATHEMATICAL SCRIPT SMALL V +1D4CC;AL # MATHEMATICAL SCRIPT SMALL W +1D4CD;AL # MATHEMATICAL SCRIPT SMALL X +1D4CE;AL # MATHEMATICAL SCRIPT SMALL Y +1D4CF;AL # MATHEMATICAL SCRIPT SMALL Z +1D4D0;AL # MATHEMATICAL BOLD SCRIPT CAPITAL A +1D4D1;AL # MATHEMATICAL BOLD SCRIPT CAPITAL B +1D4D2;AL # MATHEMATICAL BOLD SCRIPT CAPITAL C +1D4D3;AL # MATHEMATICAL BOLD SCRIPT CAPITAL D +1D4D4;AL # MATHEMATICAL BOLD SCRIPT CAPITAL E +1D4D5;AL # MATHEMATICAL BOLD SCRIPT CAPITAL F +1D4D6;AL # MATHEMATICAL BOLD SCRIPT CAPITAL G +1D4D7;AL # MATHEMATICAL BOLD SCRIPT CAPITAL H +1D4D8;AL # MATHEMATICAL BOLD SCRIPT CAPITAL I +1D4D9;AL # MATHEMATICAL BOLD SCRIPT CAPITAL J +1D4DA;AL # MATHEMATICAL BOLD SCRIPT CAPITAL K +1D4DB;AL # MATHEMATICAL BOLD SCRIPT CAPITAL L +1D4DC;AL # MATHEMATICAL BOLD SCRIPT CAPITAL M +1D4DD;AL # MATHEMATICAL BOLD SCRIPT CAPITAL N +1D4DE;AL # MATHEMATICAL BOLD SCRIPT CAPITAL O +1D4DF;AL # MATHEMATICAL BOLD SCRIPT CAPITAL P +1D4E0;AL # MATHEMATICAL BOLD SCRIPT CAPITAL Q +1D4E1;AL # MATHEMATICAL BOLD SCRIPT CAPITAL R +1D4E2;AL # MATHEMATICAL BOLD SCRIPT CAPITAL S +1D4E3;AL # MATHEMATICAL BOLD SCRIPT CAPITAL T +1D4E4;AL # MATHEMATICAL BOLD SCRIPT CAPITAL U +1D4E5;AL # MATHEMATICAL BOLD SCRIPT CAPITAL V +1D4E6;AL # MATHEMATICAL BOLD SCRIPT CAPITAL W +1D4E7;AL # MATHEMATICAL BOLD SCRIPT CAPITAL X +1D4E8;AL # MATHEMATICAL BOLD SCRIPT CAPITAL Y +1D4E9;AL # MATHEMATICAL BOLD SCRIPT CAPITAL Z +1D4EA;AL # MATHEMATICAL BOLD SCRIPT SMALL A +1D4EB;AL # MATHEMATICAL BOLD SCRIPT SMALL B +1D4EC;AL # MATHEMATICAL BOLD SCRIPT SMALL C +1D4ED;AL # MATHEMATICAL BOLD SCRIPT SMALL D +1D4EE;AL # MATHEMATICAL BOLD SCRIPT SMALL E +1D4EF;AL # MATHEMATICAL BOLD SCRIPT SMALL F +1D4F0;AL # MATHEMATICAL BOLD SCRIPT SMALL G +1D4F1;AL # MATHEMATICAL BOLD SCRIPT SMALL H +1D4F2;AL # MATHEMATICAL BOLD SCRIPT SMALL I +1D4F3;AL # MATHEMATICAL BOLD SCRIPT SMALL J +1D4F4;AL # MATHEMATICAL BOLD SCRIPT SMALL K +1D4F5;AL # MATHEMATICAL BOLD SCRIPT SMALL L +1D4F6;AL # MATHEMATICAL BOLD SCRIPT SMALL M +1D4F7;AL # MATHEMATICAL BOLD SCRIPT SMALL N +1D4F8;AL # MATHEMATICAL BOLD SCRIPT SMALL O +1D4F9;AL # MATHEMATICAL BOLD SCRIPT SMALL P +1D4FA;AL # MATHEMATICAL BOLD SCRIPT SMALL Q +1D4FB;AL # MATHEMATICAL BOLD SCRIPT SMALL R +1D4FC;AL # MATHEMATICAL BOLD SCRIPT SMALL S +1D4FD;AL # MATHEMATICAL BOLD SCRIPT SMALL T +1D4FE;AL # MATHEMATICAL BOLD SCRIPT SMALL U +1D4FF;AL # MATHEMATICAL BOLD SCRIPT SMALL V +1D500;AL # MATHEMATICAL BOLD SCRIPT SMALL W +1D501;AL # MATHEMATICAL BOLD SCRIPT SMALL X +1D502;AL # MATHEMATICAL BOLD SCRIPT SMALL Y +1D503;AL # MATHEMATICAL BOLD SCRIPT SMALL Z +1D504;AL # MATHEMATICAL FRAKTUR CAPITAL A +1D505;AL # MATHEMATICAL FRAKTUR CAPITAL B +1D507;AL # MATHEMATICAL FRAKTUR CAPITAL D +1D508;AL # MATHEMATICAL FRAKTUR CAPITAL E +1D509;AL # MATHEMATICAL FRAKTUR CAPITAL F +1D50A;AL # MATHEMATICAL FRAKTUR CAPITAL G +1D50D;AL # MATHEMATICAL FRAKTUR CAPITAL J +1D50E;AL # MATHEMATICAL FRAKTUR CAPITAL K +1D50F;AL # MATHEMATICAL FRAKTUR CAPITAL L +1D510;AL # MATHEMATICAL FRAKTUR CAPITAL M +1D511;AL # MATHEMATICAL FRAKTUR CAPITAL N +1D512;AL # MATHEMATICAL FRAKTUR CAPITAL O +1D513;AL # MATHEMATICAL FRAKTUR CAPITAL P +1D514;AL # MATHEMATICAL FRAKTUR CAPITAL Q +1D516;AL # MATHEMATICAL FRAKTUR CAPITAL S +1D517;AL # MATHEMATICAL FRAKTUR CAPITAL T +1D518;AL # MATHEMATICAL FRAKTUR CAPITAL U +1D519;AL # MATHEMATICAL FRAKTUR CAPITAL V +1D51A;AL # MATHEMATICAL FRAKTUR CAPITAL W +1D51B;AL # MATHEMATICAL FRAKTUR CAPITAL X +1D51C;AL # MATHEMATICAL FRAKTUR CAPITAL Y +1D51E;AL # MATHEMATICAL FRAKTUR SMALL A +1D51F;AL # MATHEMATICAL FRAKTUR SMALL B +1D520;AL # MATHEMATICAL FRAKTUR SMALL C +1D521;AL # MATHEMATICAL FRAKTUR SMALL D +1D522;AL # MATHEMATICAL FRAKTUR SMALL E +1D523;AL # MATHEMATICAL FRAKTUR SMALL F +1D524;AL # MATHEMATICAL FRAKTUR SMALL G +1D525;AL # MATHEMATICAL FRAKTUR SMALL H +1D526;AL # MATHEMATICAL FRAKTUR SMALL I +1D527;AL # MATHEMATICAL FRAKTUR SMALL J +1D528;AL # MATHEMATICAL FRAKTUR SMALL K +1D529;AL # MATHEMATICAL FRAKTUR SMALL L +1D52A;AL # MATHEMATICAL FRAKTUR SMALL M +1D52B;AL # MATHEMATICAL FRAKTUR SMALL N +1D52C;AL # MATHEMATICAL FRAKTUR SMALL O +1D52D;AL # MATHEMATICAL FRAKTUR SMALL P +1D52E;AL # MATHEMATICAL FRAKTUR SMALL Q +1D52F;AL # MATHEMATICAL FRAKTUR SMALL R +1D530;AL # MATHEMATICAL FRAKTUR SMALL S +1D531;AL # MATHEMATICAL FRAKTUR SMALL T +1D532;AL # MATHEMATICAL FRAKTUR SMALL U +1D533;AL # MATHEMATICAL FRAKTUR SMALL V +1D534;AL # MATHEMATICAL FRAKTUR SMALL W +1D535;AL # MATHEMATICAL FRAKTUR SMALL X +1D536;AL # MATHEMATICAL FRAKTUR SMALL Y +1D537;AL # MATHEMATICAL FRAKTUR SMALL Z +1D538;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL A +1D539;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL D +1D53C;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL E +1D53D;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL F +1D53E;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL I +1D541;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL J +1D542;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL K +1D543;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL L +1D544;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL S +1D54B;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL T +1D54C;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL U +1D54D;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL V +1D54E;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL W +1D54F;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL X +1D550;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552;AL # MATHEMATICAL DOUBLE-STRUCK SMALL A +1D553;AL # MATHEMATICAL DOUBLE-STRUCK SMALL B +1D554;AL # MATHEMATICAL DOUBLE-STRUCK SMALL C +1D555;AL # MATHEMATICAL DOUBLE-STRUCK SMALL D +1D556;AL # MATHEMATICAL DOUBLE-STRUCK SMALL E +1D557;AL # MATHEMATICAL DOUBLE-STRUCK SMALL F +1D558;AL # MATHEMATICAL DOUBLE-STRUCK SMALL G +1D559;AL # MATHEMATICAL DOUBLE-STRUCK SMALL H +1D55A;AL # MATHEMATICAL DOUBLE-STRUCK SMALL I +1D55B;AL # MATHEMATICAL DOUBLE-STRUCK SMALL J +1D55C;AL # MATHEMATICAL DOUBLE-STRUCK SMALL K +1D55D;AL # MATHEMATICAL DOUBLE-STRUCK SMALL L +1D55E;AL # MATHEMATICAL DOUBLE-STRUCK SMALL M +1D55F;AL # MATHEMATICAL DOUBLE-STRUCK SMALL N +1D560;AL # MATHEMATICAL DOUBLE-STRUCK SMALL O +1D561;AL # MATHEMATICAL DOUBLE-STRUCK SMALL P +1D562;AL # MATHEMATICAL DOUBLE-STRUCK SMALL Q +1D563;AL # MATHEMATICAL DOUBLE-STRUCK SMALL R +1D564;AL # MATHEMATICAL DOUBLE-STRUCK SMALL S +1D565;AL # MATHEMATICAL DOUBLE-STRUCK SMALL T +1D566;AL # MATHEMATICAL DOUBLE-STRUCK SMALL U +1D567;AL # MATHEMATICAL DOUBLE-STRUCK SMALL V +1D568;AL # MATHEMATICAL DOUBLE-STRUCK SMALL W +1D569;AL # MATHEMATICAL DOUBLE-STRUCK SMALL X +1D56A;AL # MATHEMATICAL DOUBLE-STRUCK SMALL Y +1D56B;AL # MATHEMATICAL DOUBLE-STRUCK SMALL Z +1D56C;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL A +1D56D;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL B +1D56E;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL C +1D56F;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL D +1D570;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL E +1D571;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL F +1D572;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL G +1D573;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL H +1D574;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL I +1D575;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL J +1D576;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL K +1D577;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL L +1D578;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL M +1D579;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL N +1D57A;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL O +1D57B;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL P +1D57C;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL Q +1D57D;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL R +1D57E;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL S +1D57F;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL T +1D580;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL U +1D581;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL V +1D582;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL W +1D583;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL X +1D584;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL Y +1D585;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL Z +1D586;AL # MATHEMATICAL BOLD FRAKTUR SMALL A +1D587;AL # MATHEMATICAL BOLD FRAKTUR SMALL B +1D588;AL # MATHEMATICAL BOLD FRAKTUR SMALL C +1D589;AL # MATHEMATICAL BOLD FRAKTUR SMALL D +1D58A;AL # MATHEMATICAL BOLD FRAKTUR SMALL E +1D58B;AL # MATHEMATICAL BOLD FRAKTUR SMALL F +1D58C;AL # MATHEMATICAL BOLD FRAKTUR SMALL G +1D58D;AL # MATHEMATICAL BOLD FRAKTUR SMALL H +1D58E;AL # MATHEMATICAL BOLD FRAKTUR SMALL I +1D58F;AL # MATHEMATICAL BOLD FRAKTUR SMALL J +1D590;AL # MATHEMATICAL BOLD FRAKTUR SMALL K +1D591;AL # MATHEMATICAL BOLD FRAKTUR SMALL L +1D592;AL # MATHEMATICAL BOLD FRAKTUR SMALL M +1D593;AL # MATHEMATICAL BOLD FRAKTUR SMALL N +1D594;AL # MATHEMATICAL BOLD FRAKTUR SMALL O +1D595;AL # MATHEMATICAL BOLD FRAKTUR SMALL P +1D596;AL # MATHEMATICAL BOLD FRAKTUR SMALL Q +1D597;AL # MATHEMATICAL BOLD FRAKTUR SMALL R +1D598;AL # MATHEMATICAL BOLD FRAKTUR SMALL S +1D599;AL # MATHEMATICAL BOLD FRAKTUR SMALL T +1D59A;AL # MATHEMATICAL BOLD FRAKTUR SMALL U +1D59B;AL # MATHEMATICAL BOLD FRAKTUR SMALL V +1D59C;AL # MATHEMATICAL BOLD FRAKTUR SMALL W +1D59D;AL # MATHEMATICAL BOLD FRAKTUR SMALL X +1D59E;AL # MATHEMATICAL BOLD FRAKTUR SMALL Y +1D59F;AL # MATHEMATICAL BOLD FRAKTUR SMALL Z +1D5A0;AL # MATHEMATICAL SANS-SERIF CAPITAL A +1D5A1;AL # MATHEMATICAL SANS-SERIF CAPITAL B +1D5A2;AL # MATHEMATICAL SANS-SERIF CAPITAL C +1D5A3;AL # MATHEMATICAL SANS-SERIF CAPITAL D +1D5A4;AL # MATHEMATICAL SANS-SERIF CAPITAL E +1D5A5;AL # MATHEMATICAL SANS-SERIF CAPITAL F +1D5A6;AL # MATHEMATICAL SANS-SERIF CAPITAL G +1D5A7;AL # MATHEMATICAL SANS-SERIF CAPITAL H +1D5A8;AL # MATHEMATICAL SANS-SERIF CAPITAL I +1D5A9;AL # MATHEMATICAL SANS-SERIF CAPITAL J +1D5AA;AL # MATHEMATICAL SANS-SERIF CAPITAL K +1D5AB;AL # MATHEMATICAL SANS-SERIF CAPITAL L +1D5AC;AL # MATHEMATICAL SANS-SERIF CAPITAL M +1D5AD;AL # MATHEMATICAL SANS-SERIF CAPITAL N +1D5AE;AL # MATHEMATICAL SANS-SERIF CAPITAL O +1D5AF;AL # MATHEMATICAL SANS-SERIF CAPITAL P +1D5B0;AL # MATHEMATICAL SANS-SERIF CAPITAL Q +1D5B1;AL # MATHEMATICAL SANS-SERIF CAPITAL R +1D5B2;AL # MATHEMATICAL SANS-SERIF CAPITAL S +1D5B3;AL # MATHEMATICAL SANS-SERIF CAPITAL T +1D5B4;AL # MATHEMATICAL SANS-SERIF CAPITAL U +1D5B5;AL # MATHEMATICAL SANS-SERIF CAPITAL V +1D5B6;AL # MATHEMATICAL SANS-SERIF CAPITAL W +1D5B7;AL # MATHEMATICAL SANS-SERIF CAPITAL X +1D5B8;AL # MATHEMATICAL SANS-SERIF CAPITAL Y +1D5B9;AL # MATHEMATICAL SANS-SERIF CAPITAL Z +1D5BA;AL # MATHEMATICAL SANS-SERIF SMALL A +1D5BB;AL # MATHEMATICAL SANS-SERIF SMALL B +1D5BC;AL # MATHEMATICAL SANS-SERIF SMALL C +1D5BD;AL # MATHEMATICAL SANS-SERIF SMALL D +1D5BE;AL # MATHEMATICAL SANS-SERIF SMALL E +1D5BF;AL # MATHEMATICAL SANS-SERIF SMALL F +1D5C0;AL # MATHEMATICAL SANS-SERIF SMALL G +1D5C1;AL # MATHEMATICAL SANS-SERIF SMALL H +1D5C2;AL # MATHEMATICAL SANS-SERIF SMALL I +1D5C3;AL # MATHEMATICAL SANS-SERIF SMALL J +1D5C4;AL # MATHEMATICAL SANS-SERIF SMALL K +1D5C5;AL # MATHEMATICAL SANS-SERIF SMALL L +1D5C6;AL # MATHEMATICAL SANS-SERIF SMALL M +1D5C7;AL # MATHEMATICAL SANS-SERIF SMALL N +1D5C8;AL # MATHEMATICAL SANS-SERIF SMALL O +1D5C9;AL # MATHEMATICAL SANS-SERIF SMALL P +1D5CA;AL # MATHEMATICAL SANS-SERIF SMALL Q +1D5CB;AL # MATHEMATICAL SANS-SERIF SMALL R +1D5CC;AL # MATHEMATICAL SANS-SERIF SMALL S +1D5CD;AL # MATHEMATICAL SANS-SERIF SMALL T +1D5CE;AL # MATHEMATICAL SANS-SERIF SMALL U +1D5CF;AL # MATHEMATICAL SANS-SERIF SMALL V +1D5D0;AL # MATHEMATICAL SANS-SERIF SMALL W +1D5D1;AL # MATHEMATICAL SANS-SERIF SMALL X +1D5D2;AL # MATHEMATICAL SANS-SERIF SMALL Y +1D5D3;AL # MATHEMATICAL SANS-SERIF SMALL Z +1D5D4;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL A +1D5D5;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL B +1D5D6;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL C +1D5D7;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL D +1D5D8;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL E +1D5D9;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL F +1D5DA;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL G +1D5DB;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL H +1D5DC;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL I +1D5DD;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL J +1D5DE;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL K +1D5DF;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL L +1D5E0;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL M +1D5E1;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL N +1D5E2;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL O +1D5E3;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL P +1D5E4;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL Q +1D5E5;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL R +1D5E6;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL S +1D5E7;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL T +1D5E8;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL U +1D5E9;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL V +1D5EA;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL W +1D5EB;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL X +1D5EC;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL Y +1D5ED;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL Z +1D5EE;AL # MATHEMATICAL SANS-SERIF BOLD SMALL A +1D5EF;AL # MATHEMATICAL SANS-SERIF BOLD SMALL B +1D5F0;AL # MATHEMATICAL SANS-SERIF BOLD SMALL C +1D5F1;AL # MATHEMATICAL SANS-SERIF BOLD SMALL D +1D5F2;AL # MATHEMATICAL SANS-SERIF BOLD SMALL E +1D5F3;AL # MATHEMATICAL SANS-SERIF BOLD SMALL F +1D5F4;AL # MATHEMATICAL SANS-SERIF BOLD SMALL G +1D5F5;AL # MATHEMATICAL SANS-SERIF BOLD SMALL H +1D5F6;AL # MATHEMATICAL SANS-SERIF BOLD SMALL I +1D5F7;AL # MATHEMATICAL SANS-SERIF BOLD SMALL J +1D5F8;AL # MATHEMATICAL SANS-SERIF BOLD SMALL K +1D5F9;AL # MATHEMATICAL SANS-SERIF BOLD SMALL L +1D5FA;AL # MATHEMATICAL SANS-SERIF BOLD SMALL M +1D5FB;AL # MATHEMATICAL SANS-SERIF BOLD SMALL N +1D5FC;AL # MATHEMATICAL SANS-SERIF BOLD SMALL O +1D5FD;AL # MATHEMATICAL SANS-SERIF BOLD SMALL P +1D5FE;AL # MATHEMATICAL SANS-SERIF BOLD SMALL Q +1D5FF;AL # MATHEMATICAL SANS-SERIF BOLD SMALL R +1D600;AL # MATHEMATICAL SANS-SERIF BOLD SMALL S +1D601;AL # MATHEMATICAL SANS-SERIF BOLD SMALL T +1D602;AL # MATHEMATICAL SANS-SERIF BOLD SMALL U +1D603;AL # MATHEMATICAL SANS-SERIF BOLD SMALL V +1D604;AL # MATHEMATICAL SANS-SERIF BOLD SMALL W +1D605;AL # MATHEMATICAL SANS-SERIF BOLD SMALL X +1D606;AL # MATHEMATICAL SANS-SERIF BOLD SMALL Y +1D607;AL # MATHEMATICAL SANS-SERIF BOLD SMALL Z +1D608;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL A +1D609;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL B +1D60A;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL C +1D60B;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL D +1D60C;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL E +1D60D;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL F +1D60E;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL G +1D60F;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL H +1D610;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL I +1D611;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL J +1D612;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL K +1D613;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL L +1D614;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL M +1D615;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL N +1D616;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL O +1D617;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL P +1D618;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q +1D619;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL R +1D61A;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL S +1D61B;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL T +1D61C;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL U +1D61D;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL V +1D61E;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL W +1D61F;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL X +1D620;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y +1D621;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z +1D622;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL A +1D623;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL B +1D624;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL C +1D625;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL D +1D626;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL E +1D627;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL F +1D628;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL G +1D629;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL H +1D62A;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL I +1D62B;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL J +1D62C;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL K +1D62D;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL L +1D62E;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL M +1D62F;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL N +1D630;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL O +1D631;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL P +1D632;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL Q +1D633;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL R +1D634;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL S +1D635;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL T +1D636;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL U +1D637;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL V +1D638;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL W +1D639;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL X +1D63A;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL Y +1D63B;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL Z +1D63C;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A +1D63D;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B +1D63E;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C +1D63F;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D +1D640;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E +1D641;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F +1D642;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G +1D643;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H +1D644;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I +1D645;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J +1D646;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K +1D647;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L +1D648;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M +1D649;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N +1D64A;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O +1D64B;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P +1D64C;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q +1D64D;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R +1D64E;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S +1D64F;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T +1D650;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U +1D651;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V +1D652;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W +1D653;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X +1D654;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y +1D655;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z +1D656;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A +1D657;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B +1D658;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C +1D659;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D +1D65A;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E +1D65B;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F +1D65C;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G +1D65D;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H +1D65E;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I +1D65F;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J +1D660;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K +1D661;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L +1D662;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M +1D663;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N +1D664;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O +1D665;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P +1D666;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q +1D667;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R +1D668;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S +1D669;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T +1D66A;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U +1D66B;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V +1D66C;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W +1D66D;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X +1D66E;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y +1D66F;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z +1D670;AL # MATHEMATICAL MONOSPACE CAPITAL A +1D671;AL # MATHEMATICAL MONOSPACE CAPITAL B +1D672;AL # MATHEMATICAL MONOSPACE CAPITAL C +1D673;AL # MATHEMATICAL MONOSPACE CAPITAL D +1D674;AL # MATHEMATICAL MONOSPACE CAPITAL E +1D675;AL # MATHEMATICAL MONOSPACE CAPITAL F +1D676;AL # MATHEMATICAL MONOSPACE CAPITAL G +1D677;AL # MATHEMATICAL MONOSPACE CAPITAL H +1D678;AL # MATHEMATICAL MONOSPACE CAPITAL I +1D679;AL # MATHEMATICAL MONOSPACE CAPITAL J +1D67A;AL # MATHEMATICAL MONOSPACE CAPITAL K +1D67B;AL # MATHEMATICAL MONOSPACE CAPITAL L +1D67C;AL # MATHEMATICAL MONOSPACE CAPITAL M +1D67D;AL # MATHEMATICAL MONOSPACE CAPITAL N +1D67E;AL # MATHEMATICAL MONOSPACE CAPITAL O +1D67F;AL # MATHEMATICAL MONOSPACE CAPITAL P +1D680;AL # MATHEMATICAL MONOSPACE CAPITAL Q +1D681;AL # MATHEMATICAL MONOSPACE CAPITAL R +1D682;AL # MATHEMATICAL MONOSPACE CAPITAL S +1D683;AL # MATHEMATICAL MONOSPACE CAPITAL T +1D684;AL # MATHEMATICAL MONOSPACE CAPITAL U +1D685;AL # MATHEMATICAL MONOSPACE CAPITAL V +1D686;AL # MATHEMATICAL MONOSPACE CAPITAL W +1D687;AL # MATHEMATICAL MONOSPACE CAPITAL X +1D688;AL # MATHEMATICAL MONOSPACE CAPITAL Y +1D689;AL # MATHEMATICAL MONOSPACE CAPITAL Z +1D68A;AL # MATHEMATICAL MONOSPACE SMALL A +1D68B;AL # MATHEMATICAL MONOSPACE SMALL B +1D68C;AL # MATHEMATICAL MONOSPACE SMALL C +1D68D;AL # MATHEMATICAL MONOSPACE SMALL D +1D68E;AL # MATHEMATICAL MONOSPACE SMALL E +1D68F;AL # MATHEMATICAL MONOSPACE SMALL F +1D690;AL # MATHEMATICAL MONOSPACE SMALL G +1D691;AL # MATHEMATICAL MONOSPACE SMALL H +1D692;AL # MATHEMATICAL MONOSPACE SMALL I +1D693;AL # MATHEMATICAL MONOSPACE SMALL J +1D694;AL # MATHEMATICAL MONOSPACE SMALL K +1D695;AL # MATHEMATICAL MONOSPACE SMALL L +1D696;AL # MATHEMATICAL MONOSPACE SMALL M +1D697;AL # MATHEMATICAL MONOSPACE SMALL N +1D698;AL # MATHEMATICAL MONOSPACE SMALL O +1D699;AL # MATHEMATICAL MONOSPACE SMALL P +1D69A;AL # MATHEMATICAL MONOSPACE SMALL Q +1D69B;AL # MATHEMATICAL MONOSPACE SMALL R +1D69C;AL # MATHEMATICAL MONOSPACE SMALL S +1D69D;AL # MATHEMATICAL MONOSPACE SMALL T +1D69E;AL # MATHEMATICAL MONOSPACE SMALL U +1D69F;AL # MATHEMATICAL MONOSPACE SMALL V +1D6A0;AL # MATHEMATICAL MONOSPACE SMALL W +1D6A1;AL # MATHEMATICAL MONOSPACE SMALL X +1D6A2;AL # MATHEMATICAL MONOSPACE SMALL Y +1D6A3;AL # MATHEMATICAL MONOSPACE SMALL Z +1D6A8;AL # MATHEMATICAL BOLD CAPITAL ALPHA +1D6A9;AL # MATHEMATICAL BOLD CAPITAL BETA +1D6AA;AL # MATHEMATICAL BOLD CAPITAL GAMMA +1D6AB;AL # MATHEMATICAL BOLD CAPITAL DELTA +1D6AC;AL # MATHEMATICAL BOLD CAPITAL EPSILON +1D6AD;AL # MATHEMATICAL BOLD CAPITAL ZETA +1D6AE;AL # MATHEMATICAL BOLD CAPITAL ETA +1D6AF;AL # MATHEMATICAL BOLD CAPITAL THETA +1D6B0;AL # MATHEMATICAL BOLD CAPITAL IOTA +1D6B1;AL # MATHEMATICAL BOLD CAPITAL KAPPA +1D6B2;AL # MATHEMATICAL BOLD CAPITAL LAMDA +1D6B3;AL # MATHEMATICAL BOLD CAPITAL MU +1D6B4;AL # MATHEMATICAL BOLD CAPITAL NU +1D6B5;AL # MATHEMATICAL BOLD CAPITAL XI +1D6B6;AL # MATHEMATICAL BOLD CAPITAL OMICRON +1D6B7;AL # MATHEMATICAL BOLD CAPITAL PI +1D6B8;AL # MATHEMATICAL BOLD CAPITAL RHO +1D6B9;AL # MATHEMATICAL BOLD CAPITAL THETA SYMBOL +1D6BA;AL # MATHEMATICAL BOLD CAPITAL SIGMA +1D6BB;AL # MATHEMATICAL BOLD CAPITAL TAU +1D6BC;AL # MATHEMATICAL BOLD CAPITAL UPSILON +1D6BD;AL # MATHEMATICAL BOLD CAPITAL PHI +1D6BE;AL # MATHEMATICAL BOLD CAPITAL CHI +1D6BF;AL # MATHEMATICAL BOLD CAPITAL PSI +1D6C0;AL # MATHEMATICAL BOLD CAPITAL OMEGA +1D6C1;AL # MATHEMATICAL BOLD NABLA +1D6C2;AL # MATHEMATICAL BOLD SMALL ALPHA +1D6C3;AL # MATHEMATICAL BOLD SMALL BETA +1D6C4;AL # MATHEMATICAL BOLD SMALL GAMMA +1D6C5;AL # MATHEMATICAL BOLD SMALL DELTA +1D6C6;AL # MATHEMATICAL BOLD SMALL EPSILON +1D6C7;AL # MATHEMATICAL BOLD SMALL ZETA +1D6C8;AL # MATHEMATICAL BOLD SMALL ETA +1D6C9;AL # MATHEMATICAL BOLD SMALL THETA +1D6CA;AL # MATHEMATICAL BOLD SMALL IOTA +1D6CB;AL # MATHEMATICAL BOLD SMALL KAPPA +1D6CC;AL # MATHEMATICAL BOLD SMALL LAMDA +1D6CD;AL # MATHEMATICAL BOLD SMALL MU +1D6CE;AL # MATHEMATICAL BOLD SMALL NU +1D6CF;AL # MATHEMATICAL BOLD SMALL XI +1D6D0;AL # MATHEMATICAL BOLD SMALL OMICRON +1D6D1;AL # MATHEMATICAL BOLD SMALL PI +1D6D2;AL # MATHEMATICAL BOLD SMALL RHO +1D6D3;AL # MATHEMATICAL BOLD SMALL FINAL SIGMA +1D6D4;AL # MATHEMATICAL BOLD SMALL SIGMA +1D6D5;AL # MATHEMATICAL BOLD SMALL TAU +1D6D6;AL # MATHEMATICAL BOLD SMALL UPSILON +1D6D7;AL # MATHEMATICAL BOLD SMALL PHI +1D6D8;AL # MATHEMATICAL BOLD SMALL CHI +1D6D9;AL # MATHEMATICAL BOLD SMALL PSI +1D6DA;AL # MATHEMATICAL BOLD SMALL OMEGA +1D6DB;AL # MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6DC;AL # MATHEMATICAL BOLD EPSILON SYMBOL +1D6DD;AL # MATHEMATICAL BOLD THETA SYMBOL +1D6DE;AL # MATHEMATICAL BOLD KAPPA SYMBOL +1D6DF;AL # MATHEMATICAL BOLD PHI SYMBOL +1D6E0;AL # MATHEMATICAL BOLD RHO SYMBOL +1D6E1;AL # MATHEMATICAL BOLD PI SYMBOL +1D6E2;AL # MATHEMATICAL ITALIC CAPITAL ALPHA +1D6E3;AL # MATHEMATICAL ITALIC CAPITAL BETA +1D6E4;AL # MATHEMATICAL ITALIC CAPITAL GAMMA +1D6E5;AL # MATHEMATICAL ITALIC CAPITAL DELTA +1D6E6;AL # MATHEMATICAL ITALIC CAPITAL EPSILON +1D6E7;AL # MATHEMATICAL ITALIC CAPITAL ZETA +1D6E8;AL # MATHEMATICAL ITALIC CAPITAL ETA +1D6E9;AL # MATHEMATICAL ITALIC CAPITAL THETA +1D6EA;AL # MATHEMATICAL ITALIC CAPITAL IOTA +1D6EB;AL # MATHEMATICAL ITALIC CAPITAL KAPPA +1D6EC;AL # MATHEMATICAL ITALIC CAPITAL LAMDA +1D6ED;AL # MATHEMATICAL ITALIC CAPITAL MU +1D6EE;AL # MATHEMATICAL ITALIC CAPITAL NU +1D6EF;AL # MATHEMATICAL ITALIC CAPITAL XI +1D6F0;AL # MATHEMATICAL ITALIC CAPITAL OMICRON +1D6F1;AL # MATHEMATICAL ITALIC CAPITAL PI +1D6F2;AL # MATHEMATICAL ITALIC CAPITAL RHO +1D6F3;AL # MATHEMATICAL ITALIC CAPITAL THETA SYMBOL +1D6F4;AL # MATHEMATICAL ITALIC CAPITAL SIGMA +1D6F5;AL # MATHEMATICAL ITALIC CAPITAL TAU +1D6F6;AL # MATHEMATICAL ITALIC CAPITAL UPSILON +1D6F7;AL # MATHEMATICAL ITALIC CAPITAL PHI +1D6F8;AL # MATHEMATICAL ITALIC CAPITAL CHI +1D6F9;AL # MATHEMATICAL ITALIC CAPITAL PSI +1D6FA;AL # MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FB;AL # MATHEMATICAL ITALIC NABLA +1D6FC;AL # MATHEMATICAL ITALIC SMALL ALPHA +1D6FD;AL # MATHEMATICAL ITALIC SMALL BETA +1D6FE;AL # MATHEMATICAL ITALIC SMALL GAMMA +1D6FF;AL # MATHEMATICAL ITALIC SMALL DELTA +1D700;AL # MATHEMATICAL ITALIC SMALL EPSILON +1D701;AL # MATHEMATICAL ITALIC SMALL ZETA +1D702;AL # MATHEMATICAL ITALIC SMALL ETA +1D703;AL # MATHEMATICAL ITALIC SMALL THETA +1D704;AL # MATHEMATICAL ITALIC SMALL IOTA +1D705;AL # MATHEMATICAL ITALIC SMALL KAPPA +1D706;AL # MATHEMATICAL ITALIC SMALL LAMDA +1D707;AL # MATHEMATICAL ITALIC SMALL MU +1D708;AL # MATHEMATICAL ITALIC SMALL NU +1D709;AL # MATHEMATICAL ITALIC SMALL XI +1D70A;AL # MATHEMATICAL ITALIC SMALL OMICRON +1D70B;AL # MATHEMATICAL ITALIC SMALL PI +1D70C;AL # MATHEMATICAL ITALIC SMALL RHO +1D70D;AL # MATHEMATICAL ITALIC SMALL FINAL SIGMA +1D70E;AL # MATHEMATICAL ITALIC SMALL SIGMA +1D70F;AL # MATHEMATICAL ITALIC SMALL TAU +1D710;AL # MATHEMATICAL ITALIC SMALL UPSILON +1D711;AL # MATHEMATICAL ITALIC SMALL PHI +1D712;AL # MATHEMATICAL ITALIC SMALL CHI +1D713;AL # MATHEMATICAL ITALIC SMALL PSI +1D714;AL # MATHEMATICAL ITALIC SMALL OMEGA +1D715;AL # MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D716;AL # MATHEMATICAL ITALIC EPSILON SYMBOL +1D717;AL # MATHEMATICAL ITALIC THETA SYMBOL +1D718;AL # MATHEMATICAL ITALIC KAPPA SYMBOL +1D719;AL # MATHEMATICAL ITALIC PHI SYMBOL +1D71A;AL # MATHEMATICAL ITALIC RHO SYMBOL +1D71B;AL # MATHEMATICAL ITALIC PI SYMBOL +1D71C;AL # MATHEMATICAL BOLD ITALIC CAPITAL ALPHA +1D71D;AL # MATHEMATICAL BOLD ITALIC CAPITAL BETA +1D71E;AL # MATHEMATICAL BOLD ITALIC CAPITAL GAMMA +1D71F;AL # MATHEMATICAL BOLD ITALIC CAPITAL DELTA +1D720;AL # MATHEMATICAL BOLD ITALIC CAPITAL EPSILON +1D721;AL # MATHEMATICAL BOLD ITALIC CAPITAL ZETA +1D722;AL # MATHEMATICAL BOLD ITALIC CAPITAL ETA +1D723;AL # MATHEMATICAL BOLD ITALIC CAPITAL THETA +1D724;AL # MATHEMATICAL BOLD ITALIC CAPITAL IOTA +1D725;AL # MATHEMATICAL BOLD ITALIC CAPITAL KAPPA +1D726;AL # MATHEMATICAL BOLD ITALIC CAPITAL LAMDA +1D727;AL # MATHEMATICAL BOLD ITALIC CAPITAL MU +1D728;AL # MATHEMATICAL BOLD ITALIC CAPITAL NU +1D729;AL # MATHEMATICAL BOLD ITALIC CAPITAL XI +1D72A;AL # MATHEMATICAL BOLD ITALIC CAPITAL OMICRON +1D72B;AL # MATHEMATICAL BOLD ITALIC CAPITAL PI +1D72C;AL # MATHEMATICAL BOLD ITALIC CAPITAL RHO +1D72D;AL # MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL +1D72E;AL # MATHEMATICAL BOLD ITALIC CAPITAL SIGMA +1D72F;AL # MATHEMATICAL BOLD ITALIC CAPITAL TAU +1D730;AL # MATHEMATICAL BOLD ITALIC CAPITAL UPSILON +1D731;AL # MATHEMATICAL BOLD ITALIC CAPITAL PHI +1D732;AL # MATHEMATICAL BOLD ITALIC CAPITAL CHI +1D733;AL # MATHEMATICAL BOLD ITALIC CAPITAL PSI +1D734;AL # MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D735;AL # MATHEMATICAL BOLD ITALIC NABLA +1D736;AL # MATHEMATICAL BOLD ITALIC SMALL ALPHA +1D737;AL # MATHEMATICAL BOLD ITALIC SMALL BETA +1D738;AL # MATHEMATICAL BOLD ITALIC SMALL GAMMA +1D739;AL # MATHEMATICAL BOLD ITALIC SMALL DELTA +1D73A;AL # MATHEMATICAL BOLD ITALIC SMALL EPSILON +1D73B;AL # MATHEMATICAL BOLD ITALIC SMALL ZETA +1D73C;AL # MATHEMATICAL BOLD ITALIC SMALL ETA +1D73D;AL # MATHEMATICAL BOLD ITALIC SMALL THETA +1D73E;AL # MATHEMATICAL BOLD ITALIC SMALL IOTA +1D73F;AL # MATHEMATICAL BOLD ITALIC SMALL KAPPA +1D740;AL # MATHEMATICAL BOLD ITALIC SMALL LAMDA +1D741;AL # MATHEMATICAL BOLD ITALIC SMALL MU +1D742;AL # MATHEMATICAL BOLD ITALIC SMALL NU +1D743;AL # MATHEMATICAL BOLD ITALIC SMALL XI +1D744;AL # MATHEMATICAL BOLD ITALIC SMALL OMICRON +1D745;AL # MATHEMATICAL BOLD ITALIC SMALL PI +1D746;AL # MATHEMATICAL BOLD ITALIC SMALL RHO +1D747;AL # MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA +1D748;AL # MATHEMATICAL BOLD ITALIC SMALL SIGMA +1D749;AL # MATHEMATICAL BOLD ITALIC SMALL TAU +1D74A;AL # MATHEMATICAL BOLD ITALIC SMALL UPSILON +1D74B;AL # MATHEMATICAL BOLD ITALIC SMALL PHI +1D74C;AL # MATHEMATICAL BOLD ITALIC SMALL CHI +1D74D;AL # MATHEMATICAL BOLD ITALIC SMALL PSI +1D74E;AL # MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D74F;AL # MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D750;AL # MATHEMATICAL BOLD ITALIC EPSILON SYMBOL +1D751;AL # MATHEMATICAL BOLD ITALIC THETA SYMBOL +1D752;AL # MATHEMATICAL BOLD ITALIC KAPPA SYMBOL +1D753;AL # MATHEMATICAL BOLD ITALIC PHI SYMBOL +1D754;AL # MATHEMATICAL BOLD ITALIC RHO SYMBOL +1D755;AL # MATHEMATICAL BOLD ITALIC PI SYMBOL +1D756;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA +1D757;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA +1D758;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA +1D759;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA +1D75A;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON +1D75B;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA +1D75C;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA +1D75D;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA +1D75E;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA +1D75F;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA +1D760;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA +1D761;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL MU +1D762;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL NU +1D763;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL XI +1D764;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON +1D765;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL PI +1D766;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO +1D767;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL +1D768;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA +1D769;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU +1D76A;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON +1D76B;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI +1D76C;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI +1D76D;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI +1D76E;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D76F;AL # MATHEMATICAL SANS-SERIF BOLD NABLA +1D770;AL # MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA +1D771;AL # MATHEMATICAL SANS-SERIF BOLD SMALL BETA +1D772;AL # MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA +1D773;AL # MATHEMATICAL SANS-SERIF BOLD SMALL DELTA +1D774;AL # MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON +1D775;AL # MATHEMATICAL SANS-SERIF BOLD SMALL ZETA +1D776;AL # MATHEMATICAL SANS-SERIF BOLD SMALL ETA +1D777;AL # MATHEMATICAL SANS-SERIF BOLD SMALL THETA +1D778;AL # MATHEMATICAL SANS-SERIF BOLD SMALL IOTA +1D779;AL # MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA +1D77A;AL # MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA +1D77B;AL # MATHEMATICAL SANS-SERIF BOLD SMALL MU +1D77C;AL # MATHEMATICAL SANS-SERIF BOLD SMALL NU +1D77D;AL # MATHEMATICAL SANS-SERIF BOLD SMALL XI +1D77E;AL # MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON +1D77F;AL # MATHEMATICAL SANS-SERIF BOLD SMALL PI +1D780;AL # MATHEMATICAL SANS-SERIF BOLD SMALL RHO +1D781;AL # MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA +1D782;AL # MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA +1D783;AL # MATHEMATICAL SANS-SERIF BOLD SMALL TAU +1D784;AL # MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON +1D785;AL # MATHEMATICAL SANS-SERIF BOLD SMALL PHI +1D786;AL # MATHEMATICAL SANS-SERIF BOLD SMALL CHI +1D787;AL # MATHEMATICAL SANS-SERIF BOLD SMALL PSI +1D788;AL # MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D789;AL # MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D78A;AL # MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL +1D78B;AL # MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL +1D78C;AL # MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL +1D78D;AL # MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL +1D78E;AL # MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL +1D78F;AL # MATHEMATICAL SANS-SERIF BOLD PI SYMBOL +1D790;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA +1D791;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA +1D792;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA +1D793;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA +1D794;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON +1D795;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA +1D796;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA +1D797;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA +1D798;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA +1D799;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA +1D79A;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA +1D79B;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU +1D79C;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU +1D79D;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI +1D79E;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON +1D79F;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI +1D7A0;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO +1D7A1;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL +1D7A2;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA +1D7A3;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU +1D7A4;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON +1D7A5;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI +1D7A6;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI +1D7A7;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI +1D7A8;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7A9;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7AA;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA +1D7AB;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA +1D7AC;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA +1D7AD;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA +1D7AE;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON +1D7AF;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA +1D7B0;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA +1D7B1;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA +1D7B2;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA +1D7B3;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA +1D7B4;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA +1D7B5;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU +1D7B6;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU +1D7B7;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI +1D7B8;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON +1D7B9;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI +1D7BA;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO +1D7BB;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA +1D7BC;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA +1D7BD;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU +1D7BE;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON +1D7BF;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI +1D7C0;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI +1D7C1;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI +1D7C2;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C3;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D7C4;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL +1D7C5;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL +1D7C6;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL +1D7C7;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL +1D7C8;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL +1D7C9;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL +1D7CE;NU # MATHEMATICAL BOLD DIGIT ZERO +1D7CF;NU # MATHEMATICAL BOLD DIGIT ONE +1D7D0;NU # MATHEMATICAL BOLD DIGIT TWO +1D7D1;NU # MATHEMATICAL BOLD DIGIT THREE +1D7D2;NU # MATHEMATICAL BOLD DIGIT FOUR +1D7D3;NU # MATHEMATICAL BOLD DIGIT FIVE +1D7D4;NU # MATHEMATICAL BOLD DIGIT SIX +1D7D5;NU # MATHEMATICAL BOLD DIGIT SEVEN +1D7D6;NU # MATHEMATICAL BOLD DIGIT EIGHT +1D7D7;NU # MATHEMATICAL BOLD DIGIT NINE +1D7D8;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO +1D7D9;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT ONE +1D7DA;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT TWO +1D7DB;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT THREE +1D7DC;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR +1D7DD;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE +1D7DE;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT SIX +1D7DF;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN +1D7E0;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT +1D7E1;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT NINE +1D7E2;NU # MATHEMATICAL SANS-SERIF DIGIT ZERO +1D7E3;NU # MATHEMATICAL SANS-SERIF DIGIT ONE +1D7E4;NU # MATHEMATICAL SANS-SERIF DIGIT TWO +1D7E5;NU # MATHEMATICAL SANS-SERIF DIGIT THREE +1D7E6;NU # MATHEMATICAL SANS-SERIF DIGIT FOUR +1D7E7;NU # MATHEMATICAL SANS-SERIF DIGIT FIVE +1D7E8;NU # MATHEMATICAL SANS-SERIF DIGIT SIX +1D7E9;NU # MATHEMATICAL SANS-SERIF DIGIT SEVEN +1D7EA;NU # MATHEMATICAL SANS-SERIF DIGIT EIGHT +1D7EB;NU # MATHEMATICAL SANS-SERIF DIGIT NINE +1D7EC;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO +1D7ED;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT ONE +1D7EE;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT TWO +1D7EF;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT THREE +1D7F0;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR +1D7F1;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE +1D7F2;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT SIX +1D7F3;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN +1D7F4;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT +1D7F5;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT NINE +1D7F6;NU # MATHEMATICAL MONOSPACE DIGIT ZERO +1D7F7;NU # MATHEMATICAL MONOSPACE DIGIT ONE +1D7F8;NU # MATHEMATICAL MONOSPACE DIGIT TWO +1D7F9;NU # MATHEMATICAL MONOSPACE DIGIT THREE +1D7FA;NU # MATHEMATICAL MONOSPACE DIGIT FOUR +1D7FB;NU # MATHEMATICAL MONOSPACE DIGIT FIVE +1D7FC;NU # MATHEMATICAL MONOSPACE DIGIT SIX +1D7FD;NU # MATHEMATICAL MONOSPACE DIGIT SEVEN +1D7FE;NU # MATHEMATICAL MONOSPACE DIGIT EIGHT +1D7FF;NU # MATHEMATICAL MONOSPACE DIGIT NINE +20000..2A6D6;ID # .. +2F800;ID # CJK COMPATIBILITY IDEOGRAPH-2F800 +2F801;ID # CJK COMPATIBILITY IDEOGRAPH-2F801 +2F802;ID # CJK COMPATIBILITY IDEOGRAPH-2F802 +2F803;ID # CJK COMPATIBILITY IDEOGRAPH-2F803 +2F804;ID # CJK COMPATIBILITY IDEOGRAPH-2F804 +2F805;ID # CJK COMPATIBILITY IDEOGRAPH-2F805 +2F806;ID # CJK COMPATIBILITY IDEOGRAPH-2F806 +2F807;ID # CJK COMPATIBILITY IDEOGRAPH-2F807 +2F808;ID # CJK COMPATIBILITY IDEOGRAPH-2F808 +2F809;ID # CJK COMPATIBILITY IDEOGRAPH-2F809 +2F80A;ID # CJK COMPATIBILITY IDEOGRAPH-2F80A +2F80B;ID # CJK COMPATIBILITY IDEOGRAPH-2F80B +2F80C;ID # CJK COMPATIBILITY IDEOGRAPH-2F80C +2F80D;ID # CJK COMPATIBILITY IDEOGRAPH-2F80D +2F80E;ID # CJK COMPATIBILITY IDEOGRAPH-2F80E +2F80F;ID # CJK COMPATIBILITY IDEOGRAPH-2F80F +2F810;ID # CJK COMPATIBILITY IDEOGRAPH-2F810 +2F811;ID # CJK COMPATIBILITY IDEOGRAPH-2F811 +2F812;ID # CJK COMPATIBILITY IDEOGRAPH-2F812 +2F813;ID # CJK COMPATIBILITY IDEOGRAPH-2F813 +2F814;ID # CJK COMPATIBILITY IDEOGRAPH-2F814 +2F815;ID # CJK COMPATIBILITY IDEOGRAPH-2F815 +2F816;ID # CJK COMPATIBILITY IDEOGRAPH-2F816 +2F817;ID # CJK COMPATIBILITY IDEOGRAPH-2F817 +2F818;ID # CJK COMPATIBILITY IDEOGRAPH-2F818 +2F819;ID # CJK COMPATIBILITY IDEOGRAPH-2F819 +2F81A;ID # CJK COMPATIBILITY IDEOGRAPH-2F81A +2F81B;ID # CJK COMPATIBILITY IDEOGRAPH-2F81B +2F81C;ID # CJK COMPATIBILITY IDEOGRAPH-2F81C +2F81D;ID # CJK COMPATIBILITY IDEOGRAPH-2F81D +2F81E;ID # CJK COMPATIBILITY IDEOGRAPH-2F81E +2F81F;ID # CJK COMPATIBILITY IDEOGRAPH-2F81F +2F820;ID # CJK COMPATIBILITY IDEOGRAPH-2F820 +2F821;ID # CJK COMPATIBILITY IDEOGRAPH-2F821 +2F822;ID # CJK COMPATIBILITY IDEOGRAPH-2F822 +2F823;ID # CJK COMPATIBILITY IDEOGRAPH-2F823 +2F824;ID # CJK COMPATIBILITY IDEOGRAPH-2F824 +2F825;ID # CJK COMPATIBILITY IDEOGRAPH-2F825 +2F826;ID # CJK COMPATIBILITY IDEOGRAPH-2F826 +2F827;ID # CJK COMPATIBILITY IDEOGRAPH-2F827 +2F828;ID # CJK COMPATIBILITY IDEOGRAPH-2F828 +2F829;ID # CJK COMPATIBILITY IDEOGRAPH-2F829 +2F82A;ID # CJK COMPATIBILITY IDEOGRAPH-2F82A +2F82B;ID # CJK COMPATIBILITY IDEOGRAPH-2F82B +2F82C;ID # CJK COMPATIBILITY IDEOGRAPH-2F82C +2F82D;ID # CJK COMPATIBILITY IDEOGRAPH-2F82D +2F82E;ID # CJK COMPATIBILITY IDEOGRAPH-2F82E +2F82F;ID # CJK COMPATIBILITY IDEOGRAPH-2F82F +2F830;ID # CJK COMPATIBILITY IDEOGRAPH-2F830 +2F831;ID # CJK COMPATIBILITY IDEOGRAPH-2F831 +2F832;ID # CJK COMPATIBILITY IDEOGRAPH-2F832 +2F833;ID # CJK COMPATIBILITY IDEOGRAPH-2F833 +2F834;ID # CJK COMPATIBILITY IDEOGRAPH-2F834 +2F835;ID # CJK COMPATIBILITY IDEOGRAPH-2F835 +2F836;ID # CJK COMPATIBILITY IDEOGRAPH-2F836 +2F837;ID # CJK COMPATIBILITY IDEOGRAPH-2F837 +2F838;ID # CJK COMPATIBILITY IDEOGRAPH-2F838 +2F839;ID # CJK COMPATIBILITY IDEOGRAPH-2F839 +2F83A;ID # CJK COMPATIBILITY IDEOGRAPH-2F83A +2F83B;ID # CJK COMPATIBILITY IDEOGRAPH-2F83B +2F83C;ID # CJK COMPATIBILITY IDEOGRAPH-2F83C +2F83D;ID # CJK COMPATIBILITY IDEOGRAPH-2F83D +2F83E;ID # CJK COMPATIBILITY IDEOGRAPH-2F83E +2F83F;ID # CJK COMPATIBILITY IDEOGRAPH-2F83F +2F840;ID # CJK COMPATIBILITY IDEOGRAPH-2F840 +2F841;ID # CJK COMPATIBILITY IDEOGRAPH-2F841 +2F842;ID # CJK COMPATIBILITY IDEOGRAPH-2F842 +2F843;ID # CJK COMPATIBILITY IDEOGRAPH-2F843 +2F844;ID # CJK COMPATIBILITY IDEOGRAPH-2F844 +2F845;ID # CJK COMPATIBILITY IDEOGRAPH-2F845 +2F846;ID # CJK COMPATIBILITY IDEOGRAPH-2F846 +2F847;ID # CJK COMPATIBILITY IDEOGRAPH-2F847 +2F848;ID # CJK COMPATIBILITY IDEOGRAPH-2F848 +2F849;ID # CJK COMPATIBILITY IDEOGRAPH-2F849 +2F84A;ID # CJK COMPATIBILITY IDEOGRAPH-2F84A +2F84B;ID # CJK COMPATIBILITY IDEOGRAPH-2F84B +2F84C;ID # CJK COMPATIBILITY IDEOGRAPH-2F84C +2F84D;ID # CJK COMPATIBILITY IDEOGRAPH-2F84D +2F84E;ID # CJK COMPATIBILITY IDEOGRAPH-2F84E +2F84F;ID # CJK COMPATIBILITY IDEOGRAPH-2F84F +2F850;ID # CJK COMPATIBILITY IDEOGRAPH-2F850 +2F851;ID # CJK COMPATIBILITY IDEOGRAPH-2F851 +2F852;ID # CJK COMPATIBILITY IDEOGRAPH-2F852 +2F853;ID # CJK COMPATIBILITY IDEOGRAPH-2F853 +2F854;ID # CJK COMPATIBILITY IDEOGRAPH-2F854 +2F855;ID # CJK COMPATIBILITY IDEOGRAPH-2F855 +2F856;ID # CJK COMPATIBILITY IDEOGRAPH-2F856 +2F857;ID # CJK COMPATIBILITY IDEOGRAPH-2F857 +2F858;ID # CJK COMPATIBILITY IDEOGRAPH-2F858 +2F859;ID # CJK COMPATIBILITY IDEOGRAPH-2F859 +2F85A;ID # CJK COMPATIBILITY IDEOGRAPH-2F85A +2F85B;ID # CJK COMPATIBILITY IDEOGRAPH-2F85B +2F85C;ID # CJK COMPATIBILITY IDEOGRAPH-2F85C +2F85D;ID # CJK COMPATIBILITY IDEOGRAPH-2F85D +2F85E;ID # CJK COMPATIBILITY IDEOGRAPH-2F85E +2F85F;ID # CJK COMPATIBILITY IDEOGRAPH-2F85F +2F860;ID # CJK COMPATIBILITY IDEOGRAPH-2F860 +2F861;ID # CJK COMPATIBILITY IDEOGRAPH-2F861 +2F862;ID # CJK COMPATIBILITY IDEOGRAPH-2F862 +2F863;ID # CJK COMPATIBILITY IDEOGRAPH-2F863 +2F864;ID # CJK COMPATIBILITY IDEOGRAPH-2F864 +2F865;ID # CJK COMPATIBILITY IDEOGRAPH-2F865 +2F866;ID # CJK COMPATIBILITY IDEOGRAPH-2F866 +2F867;ID # CJK COMPATIBILITY IDEOGRAPH-2F867 +2F868;ID # CJK COMPATIBILITY IDEOGRAPH-2F868 +2F869;ID # CJK COMPATIBILITY IDEOGRAPH-2F869 +2F86A;ID # CJK COMPATIBILITY IDEOGRAPH-2F86A +2F86B;ID # CJK COMPATIBILITY IDEOGRAPH-2F86B +2F86C;ID # CJK COMPATIBILITY IDEOGRAPH-2F86C +2F86D;ID # CJK COMPATIBILITY IDEOGRAPH-2F86D +2F86E;ID # CJK COMPATIBILITY IDEOGRAPH-2F86E +2F86F;ID # CJK COMPATIBILITY IDEOGRAPH-2F86F +2F870;ID # CJK COMPATIBILITY IDEOGRAPH-2F870 +2F871;ID # CJK COMPATIBILITY IDEOGRAPH-2F871 +2F872;ID # CJK COMPATIBILITY IDEOGRAPH-2F872 +2F873;ID # CJK COMPATIBILITY IDEOGRAPH-2F873 +2F874;ID # CJK COMPATIBILITY IDEOGRAPH-2F874 +2F875;ID # CJK COMPATIBILITY IDEOGRAPH-2F875 +2F876;ID # CJK COMPATIBILITY IDEOGRAPH-2F876 +2F877;ID # CJK COMPATIBILITY IDEOGRAPH-2F877 +2F878;ID # CJK COMPATIBILITY IDEOGRAPH-2F878 +2F879;ID # CJK COMPATIBILITY IDEOGRAPH-2F879 +2F87A;ID # CJK COMPATIBILITY IDEOGRAPH-2F87A +2F87B;ID # CJK COMPATIBILITY IDEOGRAPH-2F87B +2F87C;ID # CJK COMPATIBILITY IDEOGRAPH-2F87C +2F87D;ID # CJK COMPATIBILITY IDEOGRAPH-2F87D +2F87E;ID # CJK COMPATIBILITY IDEOGRAPH-2F87E +2F87F;ID # CJK COMPATIBILITY IDEOGRAPH-2F87F +2F880;ID # CJK COMPATIBILITY IDEOGRAPH-2F880 +2F881;ID # CJK COMPATIBILITY IDEOGRAPH-2F881 +2F882;ID # CJK COMPATIBILITY IDEOGRAPH-2F882 +2F883;ID # CJK COMPATIBILITY IDEOGRAPH-2F883 +2F884;ID # CJK COMPATIBILITY IDEOGRAPH-2F884 +2F885;ID # CJK COMPATIBILITY IDEOGRAPH-2F885 +2F886;ID # CJK COMPATIBILITY IDEOGRAPH-2F886 +2F887;ID # CJK COMPATIBILITY IDEOGRAPH-2F887 +2F888;ID # CJK COMPATIBILITY IDEOGRAPH-2F888 +2F889;ID # CJK COMPATIBILITY IDEOGRAPH-2F889 +2F88A;ID # CJK COMPATIBILITY IDEOGRAPH-2F88A +2F88B;ID # CJK COMPATIBILITY IDEOGRAPH-2F88B +2F88C;ID # CJK COMPATIBILITY IDEOGRAPH-2F88C +2F88D;ID # CJK COMPATIBILITY IDEOGRAPH-2F88D +2F88E;ID # CJK COMPATIBILITY IDEOGRAPH-2F88E +2F88F;ID # CJK COMPATIBILITY IDEOGRAPH-2F88F +2F890;ID # CJK COMPATIBILITY IDEOGRAPH-2F890 +2F891;ID # CJK COMPATIBILITY IDEOGRAPH-2F891 +2F892;ID # CJK COMPATIBILITY IDEOGRAPH-2F892 +2F893;ID # CJK COMPATIBILITY IDEOGRAPH-2F893 +2F894;ID # CJK COMPATIBILITY IDEOGRAPH-2F894 +2F895;ID # CJK COMPATIBILITY IDEOGRAPH-2F895 +2F896;ID # CJK COMPATIBILITY IDEOGRAPH-2F896 +2F897;ID # CJK COMPATIBILITY IDEOGRAPH-2F897 +2F898;ID # CJK COMPATIBILITY IDEOGRAPH-2F898 +2F899;ID # CJK COMPATIBILITY IDEOGRAPH-2F899 +2F89A;ID # CJK COMPATIBILITY IDEOGRAPH-2F89A +2F89B;ID # CJK COMPATIBILITY IDEOGRAPH-2F89B +2F89C;ID # CJK COMPATIBILITY IDEOGRAPH-2F89C +2F89D;ID # CJK COMPATIBILITY IDEOGRAPH-2F89D +2F89E;ID # CJK COMPATIBILITY IDEOGRAPH-2F89E +2F89F;ID # CJK COMPATIBILITY IDEOGRAPH-2F89F +2F8A0;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A0 +2F8A1;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A1 +2F8A2;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A2 +2F8A3;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A3 +2F8A4;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A4 +2F8A5;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A5 +2F8A6;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A6 +2F8A7;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A7 +2F8A8;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A8 +2F8A9;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A9 +2F8AA;ID # CJK COMPATIBILITY IDEOGRAPH-2F8AA +2F8AB;ID # CJK COMPATIBILITY IDEOGRAPH-2F8AB +2F8AC;ID # CJK COMPATIBILITY IDEOGRAPH-2F8AC +2F8AD;ID # CJK COMPATIBILITY IDEOGRAPH-2F8AD +2F8AE;ID # CJK COMPATIBILITY IDEOGRAPH-2F8AE +2F8AF;ID # CJK COMPATIBILITY IDEOGRAPH-2F8AF +2F8B0;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B0 +2F8B1;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B1 +2F8B2;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B2 +2F8B3;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B3 +2F8B4;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B4 +2F8B5;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B5 +2F8B6;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B6 +2F8B7;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B7 +2F8B8;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B8 +2F8B9;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B9 +2F8BA;ID # CJK COMPATIBILITY IDEOGRAPH-2F8BA +2F8BB;ID # CJK COMPATIBILITY IDEOGRAPH-2F8BB +2F8BC;ID # CJK COMPATIBILITY IDEOGRAPH-2F8BC +2F8BD;ID # CJK COMPATIBILITY IDEOGRAPH-2F8BD +2F8BE;ID # CJK COMPATIBILITY IDEOGRAPH-2F8BE +2F8BF;ID # CJK COMPATIBILITY IDEOGRAPH-2F8BF +2F8C0;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C0 +2F8C1;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C1 +2F8C2;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C2 +2F8C3;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C3 +2F8C4;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C4 +2F8C5;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C5 +2F8C6;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C6 +2F8C7;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C7 +2F8C8;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C8 +2F8C9;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C9 +2F8CA;ID # CJK COMPATIBILITY IDEOGRAPH-2F8CA +2F8CB;ID # CJK COMPATIBILITY IDEOGRAPH-2F8CB +2F8CC;ID # CJK COMPATIBILITY IDEOGRAPH-2F8CC +2F8CD;ID # CJK COMPATIBILITY IDEOGRAPH-2F8CD +2F8CE;ID # CJK COMPATIBILITY IDEOGRAPH-2F8CE +2F8CF;ID # CJK COMPATIBILITY IDEOGRAPH-2F8CF +2F8D0;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D0 +2F8D1;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D1 +2F8D2;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D2 +2F8D3;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D3 +2F8D4;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D4 +2F8D5;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D5 +2F8D6;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D6 +2F8D7;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D7 +2F8D8;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D8 +2F8D9;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D9 +2F8DA;ID # CJK COMPATIBILITY IDEOGRAPH-2F8DA +2F8DB;ID # CJK COMPATIBILITY IDEOGRAPH-2F8DB +2F8DC;ID # CJK COMPATIBILITY IDEOGRAPH-2F8DC +2F8DD;ID # CJK COMPATIBILITY IDEOGRAPH-2F8DD +2F8DE;ID # CJK COMPATIBILITY IDEOGRAPH-2F8DE +2F8DF;ID # CJK COMPATIBILITY IDEOGRAPH-2F8DF +2F8E0;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E0 +2F8E1;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E1 +2F8E2;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E2 +2F8E3;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E3 +2F8E4;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E4 +2F8E5;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E5 +2F8E6;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E6 +2F8E7;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E7 +2F8E8;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E8 +2F8E9;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E9 +2F8EA;ID # CJK COMPATIBILITY IDEOGRAPH-2F8EA +2F8EB;ID # CJK COMPATIBILITY IDEOGRAPH-2F8EB +2F8EC;ID # CJK COMPATIBILITY IDEOGRAPH-2F8EC +2F8ED;ID # CJK COMPATIBILITY IDEOGRAPH-2F8ED +2F8EE;ID # CJK COMPATIBILITY IDEOGRAPH-2F8EE +2F8EF;ID # CJK COMPATIBILITY IDEOGRAPH-2F8EF +2F8F0;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F0 +2F8F1;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F1 +2F8F2;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F2 +2F8F3;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F3 +2F8F4;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F4 +2F8F5;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F5 +2F8F6;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F6 +2F8F7;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F7 +2F8F8;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F8 +2F8F9;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F9 +2F8FA;ID # CJK COMPATIBILITY IDEOGRAPH-2F8FA +2F8FB;ID # CJK COMPATIBILITY IDEOGRAPH-2F8FB +2F8FC;ID # CJK COMPATIBILITY IDEOGRAPH-2F8FC +2F8FD;ID # CJK COMPATIBILITY IDEOGRAPH-2F8FD +2F8FE;ID # CJK COMPATIBILITY IDEOGRAPH-2F8FE +2F8FF;ID # CJK COMPATIBILITY IDEOGRAPH-2F8FF +2F900;ID # CJK COMPATIBILITY IDEOGRAPH-2F900 +2F901;ID # CJK COMPATIBILITY IDEOGRAPH-2F901 +2F902;ID # CJK COMPATIBILITY IDEOGRAPH-2F902 +2F903;ID # CJK COMPATIBILITY IDEOGRAPH-2F903 +2F904;ID # CJK COMPATIBILITY IDEOGRAPH-2F904 +2F905;ID # CJK COMPATIBILITY IDEOGRAPH-2F905 +2F906;ID # CJK COMPATIBILITY IDEOGRAPH-2F906 +2F907;ID # CJK COMPATIBILITY IDEOGRAPH-2F907 +2F908;ID # CJK COMPATIBILITY IDEOGRAPH-2F908 +2F909;ID # CJK COMPATIBILITY IDEOGRAPH-2F909 +2F90A;ID # CJK COMPATIBILITY IDEOGRAPH-2F90A +2F90B;ID # CJK COMPATIBILITY IDEOGRAPH-2F90B +2F90C;ID # CJK COMPATIBILITY IDEOGRAPH-2F90C +2F90D;ID # CJK COMPATIBILITY IDEOGRAPH-2F90D +2F90E;ID # CJK COMPATIBILITY IDEOGRAPH-2F90E +2F90F;ID # CJK COMPATIBILITY IDEOGRAPH-2F90F +2F910;ID # CJK COMPATIBILITY IDEOGRAPH-2F910 +2F911;ID # CJK COMPATIBILITY IDEOGRAPH-2F911 +2F912;ID # CJK COMPATIBILITY IDEOGRAPH-2F912 +2F913;ID # CJK COMPATIBILITY IDEOGRAPH-2F913 +2F914;ID # CJK COMPATIBILITY IDEOGRAPH-2F914 +2F915;ID # CJK COMPATIBILITY IDEOGRAPH-2F915 +2F916;ID # CJK COMPATIBILITY IDEOGRAPH-2F916 +2F917;ID # CJK COMPATIBILITY IDEOGRAPH-2F917 +2F918;ID # CJK COMPATIBILITY IDEOGRAPH-2F918 +2F919;ID # CJK COMPATIBILITY IDEOGRAPH-2F919 +2F91A;ID # CJK COMPATIBILITY IDEOGRAPH-2F91A +2F91B;ID # CJK COMPATIBILITY IDEOGRAPH-2F91B +2F91C;ID # CJK COMPATIBILITY IDEOGRAPH-2F91C +2F91D;ID # CJK COMPATIBILITY IDEOGRAPH-2F91D +2F91E;ID # CJK COMPATIBILITY IDEOGRAPH-2F91E +2F91F;ID # CJK COMPATIBILITY IDEOGRAPH-2F91F +2F920;ID # CJK COMPATIBILITY IDEOGRAPH-2F920 +2F921;ID # CJK COMPATIBILITY IDEOGRAPH-2F921 +2F922;ID # CJK COMPATIBILITY IDEOGRAPH-2F922 +2F923;ID # CJK COMPATIBILITY IDEOGRAPH-2F923 +2F924;ID # CJK COMPATIBILITY IDEOGRAPH-2F924 +2F925;ID # CJK COMPATIBILITY IDEOGRAPH-2F925 +2F926;ID # CJK COMPATIBILITY IDEOGRAPH-2F926 +2F927;ID # CJK COMPATIBILITY IDEOGRAPH-2F927 +2F928;ID # CJK COMPATIBILITY IDEOGRAPH-2F928 +2F929;ID # CJK COMPATIBILITY IDEOGRAPH-2F929 +2F92A;ID # CJK COMPATIBILITY IDEOGRAPH-2F92A +2F92B;ID # CJK COMPATIBILITY IDEOGRAPH-2F92B +2F92C;ID # CJK COMPATIBILITY IDEOGRAPH-2F92C +2F92D;ID # CJK COMPATIBILITY IDEOGRAPH-2F92D +2F92E;ID # CJK COMPATIBILITY IDEOGRAPH-2F92E +2F92F;ID # CJK COMPATIBILITY IDEOGRAPH-2F92F +2F930;ID # CJK COMPATIBILITY IDEOGRAPH-2F930 +2F931;ID # CJK COMPATIBILITY IDEOGRAPH-2F931 +2F932;ID # CJK COMPATIBILITY IDEOGRAPH-2F932 +2F933;ID # CJK COMPATIBILITY IDEOGRAPH-2F933 +2F934;ID # CJK COMPATIBILITY IDEOGRAPH-2F934 +2F935;ID # CJK COMPATIBILITY IDEOGRAPH-2F935 +2F936;ID # CJK COMPATIBILITY IDEOGRAPH-2F936 +2F937;ID # CJK COMPATIBILITY IDEOGRAPH-2F937 +2F938;ID # CJK COMPATIBILITY IDEOGRAPH-2F938 +2F939;ID # CJK COMPATIBILITY IDEOGRAPH-2F939 +2F93A;ID # CJK COMPATIBILITY IDEOGRAPH-2F93A +2F93B;ID # CJK COMPATIBILITY IDEOGRAPH-2F93B +2F93C;ID # CJK COMPATIBILITY IDEOGRAPH-2F93C +2F93D;ID # CJK COMPATIBILITY IDEOGRAPH-2F93D +2F93E;ID # CJK COMPATIBILITY IDEOGRAPH-2F93E +2F93F;ID # CJK COMPATIBILITY IDEOGRAPH-2F93F +2F940;ID # CJK COMPATIBILITY IDEOGRAPH-2F940 +2F941;ID # CJK COMPATIBILITY IDEOGRAPH-2F941 +2F942;ID # CJK COMPATIBILITY IDEOGRAPH-2F942 +2F943;ID # CJK COMPATIBILITY IDEOGRAPH-2F943 +2F944;ID # CJK COMPATIBILITY IDEOGRAPH-2F944 +2F945;ID # CJK COMPATIBILITY IDEOGRAPH-2F945 +2F946;ID # CJK COMPATIBILITY IDEOGRAPH-2F946 +2F947;ID # CJK COMPATIBILITY IDEOGRAPH-2F947 +2F948;ID # CJK COMPATIBILITY IDEOGRAPH-2F948 +2F949;ID # CJK COMPATIBILITY IDEOGRAPH-2F949 +2F94A;ID # CJK COMPATIBILITY IDEOGRAPH-2F94A +2F94B;ID # CJK COMPATIBILITY IDEOGRAPH-2F94B +2F94C;ID # CJK COMPATIBILITY IDEOGRAPH-2F94C +2F94D;ID # CJK COMPATIBILITY IDEOGRAPH-2F94D +2F94E;ID # CJK COMPATIBILITY IDEOGRAPH-2F94E +2F94F;ID # CJK COMPATIBILITY IDEOGRAPH-2F94F +2F950;ID # CJK COMPATIBILITY IDEOGRAPH-2F950 +2F951;ID # CJK COMPATIBILITY IDEOGRAPH-2F951 +2F952;ID # CJK COMPATIBILITY IDEOGRAPH-2F952 +2F953;ID # CJK COMPATIBILITY IDEOGRAPH-2F953 +2F954;ID # CJK COMPATIBILITY IDEOGRAPH-2F954 +2F955;ID # CJK COMPATIBILITY IDEOGRAPH-2F955 +2F956;ID # CJK COMPATIBILITY IDEOGRAPH-2F956 +2F957;ID # CJK COMPATIBILITY IDEOGRAPH-2F957 +2F958;ID # CJK COMPATIBILITY IDEOGRAPH-2F958 +2F959;ID # CJK COMPATIBILITY IDEOGRAPH-2F959 +2F95A;ID # CJK COMPATIBILITY IDEOGRAPH-2F95A +2F95B;ID # CJK COMPATIBILITY IDEOGRAPH-2F95B +2F95C;ID # CJK COMPATIBILITY IDEOGRAPH-2F95C +2F95D;ID # CJK COMPATIBILITY IDEOGRAPH-2F95D +2F95E;ID # CJK COMPATIBILITY IDEOGRAPH-2F95E +2F95F;ID # CJK COMPATIBILITY IDEOGRAPH-2F95F +2F960;ID # CJK COMPATIBILITY IDEOGRAPH-2F960 +2F961;ID # CJK COMPATIBILITY IDEOGRAPH-2F961 +2F962;ID # CJK COMPATIBILITY IDEOGRAPH-2F962 +2F963;ID # CJK COMPATIBILITY IDEOGRAPH-2F963 +2F964;ID # CJK COMPATIBILITY IDEOGRAPH-2F964 +2F965;ID # CJK COMPATIBILITY IDEOGRAPH-2F965 +2F966;ID # CJK COMPATIBILITY IDEOGRAPH-2F966 +2F967;ID # CJK COMPATIBILITY IDEOGRAPH-2F967 +2F968;ID # CJK COMPATIBILITY IDEOGRAPH-2F968 +2F969;ID # CJK COMPATIBILITY IDEOGRAPH-2F969 +2F96A;ID # CJK COMPATIBILITY IDEOGRAPH-2F96A +2F96B;ID # CJK COMPATIBILITY IDEOGRAPH-2F96B +2F96C;ID # CJK COMPATIBILITY IDEOGRAPH-2F96C +2F96D;ID # CJK COMPATIBILITY IDEOGRAPH-2F96D +2F96E;ID # CJK COMPATIBILITY IDEOGRAPH-2F96E +2F96F;ID # CJK COMPATIBILITY IDEOGRAPH-2F96F +2F970;ID # CJK COMPATIBILITY IDEOGRAPH-2F970 +2F971;ID # CJK COMPATIBILITY IDEOGRAPH-2F971 +2F972;ID # CJK COMPATIBILITY IDEOGRAPH-2F972 +2F973;ID # CJK COMPATIBILITY IDEOGRAPH-2F973 +2F974;ID # CJK COMPATIBILITY IDEOGRAPH-2F974 +2F975;ID # CJK COMPATIBILITY IDEOGRAPH-2F975 +2F976;ID # CJK COMPATIBILITY IDEOGRAPH-2F976 +2F977;ID # CJK COMPATIBILITY IDEOGRAPH-2F977 +2F978;ID # CJK COMPATIBILITY IDEOGRAPH-2F978 +2F979;ID # CJK COMPATIBILITY IDEOGRAPH-2F979 +2F97A;ID # CJK COMPATIBILITY IDEOGRAPH-2F97A +2F97B;ID # CJK COMPATIBILITY IDEOGRAPH-2F97B +2F97C;ID # CJK COMPATIBILITY IDEOGRAPH-2F97C +2F97D;ID # CJK COMPATIBILITY IDEOGRAPH-2F97D +2F97E;ID # CJK COMPATIBILITY IDEOGRAPH-2F97E +2F97F;ID # CJK COMPATIBILITY IDEOGRAPH-2F97F +2F980;ID # CJK COMPATIBILITY IDEOGRAPH-2F980 +2F981;ID # CJK COMPATIBILITY IDEOGRAPH-2F981 +2F982;ID # CJK COMPATIBILITY IDEOGRAPH-2F982 +2F983;ID # CJK COMPATIBILITY IDEOGRAPH-2F983 +2F984;ID # CJK COMPATIBILITY IDEOGRAPH-2F984 +2F985;ID # CJK COMPATIBILITY IDEOGRAPH-2F985 +2F986;ID # CJK COMPATIBILITY IDEOGRAPH-2F986 +2F987;ID # CJK COMPATIBILITY IDEOGRAPH-2F987 +2F988;ID # CJK COMPATIBILITY IDEOGRAPH-2F988 +2F989;ID # CJK COMPATIBILITY IDEOGRAPH-2F989 +2F98A;ID # CJK COMPATIBILITY IDEOGRAPH-2F98A +2F98B;ID # CJK COMPATIBILITY IDEOGRAPH-2F98B +2F98C;ID # CJK COMPATIBILITY IDEOGRAPH-2F98C +2F98D;ID # CJK COMPATIBILITY IDEOGRAPH-2F98D +2F98E;ID # CJK COMPATIBILITY IDEOGRAPH-2F98E +2F98F;ID # CJK COMPATIBILITY IDEOGRAPH-2F98F +2F990;ID # CJK COMPATIBILITY IDEOGRAPH-2F990 +2F991;ID # CJK COMPATIBILITY IDEOGRAPH-2F991 +2F992;ID # CJK COMPATIBILITY IDEOGRAPH-2F992 +2F993;ID # CJK COMPATIBILITY IDEOGRAPH-2F993 +2F994;ID # CJK COMPATIBILITY IDEOGRAPH-2F994 +2F995;ID # CJK COMPATIBILITY IDEOGRAPH-2F995 +2F996;ID # CJK COMPATIBILITY IDEOGRAPH-2F996 +2F997;ID # CJK COMPATIBILITY IDEOGRAPH-2F997 +2F998;ID # CJK COMPATIBILITY IDEOGRAPH-2F998 +2F999;ID # CJK COMPATIBILITY IDEOGRAPH-2F999 +2F99A;ID # CJK COMPATIBILITY IDEOGRAPH-2F99A +2F99B;ID # CJK COMPATIBILITY IDEOGRAPH-2F99B +2F99C;ID # CJK COMPATIBILITY IDEOGRAPH-2F99C +2F99D;ID # CJK COMPATIBILITY IDEOGRAPH-2F99D +2F99E;ID # CJK COMPATIBILITY IDEOGRAPH-2F99E +2F99F;ID # CJK COMPATIBILITY IDEOGRAPH-2F99F +2F9A0;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A0 +2F9A1;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A1 +2F9A2;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A2 +2F9A3;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A3 +2F9A4;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A4 +2F9A5;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A5 +2F9A6;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A6 +2F9A7;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A7 +2F9A8;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A8 +2F9A9;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A9 +2F9AA;ID # CJK COMPATIBILITY IDEOGRAPH-2F9AA +2F9AB;ID # CJK COMPATIBILITY IDEOGRAPH-2F9AB +2F9AC;ID # CJK COMPATIBILITY IDEOGRAPH-2F9AC +2F9AD;ID # CJK COMPATIBILITY IDEOGRAPH-2F9AD +2F9AE;ID # CJK COMPATIBILITY IDEOGRAPH-2F9AE +2F9AF;ID # CJK COMPATIBILITY IDEOGRAPH-2F9AF +2F9B0;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B0 +2F9B1;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B1 +2F9B2;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B2 +2F9B3;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B3 +2F9B4;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B4 +2F9B5;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B5 +2F9B6;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B6 +2F9B7;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B7 +2F9B8;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B8 +2F9B9;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B9 +2F9BA;ID # CJK COMPATIBILITY IDEOGRAPH-2F9BA +2F9BB;ID # CJK COMPATIBILITY IDEOGRAPH-2F9BB +2F9BC;ID # CJK COMPATIBILITY IDEOGRAPH-2F9BC +2F9BD;ID # CJK COMPATIBILITY IDEOGRAPH-2F9BD +2F9BE;ID # CJK COMPATIBILITY IDEOGRAPH-2F9BE +2F9BF;ID # CJK COMPATIBILITY IDEOGRAPH-2F9BF +2F9C0;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C0 +2F9C1;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C1 +2F9C2;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C2 +2F9C3;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C3 +2F9C4;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C4 +2F9C5;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C5 +2F9C6;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C6 +2F9C7;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C7 +2F9C8;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C8 +2F9C9;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C9 +2F9CA;ID # CJK COMPATIBILITY IDEOGRAPH-2F9CA +2F9CB;ID # CJK COMPATIBILITY IDEOGRAPH-2F9CB +2F9CC;ID # CJK COMPATIBILITY IDEOGRAPH-2F9CC +2F9CD;ID # CJK COMPATIBILITY IDEOGRAPH-2F9CD +2F9CE;ID # CJK COMPATIBILITY IDEOGRAPH-2F9CE +2F9CF;ID # CJK COMPATIBILITY IDEOGRAPH-2F9CF +2F9D0;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D0 +2F9D1;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D1 +2F9D2;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D2 +2F9D3;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D3 +2F9D4;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D4 +2F9D5;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D5 +2F9D6;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D6 +2F9D7;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D7 +2F9D8;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D8 +2F9D9;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D9 +2F9DA;ID # CJK COMPATIBILITY IDEOGRAPH-2F9DA +2F9DB;ID # CJK COMPATIBILITY IDEOGRAPH-2F9DB +2F9DC;ID # CJK COMPATIBILITY IDEOGRAPH-2F9DC +2F9DD;ID # CJK COMPATIBILITY IDEOGRAPH-2F9DD +2F9DE;ID # CJK COMPATIBILITY IDEOGRAPH-2F9DE +2F9DF;ID # CJK COMPATIBILITY IDEOGRAPH-2F9DF +2F9E0;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E0 +2F9E1;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E1 +2F9E2;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E2 +2F9E3;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E3 +2F9E4;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E4 +2F9E5;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E5 +2F9E6;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E6 +2F9E7;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E7 +2F9E8;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E8 +2F9E9;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E9 +2F9EA;ID # CJK COMPATIBILITY IDEOGRAPH-2F9EA +2F9EB;ID # CJK COMPATIBILITY IDEOGRAPH-2F9EB +2F9EC;ID # CJK COMPATIBILITY IDEOGRAPH-2F9EC +2F9ED;ID # CJK COMPATIBILITY IDEOGRAPH-2F9ED +2F9EE;ID # CJK COMPATIBILITY IDEOGRAPH-2F9EE +2F9EF;ID # CJK COMPATIBILITY IDEOGRAPH-2F9EF +2F9F0;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F0 +2F9F1;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F1 +2F9F2;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F2 +2F9F3;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F3 +2F9F4;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F4 +2F9F5;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F5 +2F9F6;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F6 +2F9F7;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F7 +2F9F8;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F8 +2F9F9;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F9 +2F9FA;ID # CJK COMPATIBILITY IDEOGRAPH-2F9FA +2F9FB;ID # CJK COMPATIBILITY IDEOGRAPH-2F9FB +2F9FC;ID # CJK COMPATIBILITY IDEOGRAPH-2F9FC +2F9FD;ID # CJK COMPATIBILITY IDEOGRAPH-2F9FD +2F9FE;ID # CJK COMPATIBILITY IDEOGRAPH-2F9FE +2F9FF;ID # CJK COMPATIBILITY IDEOGRAPH-2F9FF +2FA00;ID # CJK COMPATIBILITY IDEOGRAPH-2FA00 +2FA01;ID # CJK COMPATIBILITY IDEOGRAPH-2FA01 +2FA02;ID # CJK COMPATIBILITY IDEOGRAPH-2FA02 +2FA03;ID # CJK COMPATIBILITY IDEOGRAPH-2FA03 +2FA04;ID # CJK COMPATIBILITY IDEOGRAPH-2FA04 +2FA05;ID # CJK COMPATIBILITY IDEOGRAPH-2FA05 +2FA06;ID # CJK COMPATIBILITY IDEOGRAPH-2FA06 +2FA07;ID # CJK COMPATIBILITY IDEOGRAPH-2FA07 +2FA08;ID # CJK COMPATIBILITY IDEOGRAPH-2FA08 +2FA09;ID # CJK COMPATIBILITY IDEOGRAPH-2FA09 +2FA0A;ID # CJK COMPATIBILITY IDEOGRAPH-2FA0A +2FA0B;ID # CJK COMPATIBILITY IDEOGRAPH-2FA0B +2FA0C;ID # CJK COMPATIBILITY IDEOGRAPH-2FA0C +2FA0D;ID # CJK COMPATIBILITY IDEOGRAPH-2FA0D +2FA0E;ID # CJK COMPATIBILITY IDEOGRAPH-2FA0E +2FA0F;ID # CJK COMPATIBILITY IDEOGRAPH-2FA0F +2FA10;ID # CJK COMPATIBILITY IDEOGRAPH-2FA10 +2FA11;ID # CJK COMPATIBILITY IDEOGRAPH-2FA11 +2FA12;ID # CJK COMPATIBILITY IDEOGRAPH-2FA12 +2FA13;ID # CJK COMPATIBILITY IDEOGRAPH-2FA13 +2FA14;ID # CJK COMPATIBILITY IDEOGRAPH-2FA14 +2FA15;ID # CJK COMPATIBILITY IDEOGRAPH-2FA15 +2FA16;ID # CJK COMPATIBILITY IDEOGRAPH-2FA16 +2FA17;ID # CJK COMPATIBILITY IDEOGRAPH-2FA17 +2FA18;ID # CJK COMPATIBILITY IDEOGRAPH-2FA18 +2FA19;ID # CJK COMPATIBILITY IDEOGRAPH-2FA19 +2FA1A;ID # CJK COMPATIBILITY IDEOGRAPH-2FA1A +2FA1B;ID # CJK COMPATIBILITY IDEOGRAPH-2FA1B +2FA1C;ID # CJK COMPATIBILITY IDEOGRAPH-2FA1C +2FA1D;ID # CJK COMPATIBILITY IDEOGRAPH-2FA1D +E0001;CM # LANGUAGE TAG +E0020;CM # TAG SPACE +E0021;CM # TAG EXCLAMATION MARK +E0022;CM # TAG QUOTATION MARK +E0023;CM # TAG NUMBER SIGN +E0024;CM # TAG DOLLAR SIGN +E0025;CM # TAG PERCENT SIGN +E0026;CM # TAG AMPERSAND +E0027;CM # TAG APOSTROPHE +E0028;CM # TAG LEFT PARENTHESIS +E0029;CM # TAG RIGHT PARENTHESIS +E002A;CM # TAG ASTERISK +E002B;CM # TAG PLUS SIGN +E002C;CM # TAG COMMA +E002D;CM # TAG HYPHEN-MINUS +E002E;CM # TAG FULL STOP +E002F;CM # TAG SOLIDUS +E0030;CM # TAG DIGIT ZERO +E0031;CM # TAG DIGIT ONE +E0032;CM # TAG DIGIT TWO +E0033;CM # TAG DIGIT THREE +E0034;CM # TAG DIGIT FOUR +E0035;CM # TAG DIGIT FIVE +E0036;CM # TAG DIGIT SIX +E0037;CM # TAG DIGIT SEVEN +E0038;CM # TAG DIGIT EIGHT +E0039;CM # TAG DIGIT NINE +E003A;CM # TAG COLON +E003B;CM # TAG SEMICOLON +E003C;CM # TAG LESS-THAN SIGN +E003D;CM # TAG EQUALS SIGN +E003E;CM # TAG GREATER-THAN SIGN +E003F;CM # TAG QUESTION MARK +E0040;CM # TAG COMMERCIAL AT +E0041;CM # TAG LATIN CAPITAL LETTER A +E0042;CM # TAG LATIN CAPITAL LETTER B +E0043;CM # TAG LATIN CAPITAL LETTER C +E0044;CM # TAG LATIN CAPITAL LETTER D +E0045;CM # TAG LATIN CAPITAL LETTER E +E0046;CM # TAG LATIN CAPITAL LETTER F +E0047;CM # TAG LATIN CAPITAL LETTER G +E0048;CM # TAG LATIN CAPITAL LETTER H +E0049;CM # TAG LATIN CAPITAL LETTER I +E004A;CM # TAG LATIN CAPITAL LETTER J +E004B;CM # TAG LATIN CAPITAL LETTER K +E004C;CM # TAG LATIN CAPITAL LETTER L +E004D;CM # TAG LATIN CAPITAL LETTER M +E004E;CM # TAG LATIN CAPITAL LETTER N +E004F;CM # TAG LATIN CAPITAL LETTER O +E0050;CM # TAG LATIN CAPITAL LETTER P +E0051;CM # TAG LATIN CAPITAL LETTER Q +E0052;CM # TAG LATIN CAPITAL LETTER R +E0053;CM # TAG LATIN CAPITAL LETTER S +E0054;CM # TAG LATIN CAPITAL LETTER T +E0055;CM # TAG LATIN CAPITAL LETTER U +E0056;CM # TAG LATIN CAPITAL LETTER V +E0057;CM # TAG LATIN CAPITAL LETTER W +E0058;CM # TAG LATIN CAPITAL LETTER X +E0059;CM # TAG LATIN CAPITAL LETTER Y +E005A;CM # TAG LATIN CAPITAL LETTER Z +E005B;CM # TAG LEFT SQUARE BRACKET +E005C;CM # TAG REVERSE SOLIDUS +E005D;CM # TAG RIGHT SQUARE BRACKET +E005E;CM # TAG CIRCUMFLEX ACCENT +E005F;CM # TAG LOW LINE +E0060;CM # TAG GRAVE ACCENT +E0061;CM # TAG LATIN SMALL LETTER A +E0062;CM # TAG LATIN SMALL LETTER B +E0063;CM # TAG LATIN SMALL LETTER C +E0064;CM # TAG LATIN SMALL LETTER D +E0065;CM # TAG LATIN SMALL LETTER E +E0066;CM # TAG LATIN SMALL LETTER F +E0067;CM # TAG LATIN SMALL LETTER G +E0068;CM # TAG LATIN SMALL LETTER H +E0069;CM # TAG LATIN SMALL LETTER I +E006A;CM # TAG LATIN SMALL LETTER J +E006B;CM # TAG LATIN SMALL LETTER K +E006C;CM # TAG LATIN SMALL LETTER L +E006D;CM # TAG LATIN SMALL LETTER M +E006E;CM # TAG LATIN SMALL LETTER N +E006F;CM # TAG LATIN SMALL LETTER O +E0070;CM # TAG LATIN SMALL LETTER P +E0071;CM # TAG LATIN SMALL LETTER Q +E0072;CM # TAG LATIN SMALL LETTER R +E0073;CM # TAG LATIN SMALL LETTER S +E0074;CM # TAG LATIN SMALL LETTER T +E0075;CM # TAG LATIN SMALL LETTER U +E0076;CM # TAG LATIN SMALL LETTER V +E0077;CM # TAG LATIN SMALL LETTER W +E0078;CM # TAG LATIN SMALL LETTER X +E0079;CM # TAG LATIN SMALL LETTER Y +E007A;CM # TAG LATIN SMALL LETTER Z +E007B;CM # TAG LEFT CURLY BRACKET +E007C;CM # TAG VERTICAL LINE +E007D;CM # TAG RIGHT CURLY BRACKET +E007E;CM # TAG TILDE +E007F;CM # CANCEL TAG +F0000..FFFFD;XX # .. +100000..10FFFD;XX # .. diff --git a/lib/Makefile.am b/lib/Makefile.am new file mode 100644 index 0000000..ca62925 --- /dev/null +++ b/lib/Makefile.am @@ -0,0 +1,52 @@ +## Process this file with automake to produce Makefile.in +# Copyright (C) 2002 Simon Josefsson. +# +# This file is part of Libgsasl. +# +# Libgsasl is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of +# the License, or (at your option) any later version. +# +# Libgsasl 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 program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +EXTRA_DIST = gen-unicode-tables.pl UnicodeData-3.2.0.txt LineBreak-3.2.0.txt SpecialCasing-3.2.0.txt CaseFolding-3.2.0.txt CompositionExclusions-3.2.0.txt + +lib_LTLIBRARIES = libgsasl.la + +INCLUDES = -I../argp -I../intl @LIBNTLM_CFLAGS@ @LIBGCRYPT_CFLAGS@ @GSSAPI_CFLAGS@ + +include_HEADERS = gsasl.h + +libgsasl_la_SOURCES = init.c done.c error.c version.c callback.c \ + supportp.c suggest.c listmech.c \ + hexdump.c base64.c md5pwd.c \ + unicode.c gunidecomp.h gunicomp.h \ + xstart.c xstep.c xfinish.c \ + common.c internal.h gettext.h \ + external.h external.c \ + anonymous.h anonymous.c \ + plain.h plain.c \ + login.h login.c \ + cram-md5.h cram-md5.c \ + digest-md5.h digest-md5.c \ + x-ntlm.h ntlm.c \ + x-gssapi.h gssapi.c \ + securid.h securid.c + +libgsasl_la_LIBADD = @LTLIBINTL@ @LIBGCRYPT_LIBS@ @LIBNTLM_LIBS@ @GSSAPI_LIBS@ -lm +libgsasl_la_LDFLAGS = -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) + +localedir = $(datadir)/locale + +DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@ + +gunicomp.h gunidecomp.h: gen-unicode-tables.pl UnicodeData-3.2.0.txt LineBreak-3.2.0.txt SpecialCasing-3.2.0.txt CaseFolding-3.2.0.txt CompositionExclusions-3.2.0.txt + $(PERL) $(srcdir)/gen-unicode-tables.pl -decomp 3.2 UnicodeData-3.2.0.txt LineBreak-3.2.0.txt SpecialCasing-3.2.0.txt CaseFolding-3.2.0.txt CompositionExclusions-3.2.0.txt diff --git a/lib/SpecialCasing-3.2.0.txt b/lib/SpecialCasing-3.2.0.txt new file mode 100644 index 0000000..f25ac9b --- /dev/null +++ b/lib/SpecialCasing-3.2.0.txt @@ -0,0 +1,255 @@ +# SpecialCasing-3.2.0.txt +# Date: 2002-03-19,23:31:42 GMT [MD] +# +# Special Casing Properties +# +# This file is a supplement to the UnicodeData file. +# It contains additional information about the casing of Unicode characters. +# (For compatibility, the UnicodeData.txt file only contains case mappings for +# characters where they are 1-1, and does not have locale-specific mappings.) +# For more information, see +# UTR #21 Case Mappings, at http://www.unicode.org/unicode/reports/tr21/ +# +# ================================================================================ +# Format +# ================================================================================ +# The entries in this file are in the following machine-readable format: +# +# ; ; ; <upper> ; (<condition_list> ;)? # <comment> +# +# <code>, <lower>, <title>, and <upper> provide character values in hex. If there is more than +# one character, they are separated by spaces. Other than as used to separate elements, +# spaces are to be ignored. +# +# The <condition_list> is optional. Where present, it consists of one or more locales or contexts, +# separated by spaces. In these conditions: +# - A condition list overrides the normal behavior if all of the listed conditions are true. +# - The context is always the context of the characters in the original string, +# NOT in the resulting string. +# - Case distinctions in the condition list are not significant. +# - Conditions preceded by "Not_" represent the negation of the condition. +# +# A locale is defined as: +# <locale> := <ISO_639_code> ( "_" <ISO_3166_code> ( "_" <variant> )? )? +# <ISO_3166_code> := 2-letter ISO country code, +# <ISO_639_code> := 2-letter ISO language code +# +# A context is one of the following, as defined in UAX #21: Case Mappings: +# Final_Sigma, After_Soft_Dotted, More_Above, Before_Dot +# +# Parsers of this file must be prepared to deal future additions to this format: +# * Additional contexts +# * Additional fields +# ================================================================================ + +# ================================================================================ +# Unconditional mappings +# ================================================================================ + +# The German es-zed is special--the normal mapping is to SS. +# Note: the titlecase should never occur in practice. It is equal to titlecase(uppercase(<es-zed>)) + +00DF; 00DF; 0053 0073; 0053 0053; # LATIN SMALL LETTER SHARP S + +# Preserve canonical equivalence for I with dot. Turkic is handled below. + +0130; 0069 0307; 0130; 0130; # LATIN CAPITAL LETTER I WITH DOT ABOVE + +# Ligatures + +FB00; FB00; 0046 0066; 0046 0046; # LATIN SMALL LIGATURE FF +FB01; FB01; 0046 0069; 0046 0049; # LATIN SMALL LIGATURE FI +FB02; FB02; 0046 006C; 0046 004C; # LATIN SMALL LIGATURE FL +FB03; FB03; 0046 0066 0069; 0046 0046 0049; # LATIN SMALL LIGATURE FFI +FB04; FB04; 0046 0066 006C; 0046 0046 004C; # LATIN SMALL LIGATURE FFL +FB05; FB05; 0053 0074; 0053 0054; # LATIN SMALL LIGATURE LONG S T +FB06; FB06; 0053 0074; 0053 0054; # LATIN SMALL LIGATURE ST + +0587; 0587; 0535 0582; 0535 0552; # ARMENIAN SMALL LIGATURE ECH YIWN +FB13; FB13; 0544 0576; 0544 0546; # ARMENIAN SMALL LIGATURE MEN NOW +FB14; FB14; 0544 0565; 0544 0535; # ARMENIAN SMALL LIGATURE MEN ECH +FB15; FB15; 0544 056B; 0544 053B; # ARMENIAN SMALL LIGATURE MEN INI +FB16; FB16; 054E 0576; 054E 0546; # ARMENIAN SMALL LIGATURE VEW NOW +FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH + +# No corresponding uppercase precomposed character + +0149; 0149; 02BC 004E; 02BC 004E; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +0390; 0390; 0399 0308 0301; 0399 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +03B0; 03B0; 03A5 0308 0301; 03A5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +01F0; 01F0; 004A 030C; 004A 030C; # LATIN SMALL LETTER J WITH CARON +1E96; 1E96; 0048 0331; 0048 0331; # LATIN SMALL LETTER H WITH LINE BELOW +1E97; 1E97; 0054 0308; 0054 0308; # LATIN SMALL LETTER T WITH DIAERESIS +1E98; 1E98; 0057 030A; 0057 030A; # LATIN SMALL LETTER W WITH RING ABOVE +1E99; 1E99; 0059 030A; 0059 030A; # LATIN SMALL LETTER Y WITH RING ABOVE +1E9A; 1E9A; 0041 02BE; 0041 02BE; # LATIN SMALL LETTER A WITH RIGHT HALF RING +1F50; 1F50; 03A5 0313; 03A5 0313; # GREEK SMALL LETTER UPSILON WITH PSILI +1F52; 1F52; 03A5 0313 0300; 03A5 0313 0300; # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA +1F54; 1F54; 03A5 0313 0301; 03A5 0313 0301; # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA +1F56; 1F56; 03A5 0313 0342; 03A5 0313 0342; # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI +1FB6; 1FB6; 0391 0342; 0391 0342; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI +1FC6; 1FC6; 0397 0342; 0397 0342; # GREEK SMALL LETTER ETA WITH PERISPOMENI +1FD2; 1FD2; 0399 0308 0300; 0399 0308 0300; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +1FD3; 1FD3; 0399 0308 0301; 0399 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6; 1FD6; 0399 0342; 0399 0342; # GREEK SMALL LETTER IOTA WITH PERISPOMENI +1FD7; 1FD7; 0399 0308 0342; 0399 0308 0342; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +1FE2; 1FE2; 03A5 0308 0300; 03A5 0308 0300; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +1FE3; 1FE3; 03A5 0308 0301; 03A5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +1FE4; 1FE4; 03A1 0313; 03A1 0313; # GREEK SMALL LETTER RHO WITH PSILI +1FE6; 1FE6; 03A5 0342; 03A5 0342; # GREEK SMALL LETTER UPSILON WITH PERISPOMENI +1FE7; 1FE7; 03A5 0308 0342; 03A5 0308 0342; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +1FF6; 1FF6; 03A9 0342; 03A9 0342; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI + +# IMPORTANT-when capitalizing iota-subscript (0345) +# It MUST be in normalized form--moved to the end of any sequence of combining marks. +# This is because logically it represents a following base character! +# E.g. <iota_subscript> (<Mn> | <Mc> | <Me>)+ => (<Mn> | <Mc> | <Me>)+ <iota_subscript> +# It should never be the first character in a word, so in titlecasing it can be left as is. + +# The following cases are already in the UnicodeData file, so are only commented here. + +# 0345; 0345; 0345; 0399; # COMBINING GREEK YPOGEGRAMMENI + +# All letters with YPOGEGRAMMENI (iota-subscript) or PROSGEGRAMMENI (iota adscript) +# have special uppercases. +# Note: characters with PROSGEGRAMMENI are actually titlecase, not uppercase! + +1F80; 1F80; 1F88; 1F08 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +1F81; 1F81; 1F89; 1F09 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +1F82; 1F82; 1F8A; 1F0A 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F83; 1F83; 1F8B; 1F0B 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F84; 1F84; 1F8C; 1F0C 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F85; 1F85; 1F8D; 1F0D 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F86; 1F86; 1F8E; 1F0E 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F87; 1F87; 1F8F; 1F0F 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F88; 1F80; 1F88; 1F08 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F89; 1F81; 1F89; 1F09 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +1F8A; 1F82; 1F8A; 1F0A 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F8B; 1F83; 1F8B; 1F0B 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F8C; 1F84; 1F8C; 1F0C 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F8D; 1F85; 1F8D; 1F0D 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F8E; 1F86; 1F8E; 1F0E 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F8F; 1F87; 1F8F; 1F0F 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F90; 1F90; 1F98; 1F28 0399; # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +1F91; 1F91; 1F99; 1F29 0399; # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +1F92; 1F92; 1F9A; 1F2A 0399; # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F93; 1F93; 1F9B; 1F2B 0399; # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F94; 1F94; 1F9C; 1F2C 0399; # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F95; 1F95; 1F9D; 1F2D 0399; # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F96; 1F96; 1F9E; 1F2E 0399; # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F97; 1F97; 1F9F; 1F2F 0399; # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F98; 1F90; 1F98; 1F28 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F99; 1F91; 1F99; 1F29 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +1F9A; 1F92; 1F9A; 1F2A 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F9B; 1F93; 1F9B; 1F2B 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F9C; 1F94; 1F9C; 1F2C 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F9D; 1F95; 1F9D; 1F2D 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F9E; 1F96; 1F9E; 1F2E 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F9F; 1F97; 1F9F; 1F2F 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FA0; 1FA0; 1FA8; 1F68 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +1FA1; 1FA1; 1FA9; 1F69 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +1FA2; 1FA2; 1FAA; 1F6A 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1FA3; 1FA3; 1FAB; 1F6B 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1FA4; 1FA4; 1FAC; 1F6C 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1FA5; 1FA5; 1FAD; 1F6D 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1FA6; 1FA6; 1FAE; 1F6E 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1FA7; 1FA7; 1FAF; 1F6F 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1FA8; 1FA0; 1FA8; 1F68 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1FA9; 1FA1; 1FA9; 1F69 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +1FAA; 1FA2; 1FAA; 1F6A 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1FAB; 1FA3; 1FAB; 1F6B 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1FAC; 1FA4; 1FAC; 1F6C 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1FAD; 1FA5; 1FAD; 1F6D 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1FAE; 1FA6; 1FAE; 1F6E 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FAF; 1FA7; 1FAF; 1F6F 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FB3; 1FB3; 1FBC; 0391 0399; # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +1FBC; 1FB3; 1FBC; 0391 0399; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FC3; 1FC3; 1FCC; 0397 0399; # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +1FCC; 1FC3; 1FCC; 0397 0399; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FF3; 1FF3; 1FFC; 03A9 0399; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +1FFC; 1FF3; 1FFC; 03A9 0399; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI + +# Some characters with YPOGEGRAMMENI are also have no corresponding titlecases + +1FB2; 1FB2; 1FBA 0345; 1FBA 0399; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +1FB4; 1FB4; 0386 0345; 0386 0399; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FC2; 1FC2; 1FCA 0345; 1FCA 0399; # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +1FC4; 1FC4; 0389 0345; 0389 0399; # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FF2; 1FF2; 1FFA 0345; 1FFA 0399; # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +1FF4; 1FF4; 038F 0345; 038F 0399; # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI + +1FB7; 1FB7; 0391 0342 0345; 0391 0342 0399; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +1FC7; 1FC7; 0397 0342 0345; 0397 0342 0399; # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +1FF7; 1FF7; 03A9 0342 0345; 03A9 0342 0399; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI + +# ================================================================================ +# Conditional mappings +# ================================================================================ + +# Special case for final form of sigma + +03A3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK CAPITAL LETTER SIGMA + +# Note: the following cases for non-final are already in the UnicodeData file. + +# 03A3; 03C3; 03A3; 03A3; # GREEK CAPITAL LETTER SIGMA +# 03C3; 03C3; 03A3; 03A3; # GREEK SMALL LETTER SIGMA +# 03C2; 03C2; 03A3; 03A3; # GREEK SMALL LETTER FINAL SIGMA + +# Note: the following cases are not included, since they would case-fold in lowercasing + +# 03C3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK SMALL LETTER SIGMA +# 03C2; 03C3; 03A3; 03A3; Not_Final_Sigma; # GREEK SMALL LETTER FINAL SIGMA + +# ================================================================================ +# Locale-sensitive mappings +# ================================================================================ + +# Lithuanian + +# Lithuanian retains the dot in a lowercase i when followed by accents. + +# Remove DOT ABOVE after "i" with upper or titlecase + +0307; 0307; ; ; lt After_Soft_Dotted; # COMBINING DOT ABOVE + +# Introduce an explicit dot above when lowercasing capital I's and J's +# whenever there are more accents above. +# (of the accents used in Lithuanian: grave, acute, tilde above, and ogonek) + +0049; 0069 0307; 0049; 0049; lt More_Above; # LATIN CAPITAL LETTER I +004A; 006A 0307; 004A; 004A; lt More_Above; # LATIN CAPITAL LETTER J +012E; 012F 0307; 012E; 012E; lt More_Above; # LATIN CAPITAL LETTER I WITH OGONEK +00CC; 0069 0307 0300; 00CC; 00CC; lt; # LATIN CAPITAL LETTER I WITH GRAVE +00CD; 0069 0307 0301; 00CD; 00CD; lt; # LATIN CAPITAL LETTER I WITH ACUTE +0128; 0069 0307 0303; 0128; 0128; lt; # LATIN CAPITAL LETTER I WITH TILDE + +# ================================================================================ + +# Turkish and Azeri + +# I and i-dotless; I-dot and i are case pairs in Turkish and Azeri +# The following rules handle those cases. + +0130; 0069; 0130; 0130; tr # LATIN CAPITAL LETTER I WITH DOT ABOVE +0130; 0069; 0130; 0130; az # LATIN CAPITAL LETTER I WITH DOT ABOVE + +# When lowercasing, remove dot_above in the sequence I + dot_above, which will turn into i. +# This matches the behavior of the canonically equivalent I-dot_above + +0307; ; 0307; 0307; tr After_Soft_Dotted; # COMBINING DOT ABOVE +0307; ; 0307; 0307; az After_Soft_Dotted; # COMBINING DOT ABOVE + +# When lowercasing, unless an I is before a dot_above, it turns into a dotless i. + +0049; 0131; 0049; 0049; tr Not_Before_Dot; # LATIN CAPITAL LETTER I +0049; 0131; 0049; 0049; az Not_Before_Dot; # LATIN CAPITAL LETTER I + +# When uppercasing, i turns into a dotted capital I + +0069; 0069; 0130; 0130; tr; # LATIN SMALL LETTER I +0069; 0069; 0130; 0130; az; # LATIN SMALL LETTER I + +# Note: the following case is already in the UnicodeData file. + +# 0131; 0131; 0049; 0049; tr; # LATIN SMALL LETTER DOTLESS I diff --git a/lib/UnicodeData-3.2.0.txt b/lib/UnicodeData-3.2.0.txt new file mode 100644 index 0000000..125a692 --- /dev/null +++ b/lib/UnicodeData-3.2.0.txt @@ -0,0 +1,13874 @@ +0000;<control>;Cc;0;BN;;;;;N;NULL;;;; +0001;<control>;Cc;0;BN;;;;;N;START OF HEADING;;;; +0002;<control>;Cc;0;BN;;;;;N;START OF TEXT;;;; +0003;<control>;Cc;0;BN;;;;;N;END OF TEXT;;;; +0004;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION;;;; +0005;<control>;Cc;0;BN;;;;;N;ENQUIRY;;;; +0006;<control>;Cc;0;BN;;;;;N;ACKNOWLEDGE;;;; +0007;<control>;Cc;0;BN;;;;;N;BELL;;;; +0008;<control>;Cc;0;BN;;;;;N;BACKSPACE;;;; +0009;<control>;Cc;0;S;;;;;N;CHARACTER TABULATION;;;; +000A;<control>;Cc;0;B;;;;;N;LINE FEED (LF);;;; +000B;<control>;Cc;0;S;;;;;N;LINE TABULATION;;;; +000C;<control>;Cc;0;WS;;;;;N;FORM FEED (FF);;;; +000D;<control>;Cc;0;B;;;;;N;CARRIAGE RETURN (CR);;;; +000E;<control>;Cc;0;BN;;;;;N;SHIFT OUT;;;; +000F;<control>;Cc;0;BN;;;;;N;SHIFT IN;;;; +0010;<control>;Cc;0;BN;;;;;N;DATA LINK ESCAPE;;;; +0011;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL ONE;;;; +0012;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL TWO;;;; +0013;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL THREE;;;; +0014;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL FOUR;;;; +0015;<control>;Cc;0;BN;;;;;N;NEGATIVE ACKNOWLEDGE;;;; +0016;<control>;Cc;0;BN;;;;;N;SYNCHRONOUS IDLE;;;; +0017;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION BLOCK;;;; +0018;<control>;Cc;0;BN;;;;;N;CANCEL;;;; +0019;<control>;Cc;0;BN;;;;;N;END OF MEDIUM;;;; +001A;<control>;Cc;0;BN;;;;;N;SUBSTITUTE;;;; +001B;<control>;Cc;0;BN;;;;;N;ESCAPE;;;; +001C;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR FOUR;;;; +001D;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR THREE;;;; +001E;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR TWO;;;; +001F;<control>;Cc;0;S;;;;;N;INFORMATION SEPARATOR ONE;;;; +0020;SPACE;Zs;0;WS;;;;;N;;;;; +0021;EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +0022;QUOTATION MARK;Po;0;ON;;;;;N;;;;; +0023;NUMBER SIGN;Po;0;ET;;;;;N;;;;; +0024;DOLLAR SIGN;Sc;0;ET;;;;;N;;;;; +0025;PERCENT SIGN;Po;0;ET;;;;;N;;;;; +0026;AMPERSAND;Po;0;ON;;;;;N;;;;; +0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;; +0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;; +0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;; +002A;ASTERISK;Po;0;ON;;;;;N;;;;; +002B;PLUS SIGN;Sm;0;ET;;;;;N;;;;; +002C;COMMA;Po;0;CS;;;;;N;;;;; +002D;HYPHEN-MINUS;Pd;0;ET;;;;;N;;;;; +002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;; +002F;SOLIDUS;Po;0;ES;;;;;N;SLASH;;;; +0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;; +0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;; +0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;; +0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;; +0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;; +0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;; +0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;; +0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;; +0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;; +0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;; +003A;COLON;Po;0;CS;;;;;N;;;;; +003B;SEMICOLON;Po;0;ON;;;;;N;;;;; +003C;LESS-THAN SIGN;Sm;0;ON;;;;;Y;;;;; +003D;EQUALS SIGN;Sm;0;ON;;;;;N;;;;; +003E;GREATER-THAN SIGN;Sm;0;ON;;;;;Y;;;;; +003F;QUESTION MARK;Po;0;ON;;;;;N;;;;; +0040;COMMERCIAL AT;Po;0;ON;;;;;N;;;;; +0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061; +0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062; +0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063; +0044;LATIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;0064; +0045;LATIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;0065; +0046;LATIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;0066; +0047;LATIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;0067; +0048;LATIN CAPITAL LETTER H;Lu;0;L;;;;;N;;;;0068; +0049;LATIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;0069; +004A;LATIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;006A; +004B;LATIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;006B; +004C;LATIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;006C; +004D;LATIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;006D; +004E;LATIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;006E; +004F;LATIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;006F; +0050;LATIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;0070; +0051;LATIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;0071; +0052;LATIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;0072; +0053;LATIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;0073; +0054;LATIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;0074; +0055;LATIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0075; +0056;LATIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;0076; +0057;LATIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;0077; +0058;LATIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;0078; +0059;LATIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;0079; +005A;LATIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;007A; +005B;LEFT SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING SQUARE BRACKET;;;; +005C;REVERSE SOLIDUS;Po;0;ON;;;;;N;BACKSLASH;;;; +005D;RIGHT SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING SQUARE BRACKET;;;; +005E;CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;SPACING CIRCUMFLEX;;;; +005F;LOW LINE;Pc;0;ON;;;;;N;SPACING UNDERSCORE;;;; +0060;GRAVE ACCENT;Sk;0;ON;;;;;N;SPACING GRAVE;;;; +0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041 +0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042 +0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043 +0064;LATIN SMALL LETTER D;Ll;0;L;;;;;N;;;0044;;0044 +0065;LATIN SMALL LETTER E;Ll;0;L;;;;;N;;;0045;;0045 +0066;LATIN SMALL LETTER F;Ll;0;L;;;;;N;;;0046;;0046 +0067;LATIN SMALL LETTER G;Ll;0;L;;;;;N;;;0047;;0047 +0068;LATIN SMALL LETTER H;Ll;0;L;;;;;N;;;0048;;0048 +0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049 +006A;LATIN SMALL LETTER J;Ll;0;L;;;;;N;;;004A;;004A +006B;LATIN SMALL LETTER K;Ll;0;L;;;;;N;;;004B;;004B +006C;LATIN SMALL LETTER L;Ll;0;L;;;;;N;;;004C;;004C +006D;LATIN SMALL LETTER M;Ll;0;L;;;;;N;;;004D;;004D +006E;LATIN SMALL LETTER N;Ll;0;L;;;;;N;;;004E;;004E +006F;LATIN SMALL LETTER O;Ll;0;L;;;;;N;;;004F;;004F +0070;LATIN SMALL LETTER P;Ll;0;L;;;;;N;;;0050;;0050 +0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051 +0072;LATIN SMALL LETTER R;Ll;0;L;;;;;N;;;0052;;0052 +0073;LATIN SMALL LETTER S;Ll;0;L;;;;;N;;;0053;;0053 +0074;LATIN SMALL LETTER T;Ll;0;L;;;;;N;;;0054;;0054 +0075;LATIN SMALL LETTER U;Ll;0;L;;;;;N;;;0055;;0055 +0076;LATIN SMALL LETTER V;Ll;0;L;;;;;N;;;0056;;0056 +0077;LATIN SMALL LETTER W;Ll;0;L;;;;;N;;;0057;;0057 +0078;LATIN SMALL LETTER X;Ll;0;L;;;;;N;;;0058;;0058 +0079;LATIN SMALL LETTER Y;Ll;0;L;;;;;N;;;0059;;0059 +007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A +007B;LEFT CURLY BRACKET;Ps;0;ON;;;;;Y;OPENING CURLY BRACKET;;;; +007C;VERTICAL LINE;Sm;0;ON;;;;;N;VERTICAL BAR;;;; +007D;RIGHT CURLY BRACKET;Pe;0;ON;;;;;Y;CLOSING CURLY BRACKET;;;; +007E;TILDE;Sm;0;ON;;;;;N;;;;; +007F;<control>;Cc;0;BN;;;;;N;DELETE;;;; +0080;<control>;Cc;0;BN;;;;;N;;;;; +0081;<control>;Cc;0;BN;;;;;N;;;;; +0082;<control>;Cc;0;BN;;;;;N;BREAK PERMITTED HERE;;;; +0083;<control>;Cc;0;BN;;;;;N;NO BREAK HERE;;;; +0084;<control>;Cc;0;BN;;;;;N;;;;; +0085;<control>;Cc;0;B;;;;;N;NEXT LINE (NEL);;;; +0086;<control>;Cc;0;BN;;;;;N;START OF SELECTED AREA;;;; +0087;<control>;Cc;0;BN;;;;;N;END OF SELECTED AREA;;;; +0088;<control>;Cc;0;BN;;;;;N;CHARACTER TABULATION SET;;;; +0089;<control>;Cc;0;BN;;;;;N;CHARACTER TABULATION WITH JUSTIFICATION;;;; +008A;<control>;Cc;0;BN;;;;;N;LINE TABULATION SET;;;; +008B;<control>;Cc;0;BN;;;;;N;PARTIAL LINE FORWARD;;;; +008C;<control>;Cc;0;BN;;;;;N;PARTIAL LINE BACKWARD;;;; +008D;<control>;Cc;0;BN;;;;;N;REVERSE LINE FEED;;;; +008E;<control>;Cc;0;BN;;;;;N;SINGLE SHIFT TWO;;;; +008F;<control>;Cc;0;BN;;;;;N;SINGLE SHIFT THREE;;;; +0090;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL STRING;;;; +0091;<control>;Cc;0;BN;;;;;N;PRIVATE USE ONE;;;; +0092;<control>;Cc;0;BN;;;;;N;PRIVATE USE TWO;;;; +0093;<control>;Cc;0;BN;;;;;N;SET TRANSMIT STATE;;;; +0094;<control>;Cc;0;BN;;;;;N;CANCEL CHARACTER;;;; +0095;<control>;Cc;0;BN;;;;;N;MESSAGE WAITING;;;; +0096;<control>;Cc;0;BN;;;;;N;START OF GUARDED AREA;;;; +0097;<control>;Cc;0;BN;;;;;N;END OF GUARDED AREA;;;; +0098;<control>;Cc;0;BN;;;;;N;START OF STRING;;;; +0099;<control>;Cc;0;BN;;;;;N;;;;; +009A;<control>;Cc;0;BN;;;;;N;SINGLE CHARACTER INTRODUCER;;;; +009B;<control>;Cc;0;BN;;;;;N;CONTROL SEQUENCE INTRODUCER;;;; +009C;<control>;Cc;0;BN;;;;;N;STRING TERMINATOR;;;; +009D;<control>;Cc;0;BN;;;;;N;OPERATING SYSTEM COMMAND;;;; +009E;<control>;Cc;0;BN;;;;;N;PRIVACY MESSAGE;;;; +009F;<control>;Cc;0;BN;;;;;N;APPLICATION PROGRAM COMMAND;;;; +00A0;NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;NON-BREAKING SPACE;;;; +00A1;INVERTED EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +00A2;CENT SIGN;Sc;0;ET;;;;;N;;;;; +00A3;POUND SIGN;Sc;0;ET;;;;;N;;;;; +00A4;CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; +00A5;YEN SIGN;Sc;0;ET;;;;;N;;;;; +00A6;BROKEN BAR;So;0;ON;;;;;N;BROKEN VERTICAL BAR;;;; +00A7;SECTION SIGN;So;0;ON;;;;;N;;;;; +00A8;DIAERESIS;Sk;0;ON;<compat> 0020 0308;;;;N;SPACING DIAERESIS;;;; +00A9;COPYRIGHT SIGN;So;0;ON;;;;;N;;;;; +00AA;FEMININE ORDINAL INDICATOR;Ll;0;L;<super> 0061;;;;N;;;;; +00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;*;;; +00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;; +00AD;SOFT HYPHEN;Pd;0;ON;;;;;N;;;;; +00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;; +00AF;MACRON;Sk;0;ON;<compat> 0020 0304;;;;N;SPACING MACRON;;;; +00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;; +00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;; +00B2;SUPERSCRIPT TWO;No;0;EN;<super> 0032;2;2;2;N;SUPERSCRIPT DIGIT TWO;;;; +00B3;SUPERSCRIPT THREE;No;0;EN;<super> 0033;3;3;3;N;SUPERSCRIPT DIGIT THREE;;;; +00B4;ACUTE ACCENT;Sk;0;ON;<compat> 0020 0301;;;;N;SPACING ACUTE;;;; +00B5;MICRO SIGN;Ll;0;L;<compat> 03BC;;;;N;;;039C;;039C +00B6;PILCROW SIGN;So;0;ON;;;;;N;PARAGRAPH SIGN;;;; +00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;; +00B8;CEDILLA;Sk;0;ON;<compat> 0020 0327;;;;N;SPACING CEDILLA;;;; +00B9;SUPERSCRIPT ONE;No;0;EN;<super> 0031;1;1;1;N;SUPERSCRIPT DIGIT ONE;;;; +00BA;MASCULINE ORDINAL INDICATOR;Ll;0;L;<super> 006F;;;;N;;;;; +00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;*;;; +00BC;VULGAR FRACTION ONE QUARTER;No;0;ON;<fraction> 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;; +00BD;VULGAR FRACTION ONE HALF;No;0;ON;<fraction> 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;; +00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON;<fraction> 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;; +00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;; +00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0; +00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1; +00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2; +00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3; +00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4; +00C5;LATIN CAPITAL LETTER A WITH RING ABOVE;Lu;0;L;0041 030A;;;;N;LATIN CAPITAL LETTER A RING;;;00E5; +00C6;LATIN CAPITAL LETTER AE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER A E;ash *;;00E6; +00C7;LATIN CAPITAL LETTER C WITH CEDILLA;Lu;0;L;0043 0327;;;;N;LATIN CAPITAL LETTER C CEDILLA;;;00E7; +00C8;LATIN CAPITAL LETTER E WITH GRAVE;Lu;0;L;0045 0300;;;;N;LATIN CAPITAL LETTER E GRAVE;;;00E8; +00C9;LATIN CAPITAL LETTER E WITH ACUTE;Lu;0;L;0045 0301;;;;N;LATIN CAPITAL LETTER E ACUTE;;;00E9; +00CA;LATIN CAPITAL LETTER E WITH CIRCUMFLEX;Lu;0;L;0045 0302;;;;N;LATIN CAPITAL LETTER E CIRCUMFLEX;;;00EA; +00CB;LATIN CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;0045 0308;;;;N;LATIN CAPITAL LETTER E DIAERESIS;;;00EB; +00CC;LATIN CAPITAL LETTER I WITH GRAVE;Lu;0;L;0049 0300;;;;N;LATIN CAPITAL LETTER I GRAVE;;;00EC; +00CD;LATIN CAPITAL LETTER I WITH ACUTE;Lu;0;L;0049 0301;;;;N;LATIN CAPITAL LETTER I ACUTE;;;00ED; +00CE;LATIN CAPITAL LETTER I WITH CIRCUMFLEX;Lu;0;L;0049 0302;;;;N;LATIN CAPITAL LETTER I CIRCUMFLEX;;;00EE; +00CF;LATIN CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0049 0308;;;;N;LATIN CAPITAL LETTER I DIAERESIS;;;00EF; +00D0;LATIN CAPITAL LETTER ETH;Lu;0;L;;;;;N;;Icelandic;;00F0; +00D1;LATIN CAPITAL LETTER N WITH TILDE;Lu;0;L;004E 0303;;;;N;LATIN CAPITAL LETTER N TILDE;;;00F1; +00D2;LATIN CAPITAL LETTER O WITH GRAVE;Lu;0;L;004F 0300;;;;N;LATIN CAPITAL LETTER O GRAVE;;;00F2; +00D3;LATIN CAPITAL LETTER O WITH ACUTE;Lu;0;L;004F 0301;;;;N;LATIN CAPITAL LETTER O ACUTE;;;00F3; +00D4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX;Lu;0;L;004F 0302;;;;N;LATIN CAPITAL LETTER O CIRCUMFLEX;;;00F4; +00D5;LATIN CAPITAL LETTER O WITH TILDE;Lu;0;L;004F 0303;;;;N;LATIN CAPITAL LETTER O TILDE;;;00F5; +00D6;LATIN CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;004F 0308;;;;N;LATIN CAPITAL LETTER O DIAERESIS;;;00F6; +00D7;MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;; +00D8;LATIN CAPITAL LETTER O WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O SLASH;;;00F8; +00D9;LATIN CAPITAL LETTER U WITH GRAVE;Lu;0;L;0055 0300;;;;N;LATIN CAPITAL LETTER U GRAVE;;;00F9; +00DA;LATIN CAPITAL LETTER U WITH ACUTE;Lu;0;L;0055 0301;;;;N;LATIN CAPITAL LETTER U ACUTE;;;00FA; +00DB;LATIN CAPITAL LETTER U WITH CIRCUMFLEX;Lu;0;L;0055 0302;;;;N;LATIN CAPITAL LETTER U CIRCUMFLEX;;;00FB; +00DC;LATIN CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0055 0308;;;;N;LATIN CAPITAL LETTER U DIAERESIS;;;00FC; +00DD;LATIN CAPITAL LETTER Y WITH ACUTE;Lu;0;L;0059 0301;;;;N;LATIN CAPITAL LETTER Y ACUTE;;;00FD; +00DE;LATIN CAPITAL LETTER THORN;Lu;0;L;;;;;N;;Icelandic;;00FE; +00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;German;;; +00E0;LATIN SMALL LETTER A WITH GRAVE;Ll;0;L;0061 0300;;;;N;LATIN SMALL LETTER A GRAVE;;00C0;;00C0 +00E1;LATIN SMALL LETTER A WITH ACUTE;Ll;0;L;0061 0301;;;;N;LATIN SMALL LETTER A ACUTE;;00C1;;00C1 +00E2;LATIN SMALL LETTER A WITH CIRCUMFLEX;Ll;0;L;0061 0302;;;;N;LATIN SMALL LETTER A CIRCUMFLEX;;00C2;;00C2 +00E3;LATIN SMALL LETTER A WITH TILDE;Ll;0;L;0061 0303;;;;N;LATIN SMALL LETTER A TILDE;;00C3;;00C3 +00E4;LATIN SMALL LETTER A WITH DIAERESIS;Ll;0;L;0061 0308;;;;N;LATIN SMALL LETTER A DIAERESIS;;00C4;;00C4 +00E5;LATIN SMALL LETTER A WITH RING ABOVE;Ll;0;L;0061 030A;;;;N;LATIN SMALL LETTER A RING;;00C5;;00C5 +00E6;LATIN SMALL LETTER AE;Ll;0;L;;;;;N;LATIN SMALL LETTER A E;ash *;00C6;;00C6 +00E7;LATIN SMALL LETTER C WITH CEDILLA;Ll;0;L;0063 0327;;;;N;LATIN SMALL LETTER C CEDILLA;;00C7;;00C7 +00E8;LATIN SMALL LETTER E WITH GRAVE;Ll;0;L;0065 0300;;;;N;LATIN SMALL LETTER E GRAVE;;00C8;;00C8 +00E9;LATIN SMALL LETTER E WITH ACUTE;Ll;0;L;0065 0301;;;;N;LATIN SMALL LETTER E ACUTE;;00C9;;00C9 +00EA;LATIN SMALL LETTER E WITH CIRCUMFLEX;Ll;0;L;0065 0302;;;;N;LATIN SMALL LETTER E CIRCUMFLEX;;00CA;;00CA +00EB;LATIN SMALL LETTER E WITH DIAERESIS;Ll;0;L;0065 0308;;;;N;LATIN SMALL LETTER E DIAERESIS;;00CB;;00CB +00EC;LATIN SMALL LETTER I WITH GRAVE;Ll;0;L;0069 0300;;;;N;LATIN SMALL LETTER I GRAVE;;00CC;;00CC +00ED;LATIN SMALL LETTER I WITH ACUTE;Ll;0;L;0069 0301;;;;N;LATIN SMALL LETTER I ACUTE;;00CD;;00CD +00EE;LATIN SMALL LETTER I WITH CIRCUMFLEX;Ll;0;L;0069 0302;;;;N;LATIN SMALL LETTER I CIRCUMFLEX;;00CE;;00CE +00EF;LATIN SMALL LETTER I WITH DIAERESIS;Ll;0;L;0069 0308;;;;N;LATIN SMALL LETTER I DIAERESIS;;00CF;;00CF +00F0;LATIN SMALL LETTER ETH;Ll;0;L;;;;;N;;Icelandic;00D0;;00D0 +00F1;LATIN SMALL LETTER N WITH TILDE;Ll;0;L;006E 0303;;;;N;LATIN SMALL LETTER N TILDE;;00D1;;00D1 +00F2;LATIN SMALL LETTER O WITH GRAVE;Ll;0;L;006F 0300;;;;N;LATIN SMALL LETTER O GRAVE;;00D2;;00D2 +00F3;LATIN SMALL LETTER O WITH ACUTE;Ll;0;L;006F 0301;;;;N;LATIN SMALL LETTER O ACUTE;;00D3;;00D3 +00F4;LATIN SMALL LETTER O WITH CIRCUMFLEX;Ll;0;L;006F 0302;;;;N;LATIN SMALL LETTER O CIRCUMFLEX;;00D4;;00D4 +00F5;LATIN SMALL LETTER O WITH TILDE;Ll;0;L;006F 0303;;;;N;LATIN SMALL LETTER O TILDE;;00D5;;00D5 +00F6;LATIN SMALL LETTER O WITH DIAERESIS;Ll;0;L;006F 0308;;;;N;LATIN SMALL LETTER O DIAERESIS;;00D6;;00D6 +00F7;DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +00F8;LATIN SMALL LETTER O WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER O SLASH;;00D8;;00D8 +00F9;LATIN SMALL LETTER U WITH GRAVE;Ll;0;L;0075 0300;;;;N;LATIN SMALL LETTER U GRAVE;;00D9;;00D9 +00FA;LATIN SMALL LETTER U WITH ACUTE;Ll;0;L;0075 0301;;;;N;LATIN SMALL LETTER U ACUTE;;00DA;;00DA +00FB;LATIN SMALL LETTER U WITH CIRCUMFLEX;Ll;0;L;0075 0302;;;;N;LATIN SMALL LETTER U CIRCUMFLEX;;00DB;;00DB +00FC;LATIN SMALL LETTER U WITH DIAERESIS;Ll;0;L;0075 0308;;;;N;LATIN SMALL LETTER U DIAERESIS;;00DC;;00DC +00FD;LATIN SMALL LETTER Y WITH ACUTE;Ll;0;L;0079 0301;;;;N;LATIN SMALL LETTER Y ACUTE;;00DD;;00DD +00FE;LATIN SMALL LETTER THORN;Ll;0;L;;;;;N;;Icelandic;00DE;;00DE +00FF;LATIN SMALL LETTER Y WITH DIAERESIS;Ll;0;L;0079 0308;;;;N;LATIN SMALL LETTER Y DIAERESIS;;0178;;0178 +0100;LATIN CAPITAL LETTER A WITH MACRON;Lu;0;L;0041 0304;;;;N;LATIN CAPITAL LETTER A MACRON;;;0101; +0101;LATIN SMALL LETTER A WITH MACRON;Ll;0;L;0061 0304;;;;N;LATIN SMALL LETTER A MACRON;;0100;;0100 +0102;LATIN CAPITAL LETTER A WITH BREVE;Lu;0;L;0041 0306;;;;N;LATIN CAPITAL LETTER A BREVE;;;0103; +0103;LATIN SMALL LETTER A WITH BREVE;Ll;0;L;0061 0306;;;;N;LATIN SMALL LETTER A BREVE;;0102;;0102 +0104;LATIN CAPITAL LETTER A WITH OGONEK;Lu;0;L;0041 0328;;;;N;LATIN CAPITAL LETTER A OGONEK;;;0105; +0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104 +0106;LATIN CAPITAL LETTER C WITH ACUTE;Lu;0;L;0043 0301;;;;N;LATIN CAPITAL LETTER C ACUTE;;;0107; +0107;LATIN SMALL LETTER C WITH ACUTE;Ll;0;L;0063 0301;;;;N;LATIN SMALL LETTER C ACUTE;;0106;;0106 +0108;LATIN CAPITAL LETTER C WITH CIRCUMFLEX;Lu;0;L;0043 0302;;;;N;LATIN CAPITAL LETTER C CIRCUMFLEX;;;0109; +0109;LATIN SMALL LETTER C WITH CIRCUMFLEX;Ll;0;L;0063 0302;;;;N;LATIN SMALL LETTER C CIRCUMFLEX;;0108;;0108 +010A;LATIN CAPITAL LETTER C WITH DOT ABOVE;Lu;0;L;0043 0307;;;;N;LATIN CAPITAL LETTER C DOT;;;010B; +010B;LATIN SMALL LETTER C WITH DOT ABOVE;Ll;0;L;0063 0307;;;;N;LATIN SMALL LETTER C DOT;;010A;;010A +010C;LATIN CAPITAL LETTER C WITH CARON;Lu;0;L;0043 030C;;;;N;LATIN CAPITAL LETTER C HACEK;;;010D; +010D;LATIN SMALL LETTER C WITH CARON;Ll;0;L;0063 030C;;;;N;LATIN SMALL LETTER C HACEK;;010C;;010C +010E;LATIN CAPITAL LETTER D WITH CARON;Lu;0;L;0044 030C;;;;N;LATIN CAPITAL LETTER D HACEK;;;010F; +010F;LATIN SMALL LETTER D WITH CARON;Ll;0;L;0064 030C;;;;N;LATIN SMALL LETTER D HACEK;;010E;;010E +0110;LATIN CAPITAL LETTER D WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D BAR;;;0111; +0111;LATIN SMALL LETTER D WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER D BAR;;0110;;0110 +0112;LATIN CAPITAL LETTER E WITH MACRON;Lu;0;L;0045 0304;;;;N;LATIN CAPITAL LETTER E MACRON;;;0113; +0113;LATIN SMALL LETTER E WITH MACRON;Ll;0;L;0065 0304;;;;N;LATIN SMALL LETTER E MACRON;;0112;;0112 +0114;LATIN CAPITAL LETTER E WITH BREVE;Lu;0;L;0045 0306;;;;N;LATIN CAPITAL LETTER E BREVE;;;0115; +0115;LATIN SMALL LETTER E WITH BREVE;Ll;0;L;0065 0306;;;;N;LATIN SMALL LETTER E BREVE;;0114;;0114 +0116;LATIN CAPITAL LETTER E WITH DOT ABOVE;Lu;0;L;0045 0307;;;;N;LATIN CAPITAL LETTER E DOT;;;0117; +0117;LATIN SMALL LETTER E WITH DOT ABOVE;Ll;0;L;0065 0307;;;;N;LATIN SMALL LETTER E DOT;;0116;;0116 +0118;LATIN CAPITAL LETTER E WITH OGONEK;Lu;0;L;0045 0328;;;;N;LATIN CAPITAL LETTER E OGONEK;;;0119; +0119;LATIN SMALL LETTER E WITH OGONEK;Ll;0;L;0065 0328;;;;N;LATIN SMALL LETTER E OGONEK;;0118;;0118 +011A;LATIN CAPITAL LETTER E WITH CARON;Lu;0;L;0045 030C;;;;N;LATIN CAPITAL LETTER E HACEK;;;011B; +011B;LATIN SMALL LETTER E WITH CARON;Ll;0;L;0065 030C;;;;N;LATIN SMALL LETTER E HACEK;;011A;;011A +011C;LATIN CAPITAL LETTER G WITH CIRCUMFLEX;Lu;0;L;0047 0302;;;;N;LATIN CAPITAL LETTER G CIRCUMFLEX;;;011D; +011D;LATIN SMALL LETTER G WITH CIRCUMFLEX;Ll;0;L;0067 0302;;;;N;LATIN SMALL LETTER G CIRCUMFLEX;;011C;;011C +011E;LATIN CAPITAL LETTER G WITH BREVE;Lu;0;L;0047 0306;;;;N;LATIN CAPITAL LETTER G BREVE;;;011F; +011F;LATIN SMALL LETTER G WITH BREVE;Ll;0;L;0067 0306;;;;N;LATIN SMALL LETTER G BREVE;;011E;;011E +0120;LATIN CAPITAL LETTER G WITH DOT ABOVE;Lu;0;L;0047 0307;;;;N;LATIN CAPITAL LETTER G DOT;;;0121; +0121;LATIN SMALL LETTER G WITH DOT ABOVE;Ll;0;L;0067 0307;;;;N;LATIN SMALL LETTER G DOT;;0120;;0120 +0122;LATIN CAPITAL LETTER G WITH CEDILLA;Lu;0;L;0047 0327;;;;N;LATIN CAPITAL LETTER G CEDILLA;;;0123; +0123;LATIN SMALL LETTER G WITH CEDILLA;Ll;0;L;0067 0327;;;;N;LATIN SMALL LETTER G CEDILLA;;0122;;0122 +0124;LATIN CAPITAL LETTER H WITH CIRCUMFLEX;Lu;0;L;0048 0302;;;;N;LATIN CAPITAL LETTER H CIRCUMFLEX;;;0125; +0125;LATIN SMALL LETTER H WITH CIRCUMFLEX;Ll;0;L;0068 0302;;;;N;LATIN SMALL LETTER H CIRCUMFLEX;;0124;;0124 +0126;LATIN CAPITAL LETTER H WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER H BAR;;;0127; +0127;LATIN SMALL LETTER H WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER H BAR;;0126;;0126 +0128;LATIN CAPITAL LETTER I WITH TILDE;Lu;0;L;0049 0303;;;;N;LATIN CAPITAL LETTER I TILDE;;;0129; +0129;LATIN SMALL LETTER I WITH TILDE;Ll;0;L;0069 0303;;;;N;LATIN SMALL LETTER I TILDE;;0128;;0128 +012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B; +012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A +012C;LATIN CAPITAL LETTER I WITH BREVE;Lu;0;L;0049 0306;;;;N;LATIN CAPITAL LETTER I BREVE;;;012D; +012D;LATIN SMALL LETTER I WITH BREVE;Ll;0;L;0069 0306;;;;N;LATIN SMALL LETTER I BREVE;;012C;;012C +012E;LATIN CAPITAL LETTER I WITH OGONEK;Lu;0;L;0049 0328;;;;N;LATIN CAPITAL LETTER I OGONEK;;;012F; +012F;LATIN SMALL LETTER I WITH OGONEK;Ll;0;L;0069 0328;;;;N;LATIN SMALL LETTER I OGONEK;;012E;;012E +0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069; +0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049 +0132;LATIN CAPITAL LIGATURE IJ;Lu;0;L;<compat> 0049 004A;;;;N;LATIN CAPITAL LETTER I J;;;0133; +0133;LATIN SMALL LIGATURE IJ;Ll;0;L;<compat> 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132 +0134;LATIN CAPITAL LETTER J WITH CIRCUMFLEX;Lu;0;L;004A 0302;;;;N;LATIN CAPITAL LETTER J CIRCUMFLEX;;;0135; +0135;LATIN SMALL LETTER J WITH CIRCUMFLEX;Ll;0;L;006A 0302;;;;N;LATIN SMALL LETTER J CIRCUMFLEX;;0134;;0134 +0136;LATIN CAPITAL LETTER K WITH CEDILLA;Lu;0;L;004B 0327;;;;N;LATIN CAPITAL LETTER K CEDILLA;;;0137; +0137;LATIN SMALL LETTER K WITH CEDILLA;Ll;0;L;006B 0327;;;;N;LATIN SMALL LETTER K CEDILLA;;0136;;0136 +0138;LATIN SMALL LETTER KRA;Ll;0;L;;;;;N;;Greenlandic;;; +0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A; +013A;LATIN SMALL LETTER L WITH ACUTE;Ll;0;L;006C 0301;;;;N;LATIN SMALL LETTER L ACUTE;;0139;;0139 +013B;LATIN CAPITAL LETTER L WITH CEDILLA;Lu;0;L;004C 0327;;;;N;LATIN CAPITAL LETTER L CEDILLA;;;013C; +013C;LATIN SMALL LETTER L WITH CEDILLA;Ll;0;L;006C 0327;;;;N;LATIN SMALL LETTER L CEDILLA;;013B;;013B +013D;LATIN CAPITAL LETTER L WITH CARON;Lu;0;L;004C 030C;;;;N;LATIN CAPITAL LETTER L HACEK;;;013E; +013E;LATIN SMALL LETTER L WITH CARON;Ll;0;L;006C 030C;;;;N;LATIN SMALL LETTER L HACEK;;013D;;013D +013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L;<compat> 004C 00B7;;;;N;;;;0140; +0140;LATIN SMALL LETTER L WITH MIDDLE DOT;Ll;0;L;<compat> 006C 00B7;;;;N;;;013F;;013F +0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142; +0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141 +0143;LATIN CAPITAL LETTER N WITH ACUTE;Lu;0;L;004E 0301;;;;N;LATIN CAPITAL LETTER N ACUTE;;;0144; +0144;LATIN SMALL LETTER N WITH ACUTE;Ll;0;L;006E 0301;;;;N;LATIN SMALL LETTER N ACUTE;;0143;;0143 +0145;LATIN CAPITAL LETTER N WITH CEDILLA;Lu;0;L;004E 0327;;;;N;LATIN CAPITAL LETTER N CEDILLA;;;0146; +0146;LATIN SMALL LETTER N WITH CEDILLA;Ll;0;L;006E 0327;;;;N;LATIN SMALL LETTER N CEDILLA;;0145;;0145 +0147;LATIN CAPITAL LETTER N WITH CARON;Lu;0;L;004E 030C;;;;N;LATIN CAPITAL LETTER N HACEK;;;0148; +0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147 +0149;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE;Ll;0;L;<compat> 02BC 006E;;;;N;LATIN SMALL LETTER APOSTROPHE N;;;; +014A;LATIN CAPITAL LETTER ENG;Lu;0;L;;;;;N;;Sami;;014B; +014B;LATIN SMALL LETTER ENG;Ll;0;L;;;;;N;;Sami;014A;;014A +014C;LATIN CAPITAL LETTER O WITH MACRON;Lu;0;L;004F 0304;;;;N;LATIN CAPITAL LETTER O MACRON;;;014D; +014D;LATIN SMALL LETTER O WITH MACRON;Ll;0;L;006F 0304;;;;N;LATIN SMALL LETTER O MACRON;;014C;;014C +014E;LATIN CAPITAL LETTER O WITH BREVE;Lu;0;L;004F 0306;;;;N;LATIN CAPITAL LETTER O BREVE;;;014F; +014F;LATIN SMALL LETTER O WITH BREVE;Ll;0;L;006F 0306;;;;N;LATIN SMALL LETTER O BREVE;;014E;;014E +0150;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE;Lu;0;L;004F 030B;;;;N;LATIN CAPITAL LETTER O DOUBLE ACUTE;;;0151; +0151;LATIN SMALL LETTER O WITH DOUBLE ACUTE;Ll;0;L;006F 030B;;;;N;LATIN SMALL LETTER O DOUBLE ACUTE;;0150;;0150 +0152;LATIN CAPITAL LIGATURE OE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O E;;;0153; +0153;LATIN SMALL LIGATURE OE;Ll;0;L;;;;;N;LATIN SMALL LETTER O E;;0152;;0152 +0154;LATIN CAPITAL LETTER R WITH ACUTE;Lu;0;L;0052 0301;;;;N;LATIN CAPITAL LETTER R ACUTE;;;0155; +0155;LATIN SMALL LETTER R WITH ACUTE;Ll;0;L;0072 0301;;;;N;LATIN SMALL LETTER R ACUTE;;0154;;0154 +0156;LATIN CAPITAL LETTER R WITH CEDILLA;Lu;0;L;0052 0327;;;;N;LATIN CAPITAL LETTER R CEDILLA;;;0157; +0157;LATIN SMALL LETTER R WITH CEDILLA;Ll;0;L;0072 0327;;;;N;LATIN SMALL LETTER R CEDILLA;;0156;;0156 +0158;LATIN CAPITAL LETTER R WITH CARON;Lu;0;L;0052 030C;;;;N;LATIN CAPITAL LETTER R HACEK;;;0159; +0159;LATIN SMALL LETTER R WITH CARON;Ll;0;L;0072 030C;;;;N;LATIN SMALL LETTER R HACEK;;0158;;0158 +015A;LATIN CAPITAL LETTER S WITH ACUTE;Lu;0;L;0053 0301;;;;N;LATIN CAPITAL LETTER S ACUTE;;;015B; +015B;LATIN SMALL LETTER S WITH ACUTE;Ll;0;L;0073 0301;;;;N;LATIN SMALL LETTER S ACUTE;;015A;;015A +015C;LATIN CAPITAL LETTER S WITH CIRCUMFLEX;Lu;0;L;0053 0302;;;;N;LATIN CAPITAL LETTER S CIRCUMFLEX;;;015D; +015D;LATIN SMALL LETTER S WITH CIRCUMFLEX;Ll;0;L;0073 0302;;;;N;LATIN SMALL LETTER S CIRCUMFLEX;;015C;;015C +015E;LATIN CAPITAL LETTER S WITH CEDILLA;Lu;0;L;0053 0327;;;;N;LATIN CAPITAL LETTER S CEDILLA;*;;015F; +015F;LATIN SMALL LETTER S WITH CEDILLA;Ll;0;L;0073 0327;;;;N;LATIN SMALL LETTER S CEDILLA;*;015E;;015E +0160;LATIN CAPITAL LETTER S WITH CARON;Lu;0;L;0053 030C;;;;N;LATIN CAPITAL LETTER S HACEK;;;0161; +0161;LATIN SMALL LETTER S WITH CARON;Ll;0;L;0073 030C;;;;N;LATIN SMALL LETTER S HACEK;;0160;;0160 +0162;LATIN CAPITAL LETTER T WITH CEDILLA;Lu;0;L;0054 0327;;;;N;LATIN CAPITAL LETTER T CEDILLA;*;;0163; +0163;LATIN SMALL LETTER T WITH CEDILLA;Ll;0;L;0074 0327;;;;N;LATIN SMALL LETTER T CEDILLA;*;0162;;0162 +0164;LATIN CAPITAL LETTER T WITH CARON;Lu;0;L;0054 030C;;;;N;LATIN CAPITAL LETTER T HACEK;;;0165; +0165;LATIN SMALL LETTER T WITH CARON;Ll;0;L;0074 030C;;;;N;LATIN SMALL LETTER T HACEK;;0164;;0164 +0166;LATIN CAPITAL LETTER T WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T BAR;;;0167; +0167;LATIN SMALL LETTER T WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER T BAR;;0166;;0166 +0168;LATIN CAPITAL LETTER U WITH TILDE;Lu;0;L;0055 0303;;;;N;LATIN CAPITAL LETTER U TILDE;;;0169; +0169;LATIN SMALL LETTER U WITH TILDE;Ll;0;L;0075 0303;;;;N;LATIN SMALL LETTER U TILDE;;0168;;0168 +016A;LATIN CAPITAL LETTER U WITH MACRON;Lu;0;L;0055 0304;;;;N;LATIN CAPITAL LETTER U MACRON;;;016B; +016B;LATIN SMALL LETTER U WITH MACRON;Ll;0;L;0075 0304;;;;N;LATIN SMALL LETTER U MACRON;;016A;;016A +016C;LATIN CAPITAL LETTER U WITH BREVE;Lu;0;L;0055 0306;;;;N;LATIN CAPITAL LETTER U BREVE;;;016D; +016D;LATIN SMALL LETTER U WITH BREVE;Ll;0;L;0075 0306;;;;N;LATIN SMALL LETTER U BREVE;;016C;;016C +016E;LATIN CAPITAL LETTER U WITH RING ABOVE;Lu;0;L;0055 030A;;;;N;LATIN CAPITAL LETTER U RING;;;016F; +016F;LATIN SMALL LETTER U WITH RING ABOVE;Ll;0;L;0075 030A;;;;N;LATIN SMALL LETTER U RING;;016E;;016E +0170;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0055 030B;;;;N;LATIN CAPITAL LETTER U DOUBLE ACUTE;;;0171; +0171;LATIN SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0075 030B;;;;N;LATIN SMALL LETTER U DOUBLE ACUTE;;0170;;0170 +0172;LATIN CAPITAL LETTER U WITH OGONEK;Lu;0;L;0055 0328;;;;N;LATIN CAPITAL LETTER U OGONEK;;;0173; +0173;LATIN SMALL LETTER U WITH OGONEK;Ll;0;L;0075 0328;;;;N;LATIN SMALL LETTER U OGONEK;;0172;;0172 +0174;LATIN CAPITAL LETTER W WITH CIRCUMFLEX;Lu;0;L;0057 0302;;;;N;LATIN CAPITAL LETTER W CIRCUMFLEX;;;0175; +0175;LATIN SMALL LETTER W WITH CIRCUMFLEX;Ll;0;L;0077 0302;;;;N;LATIN SMALL LETTER W CIRCUMFLEX;;0174;;0174 +0176;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX;Lu;0;L;0059 0302;;;;N;LATIN CAPITAL LETTER Y CIRCUMFLEX;;;0177; +0177;LATIN SMALL LETTER Y WITH CIRCUMFLEX;Ll;0;L;0079 0302;;;;N;LATIN SMALL LETTER Y CIRCUMFLEX;;0176;;0176 +0178;LATIN CAPITAL LETTER Y WITH DIAERESIS;Lu;0;L;0059 0308;;;;N;LATIN CAPITAL LETTER Y DIAERESIS;;;00FF; +0179;LATIN CAPITAL LETTER Z WITH ACUTE;Lu;0;L;005A 0301;;;;N;LATIN CAPITAL LETTER Z ACUTE;;;017A; +017A;LATIN SMALL LETTER Z WITH ACUTE;Ll;0;L;007A 0301;;;;N;LATIN SMALL LETTER Z ACUTE;;0179;;0179 +017B;LATIN CAPITAL LETTER Z WITH DOT ABOVE;Lu;0;L;005A 0307;;;;N;LATIN CAPITAL LETTER Z DOT;;;017C; +017C;LATIN SMALL LETTER Z WITH DOT ABOVE;Ll;0;L;007A 0307;;;;N;LATIN SMALL LETTER Z DOT;;017B;;017B +017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E; +017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D +017F;LATIN SMALL LETTER LONG S;Ll;0;L;<compat> 0073;;;;N;;;0053;;0053 +0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;;; +0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253; +0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183; +0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182 +0184;LATIN CAPITAL LETTER TONE SIX;Lu;0;L;;;;;N;;;;0185; +0185;LATIN SMALL LETTER TONE SIX;Ll;0;L;;;;;N;;;0184;;0184 +0186;LATIN CAPITAL LETTER OPEN O;Lu;0;L;;;;;N;;;;0254; +0187;LATIN CAPITAL LETTER C WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER C HOOK;;;0188; +0188;LATIN SMALL LETTER C WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER C HOOK;;0187;;0187 +0189;LATIN CAPITAL LETTER AFRICAN D;Lu;0;L;;;;;N;;*;;0256; +018A;LATIN CAPITAL LETTER D WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D HOOK;;;0257; +018B;LATIN CAPITAL LETTER D WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D TOPBAR;;;018C; +018C;LATIN SMALL LETTER D WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER D TOPBAR;;018B;;018B +018D;LATIN SMALL LETTER TURNED DELTA;Ll;0;L;;;;;N;;;;; +018E;LATIN CAPITAL LETTER REVERSED E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER TURNED E;;;01DD; +018F;LATIN CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;0259; +0190;LATIN CAPITAL LETTER OPEN E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER EPSILON;;;025B; +0191;LATIN CAPITAL LETTER F WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER F HOOK;;;0192; +0192;LATIN SMALL LETTER F WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT F;;0191;;0191 +0193;LATIN CAPITAL LETTER G WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G HOOK;;;0260; +0194;LATIN CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;0263; +0195;LATIN SMALL LETTER HV;Ll;0;L;;;;;N;LATIN SMALL LETTER H V;hwair;01F6;;01F6 +0196;LATIN CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;0269; +0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268; +0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199; +0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198 +019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;;; +019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;; +019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F; +019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272; +019E;LATIN SMALL LETTER N WITH LONG RIGHT LEG;Ll;0;L;;;;;N;;;0220;;0220 +019F;LATIN CAPITAL LETTER O WITH MIDDLE TILDE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED O;*;;0275; +01A0;LATIN CAPITAL LETTER O WITH HORN;Lu;0;L;004F 031B;;;;N;LATIN CAPITAL LETTER O HORN;;;01A1; +01A1;LATIN SMALL LETTER O WITH HORN;Ll;0;L;006F 031B;;;;N;LATIN SMALL LETTER O HORN;;01A0;;01A0 +01A2;LATIN CAPITAL LETTER OI;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O I;gha;;01A3; +01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;gha;01A2;;01A2 +01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5; +01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4 +01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;*;;0280; +01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8; +01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7 +01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283; +01AA;LATIN LETTER REVERSED ESH LOOP;Ll;0;L;;;;;N;;;;; +01AB;LATIN SMALL LETTER T WITH PALATAL HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T PALATAL HOOK;;;; +01AC;LATIN CAPITAL LETTER T WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T HOOK;;;01AD; +01AD;LATIN SMALL LETTER T WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T HOOK;;01AC;;01AC +01AE;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T RETROFLEX HOOK;;;0288; +01AF;LATIN CAPITAL LETTER U WITH HORN;Lu;0;L;0055 031B;;;;N;LATIN CAPITAL LETTER U HORN;;;01B0; +01B0;LATIN SMALL LETTER U WITH HORN;Ll;0;L;0075 031B;;;;N;LATIN SMALL LETTER U HORN;;01AF;;01AF +01B1;LATIN CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;028A; +01B2;LATIN CAPITAL LETTER V WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER SCRIPT V;;;028B; +01B3;LATIN CAPITAL LETTER Y WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Y HOOK;;;01B4; +01B4;LATIN SMALL LETTER Y WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Y HOOK;;01B3;;01B3 +01B5;LATIN CAPITAL LETTER Z WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Z BAR;;;01B6; +01B6;LATIN SMALL LETTER Z WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER Z BAR;;01B5;;01B5 +01B7;LATIN CAPITAL LETTER EZH;Lu;0;L;;;;;N;LATIN CAPITAL LETTER YOGH;;;0292; +01B8;LATIN CAPITAL LETTER EZH REVERSED;Lu;0;L;;;;;N;LATIN CAPITAL LETTER REVERSED YOGH;;;01B9; +01B9;LATIN SMALL LETTER EZH REVERSED;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED YOGH;;01B8;;01B8 +01BA;LATIN SMALL LETTER EZH WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH WITH TAIL;;;; +01BB;LATIN LETTER TWO WITH STROKE;Lo;0;L;;;;;N;LATIN LETTER TWO BAR;;;; +01BC;LATIN CAPITAL LETTER TONE FIVE;Lu;0;L;;;;;N;;;;01BD; +01BD;LATIN SMALL LETTER TONE FIVE;Ll;0;L;;;;;N;;;01BC;;01BC +01BE;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER INVERTED GLOTTAL STOP BAR;;;; +01BF;LATIN LETTER WYNN;Ll;0;L;;;;;N;;;01F7;;01F7 +01C0;LATIN LETTER DENTAL CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE;;;; +01C1;LATIN LETTER LATERAL CLICK;Lo;0;L;;;;;N;LATIN LETTER DOUBLE PIPE;;;; +01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;; +01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;; +01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L;<compat> 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5 +01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L;<compat> 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6; +01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L;<compat> 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5 +01C7;LATIN CAPITAL LETTER LJ;Lu;0;L;<compat> 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8 +01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L;<compat> 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9; +01C9;LATIN SMALL LETTER LJ;Ll;0;L;<compat> 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8 +01CA;LATIN CAPITAL LETTER NJ;Lu;0;L;<compat> 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB +01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L;<compat> 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC; +01CC;LATIN SMALL LETTER NJ;Ll;0;L;<compat> 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB +01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE; +01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD +01CF;LATIN CAPITAL LETTER I WITH CARON;Lu;0;L;0049 030C;;;;N;LATIN CAPITAL LETTER I HACEK;;;01D0; +01D0;LATIN SMALL LETTER I WITH CARON;Ll;0;L;0069 030C;;;;N;LATIN SMALL LETTER I HACEK;;01CF;;01CF +01D1;LATIN CAPITAL LETTER O WITH CARON;Lu;0;L;004F 030C;;;;N;LATIN CAPITAL LETTER O HACEK;;;01D2; +01D2;LATIN SMALL LETTER O WITH CARON;Ll;0;L;006F 030C;;;;N;LATIN SMALL LETTER O HACEK;;01D1;;01D1 +01D3;LATIN CAPITAL LETTER U WITH CARON;Lu;0;L;0055 030C;;;;N;LATIN CAPITAL LETTER U HACEK;;;01D4; +01D4;LATIN SMALL LETTER U WITH CARON;Ll;0;L;0075 030C;;;;N;LATIN SMALL LETTER U HACEK;;01D3;;01D3 +01D5;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON;Lu;0;L;00DC 0304;;;;N;LATIN CAPITAL LETTER U DIAERESIS MACRON;;;01D6; +01D6;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON;Ll;0;L;00FC 0304;;;;N;LATIN SMALL LETTER U DIAERESIS MACRON;;01D5;;01D5 +01D7;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE;Lu;0;L;00DC 0301;;;;N;LATIN CAPITAL LETTER U DIAERESIS ACUTE;;;01D8; +01D8;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE;Ll;0;L;00FC 0301;;;;N;LATIN SMALL LETTER U DIAERESIS ACUTE;;01D7;;01D7 +01D9;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON;Lu;0;L;00DC 030C;;;;N;LATIN CAPITAL LETTER U DIAERESIS HACEK;;;01DA; +01DA;LATIN SMALL LETTER U WITH DIAERESIS AND CARON;Ll;0;L;00FC 030C;;;;N;LATIN SMALL LETTER U DIAERESIS HACEK;;01D9;;01D9 +01DB;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE;Lu;0;L;00DC 0300;;;;N;LATIN CAPITAL LETTER U DIAERESIS GRAVE;;;01DC; +01DC;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE;Ll;0;L;00FC 0300;;;;N;LATIN SMALL LETTER U DIAERESIS GRAVE;;01DB;;01DB +01DD;LATIN SMALL LETTER TURNED E;Ll;0;L;;;;;N;;;018E;;018E +01DE;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON;Lu;0;L;00C4 0304;;;;N;LATIN CAPITAL LETTER A DIAERESIS MACRON;;;01DF; +01DF;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON;Ll;0;L;00E4 0304;;;;N;LATIN SMALL LETTER A DIAERESIS MACRON;;01DE;;01DE +01E0;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON;Lu;0;L;0226 0304;;;;N;LATIN CAPITAL LETTER A DOT MACRON;;;01E1; +01E1;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON;Ll;0;L;0227 0304;;;;N;LATIN SMALL LETTER A DOT MACRON;;01E0;;01E0 +01E2;LATIN CAPITAL LETTER AE WITH MACRON;Lu;0;L;00C6 0304;;;;N;LATIN CAPITAL LETTER A E MACRON;ash *;;01E3; +01E3;LATIN SMALL LETTER AE WITH MACRON;Ll;0;L;00E6 0304;;;;N;LATIN SMALL LETTER A E MACRON;ash *;01E2;;01E2 +01E4;LATIN CAPITAL LETTER G WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G BAR;;;01E5; +01E5;LATIN SMALL LETTER G WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER G BAR;;01E4;;01E4 +01E6;LATIN CAPITAL LETTER G WITH CARON;Lu;0;L;0047 030C;;;;N;LATIN CAPITAL LETTER G HACEK;;;01E7; +01E7;LATIN SMALL LETTER G WITH CARON;Ll;0;L;0067 030C;;;;N;LATIN SMALL LETTER G HACEK;;01E6;;01E6 +01E8;LATIN CAPITAL LETTER K WITH CARON;Lu;0;L;004B 030C;;;;N;LATIN CAPITAL LETTER K HACEK;;;01E9; +01E9;LATIN SMALL LETTER K WITH CARON;Ll;0;L;006B 030C;;;;N;LATIN SMALL LETTER K HACEK;;01E8;;01E8 +01EA;LATIN CAPITAL LETTER O WITH OGONEK;Lu;0;L;004F 0328;;;;N;LATIN CAPITAL LETTER O OGONEK;;;01EB; +01EB;LATIN SMALL LETTER O WITH OGONEK;Ll;0;L;006F 0328;;;;N;LATIN SMALL LETTER O OGONEK;;01EA;;01EA +01EC;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON;Lu;0;L;01EA 0304;;;;N;LATIN CAPITAL LETTER O OGONEK MACRON;;;01ED; +01ED;LATIN SMALL LETTER O WITH OGONEK AND MACRON;Ll;0;L;01EB 0304;;;;N;LATIN SMALL LETTER O OGONEK MACRON;;01EC;;01EC +01EE;LATIN CAPITAL LETTER EZH WITH CARON;Lu;0;L;01B7 030C;;;;N;LATIN CAPITAL LETTER YOGH HACEK;;;01EF; +01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE +01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;; +01F1;LATIN CAPITAL LETTER DZ;Lu;0;L;<compat> 0044 005A;;;;N;;;;01F3;01F2 +01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L;<compat> 0044 007A;;;;N;;;01F1;01F3; +01F3;LATIN SMALL LETTER DZ;Ll;0;L;<compat> 0064 007A;;;;N;;;01F1;;01F2 +01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5; +01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4 +01F6;LATIN CAPITAL LETTER HWAIR;Lu;0;L;;;;;N;;;;0195; +01F7;LATIN CAPITAL LETTER WYNN;Lu;0;L;;;;;N;;;;01BF; +01F8;LATIN CAPITAL LETTER N WITH GRAVE;Lu;0;L;004E 0300;;;;N;;;;01F9; +01F9;LATIN SMALL LETTER N WITH GRAVE;Ll;0;L;006E 0300;;;;N;;;01F8;;01F8 +01FA;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE;Lu;0;L;00C5 0301;;;;N;;;;01FB; +01FB;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE;Ll;0;L;00E5 0301;;;;N;;;01FA;;01FA +01FC;LATIN CAPITAL LETTER AE WITH ACUTE;Lu;0;L;00C6 0301;;;;N;;ash *;;01FD; +01FD;LATIN SMALL LETTER AE WITH ACUTE;Ll;0;L;00E6 0301;;;;N;;ash *;01FC;;01FC +01FE;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE;Lu;0;L;00D8 0301;;;;N;;;;01FF; +01FF;LATIN SMALL LETTER O WITH STROKE AND ACUTE;Ll;0;L;00F8 0301;;;;N;;;01FE;;01FE +0200;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE;Lu;0;L;0041 030F;;;;N;;;;0201; +0201;LATIN SMALL LETTER A WITH DOUBLE GRAVE;Ll;0;L;0061 030F;;;;N;;;0200;;0200 +0202;LATIN CAPITAL LETTER A WITH INVERTED BREVE;Lu;0;L;0041 0311;;;;N;;;;0203; +0203;LATIN SMALL LETTER A WITH INVERTED BREVE;Ll;0;L;0061 0311;;;;N;;;0202;;0202 +0204;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE;Lu;0;L;0045 030F;;;;N;;;;0205; +0205;LATIN SMALL LETTER E WITH DOUBLE GRAVE;Ll;0;L;0065 030F;;;;N;;;0204;;0204 +0206;LATIN CAPITAL LETTER E WITH INVERTED BREVE;Lu;0;L;0045 0311;;;;N;;;;0207; +0207;LATIN SMALL LETTER E WITH INVERTED BREVE;Ll;0;L;0065 0311;;;;N;;;0206;;0206 +0208;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE;Lu;0;L;0049 030F;;;;N;;;;0209; +0209;LATIN SMALL LETTER I WITH DOUBLE GRAVE;Ll;0;L;0069 030F;;;;N;;;0208;;0208 +020A;LATIN CAPITAL LETTER I WITH INVERTED BREVE;Lu;0;L;0049 0311;;;;N;;;;020B; +020B;LATIN SMALL LETTER I WITH INVERTED BREVE;Ll;0;L;0069 0311;;;;N;;;020A;;020A +020C;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE;Lu;0;L;004F 030F;;;;N;;;;020D; +020D;LATIN SMALL LETTER O WITH DOUBLE GRAVE;Ll;0;L;006F 030F;;;;N;;;020C;;020C +020E;LATIN CAPITAL LETTER O WITH INVERTED BREVE;Lu;0;L;004F 0311;;;;N;;;;020F; +020F;LATIN SMALL LETTER O WITH INVERTED BREVE;Ll;0;L;006F 0311;;;;N;;;020E;;020E +0210;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE;Lu;0;L;0052 030F;;;;N;;;;0211; +0211;LATIN SMALL LETTER R WITH DOUBLE GRAVE;Ll;0;L;0072 030F;;;;N;;;0210;;0210 +0212;LATIN CAPITAL LETTER R WITH INVERTED BREVE;Lu;0;L;0052 0311;;;;N;;;;0213; +0213;LATIN SMALL LETTER R WITH INVERTED BREVE;Ll;0;L;0072 0311;;;;N;;;0212;;0212 +0214;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE;Lu;0;L;0055 030F;;;;N;;;;0215; +0215;LATIN SMALL LETTER U WITH DOUBLE GRAVE;Ll;0;L;0075 030F;;;;N;;;0214;;0214 +0216;LATIN CAPITAL LETTER U WITH INVERTED BREVE;Lu;0;L;0055 0311;;;;N;;;;0217; +0217;LATIN SMALL LETTER U WITH INVERTED BREVE;Ll;0;L;0075 0311;;;;N;;;0216;;0216 +0218;LATIN CAPITAL LETTER S WITH COMMA BELOW;Lu;0;L;0053 0326;;;;N;;*;;0219; +0219;LATIN SMALL LETTER S WITH COMMA BELOW;Ll;0;L;0073 0326;;;;N;;*;0218;;0218 +021A;LATIN CAPITAL LETTER T WITH COMMA BELOW;Lu;0;L;0054 0326;;;;N;;*;;021B; +021B;LATIN SMALL LETTER T WITH COMMA BELOW;Ll;0;L;0074 0326;;;;N;;*;021A;;021A +021C;LATIN CAPITAL LETTER YOGH;Lu;0;L;;;;;N;;;;021D; +021D;LATIN SMALL LETTER YOGH;Ll;0;L;;;;;N;;;021C;;021C +021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F; +021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E +0220;LATIN CAPITAL LETTER N WITH LONG RIGHT LEG;Lu;0;L;;;;;N;;;;019E; +0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223; +0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222 +0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225; +0225;LATIN SMALL LETTER Z WITH HOOK;Ll;0;L;;;;;N;;;0224;;0224 +0226;LATIN CAPITAL LETTER A WITH DOT ABOVE;Lu;0;L;0041 0307;;;;N;;;;0227; +0227;LATIN SMALL LETTER A WITH DOT ABOVE;Ll;0;L;0061 0307;;;;N;;;0226;;0226 +0228;LATIN CAPITAL LETTER E WITH CEDILLA;Lu;0;L;0045 0327;;;;N;;;;0229; +0229;LATIN SMALL LETTER E WITH CEDILLA;Ll;0;L;0065 0327;;;;N;;;0228;;0228 +022A;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON;Lu;0;L;00D6 0304;;;;N;;;;022B; +022B;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON;Ll;0;L;00F6 0304;;;;N;;;022A;;022A +022C;LATIN CAPITAL LETTER O WITH TILDE AND MACRON;Lu;0;L;00D5 0304;;;;N;;;;022D; +022D;LATIN SMALL LETTER O WITH TILDE AND MACRON;Ll;0;L;00F5 0304;;;;N;;;022C;;022C +022E;LATIN CAPITAL LETTER O WITH DOT ABOVE;Lu;0;L;004F 0307;;;;N;;;;022F; +022F;LATIN SMALL LETTER O WITH DOT ABOVE;Ll;0;L;006F 0307;;;;N;;;022E;;022E +0230;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON;Lu;0;L;022E 0304;;;;N;;;;0231; +0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230 +0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233; +0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232 +0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;;; +0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;;; +0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;;; +0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181 +0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186 +0255;LATIN SMALL LETTER C WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER C CURL;;;; +0256;LATIN SMALL LETTER D WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER D RETROFLEX HOOK;;0189;;0189 +0257;LATIN SMALL LETTER D WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER D HOOK;;018A;;018A +0258;LATIN SMALL LETTER REVERSED E;Ll;0;L;;;;;N;;;;; +0259;LATIN SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;018F;;018F +025A;LATIN SMALL LETTER SCHWA WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCHWA HOOK;;;; +025B;LATIN SMALL LETTER OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER EPSILON;;0190;;0190 +025C;LATIN SMALL LETTER REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON;;;; +025D;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON HOOK;;;; +025E;LATIN SMALL LETTER CLOSED REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED REVERSED EPSILON;;;; +025F;LATIN SMALL LETTER DOTLESS J WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR;;;; +0260;LATIN SMALL LETTER G WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER G HOOK;;0193;;0193 +0261;LATIN SMALL LETTER SCRIPT G;Ll;0;L;;;;;N;;;;; +0262;LATIN LETTER SMALL CAPITAL G;Ll;0;L;;;;;N;;;;; +0263;LATIN SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0194;;0194 +0264;LATIN SMALL LETTER RAMS HORN;Ll;0;L;;;;;N;LATIN SMALL LETTER BABY GAMMA;;;; +0265;LATIN SMALL LETTER TURNED H;Ll;0;L;;;;;N;;;;; +0266;LATIN SMALL LETTER H WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER H HOOK;;;; +0267;LATIN SMALL LETTER HENG WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER HENG HOOK;;;; +0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197 +0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196 +026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;;; +026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;;; +026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;; +026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;; +026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C +0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;; +0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;;; +0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D +0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;; +0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;; +0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F +0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;; +0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;; +0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;; +0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;; +027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;; +027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;; +027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;; +027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;;; +027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;; +027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;; +0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;*;01A6;;01A6 +0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;; +0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;;; +0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9 +0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;; +0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;; +0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;; +0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;;; +0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE +0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;;; +028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1 +028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2 +028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;;; +028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;; +028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;; +028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;; +0290;LATIN SMALL LETTER Z WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Z RETROFLEX HOOK;;;; +0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;; +0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7 +0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;; +0294;LATIN LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;;; +0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;; +0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;; +0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;; +0298;LATIN LETTER BILABIAL CLICK;Ll;0;L;;;;;N;LATIN LETTER BULLSEYE;;;; +0299;LATIN LETTER SMALL CAPITAL B;Ll;0;L;;;;;N;;;;; +029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;; +029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;; +029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;; +029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;;; +029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;;; +029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;; +02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;; +02A1;LATIN LETTER GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER GLOTTAL STOP BAR;;;; +02A2;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP BAR;;;; +02A3;LATIN SMALL LETTER DZ DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z;;;; +02A4;LATIN SMALL LETTER DEZH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D YOGH;;;; +02A5;LATIN SMALL LETTER DZ DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z CURL;;;; +02A6;LATIN SMALL LETTER TS DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T S;;;; +02A7;LATIN SMALL LETTER TESH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T ESH;;;; +02A8;LATIN SMALL LETTER TC DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER T C CURL;;;; +02A9;LATIN SMALL LETTER FENG DIGRAPH;Ll;0;L;;;;;N;;;;; +02AA;LATIN SMALL LETTER LS DIGRAPH;Ll;0;L;;;;;N;;;;; +02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;; +02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; +02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; +02B0;MODIFIER LETTER SMALL H;Lm;0;L;<super> 0068;;;;N;;;;; +02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L;<super> 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;; +02B2;MODIFIER LETTER SMALL J;Lm;0;L;<super> 006A;;;;N;;;;; +02B3;MODIFIER LETTER SMALL R;Lm;0;L;<super> 0072;;;;N;;;;; +02B4;MODIFIER LETTER SMALL TURNED R;Lm;0;L;<super> 0279;;;;N;;;;; +02B5;MODIFIER LETTER SMALL TURNED R WITH HOOK;Lm;0;L;<super> 027B;;;;N;MODIFIER LETTER SMALL TURNED R HOOK;;;; +02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L;<super> 0281;;;;N;;;;; +02B7;MODIFIER LETTER SMALL W;Lm;0;L;<super> 0077;;;;N;;;;; +02B8;MODIFIER LETTER SMALL Y;Lm;0;L;<super> 0079;;;;N;;;;; +02B9;MODIFIER LETTER PRIME;Sk;0;ON;;;;;N;;;;; +02BA;MODIFIER LETTER DOUBLE PRIME;Sk;0;ON;;;;;N;;;;; +02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;; +02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;; +02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;; +02BE;MODIFIER LETTER RIGHT HALF RING;Lm;0;L;;;;;N;;;;; +02BF;MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; +02C0;MODIFIER LETTER GLOTTAL STOP;Lm;0;L;;;;;N;;;;; +02C1;MODIFIER LETTER REVERSED GLOTTAL STOP;Lm;0;L;;;;;N;;;;; +02C2;MODIFIER LETTER LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;; +02C7;CARON;Sk;0;ON;;;;;N;MODIFIER LETTER HACEK;Mandarin Chinese third tone;;; +02C8;MODIFIER LETTER VERTICAL LINE;Sk;0;ON;;;;;N;;;;; +02C9;MODIFIER LETTER MACRON;Sk;0;ON;;;;;N;;Mandarin Chinese first tone;;; +02CA;MODIFIER LETTER ACUTE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER ACUTE;Mandarin Chinese second tone;;; +02CB;MODIFIER LETTER GRAVE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER GRAVE;Mandarin Chinese fourth tone;;; +02CC;MODIFIER LETTER LOW VERTICAL LINE;Sk;0;ON;;;;;N;;;;; +02CD;MODIFIER LETTER LOW MACRON;Sk;0;ON;;;;;N;;;;; +02CE;MODIFIER LETTER LOW GRAVE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;; +02CF;MODIFIER LETTER LOW ACUTE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;; +02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; +02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; +02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;; +02D3;MODIFIER LETTER CENTRED LEFT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED LEFT HALF RING;;;; +02D4;MODIFIER LETTER UP TACK;Sk;0;ON;;;;;N;;;;; +02D5;MODIFIER LETTER DOWN TACK;Sk;0;ON;;;;;N;;;;; +02D6;MODIFIER LETTER PLUS SIGN;Sk;0;ON;;;;;N;;;;; +02D7;MODIFIER LETTER MINUS SIGN;Sk;0;ON;;;;;N;;;;; +02D8;BREVE;Sk;0;ON;<compat> 0020 0306;;;;N;SPACING BREVE;;;; +02D9;DOT ABOVE;Sk;0;ON;<compat> 0020 0307;;;;N;SPACING DOT ABOVE;Mandarin Chinese light tone;;; +02DA;RING ABOVE;Sk;0;ON;<compat> 0020 030A;;;;N;SPACING RING ABOVE;;;; +02DB;OGONEK;Sk;0;ON;<compat> 0020 0328;;;;N;SPACING OGONEK;;;; +02DC;SMALL TILDE;Sk;0;ON;<compat> 0020 0303;;;;N;SPACING TILDE;;;; +02DD;DOUBLE ACUTE ACCENT;Sk;0;ON;<compat> 0020 030B;;;;N;SPACING DOUBLE ACUTE;;;; +02DE;MODIFIER LETTER RHOTIC HOOK;Sk;0;ON;;;;;N;;;;; +02DF;MODIFIER LETTER CROSS ACCENT;Sk;0;ON;;;;;N;;;;; +02E0;MODIFIER LETTER SMALL GAMMA;Lm;0;L;<super> 0263;;;;N;;;;; +02E1;MODIFIER LETTER SMALL L;Lm;0;L;<super> 006C;;;;N;;;;; +02E2;MODIFIER LETTER SMALL S;Lm;0;L;<super> 0073;;;;N;;;;; +02E3;MODIFIER LETTER SMALL X;Lm;0;L;<super> 0078;;;;N;;;;; +02E4;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP;Lm;0;L;<super> 0295;;;;N;;;;; +02E5;MODIFIER LETTER EXTRA-HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; +02E6;MODIFIER LETTER HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; +02E7;MODIFIER LETTER MID TONE BAR;Sk;0;ON;;;;;N;;;;; +02E8;MODIFIER LETTER LOW TONE BAR;Sk;0;ON;;;;;N;;;;; +02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;; +02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; +02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; +02EC;MODIFIER LETTER VOICING;Sk;0;ON;;;;;N;;;;; +02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;; +02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;; +0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;Varia;;; +0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;Oxia, Tonos;;; +0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;; +0303;COMBINING TILDE;Mn;230;NSM;;;;;N;NON-SPACING TILDE;;;; +0304;COMBINING MACRON;Mn;230;NSM;;;;;N;NON-SPACING MACRON;;;; +0305;COMBINING OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING OVERSCORE;;;; +0306;COMBINING BREVE;Mn;230;NSM;;;;;N;NON-SPACING BREVE;Vrachy;;; +0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;; +0308;COMBINING DIAERESIS;Mn;230;NSM;;;;;N;NON-SPACING DIAERESIS;Dialytika;;; +0309;COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;NON-SPACING HOOK ABOVE;;;; +030A;COMBINING RING ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RING ABOVE;;;; +030B;COMBINING DOUBLE ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE ACUTE;;;; +030C;COMBINING CARON;Mn;230;NSM;;;;;N;NON-SPACING HACEK;;;; +030D;COMBINING VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL LINE ABOVE;;;; +030E;COMBINING DOUBLE VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE VERTICAL LINE ABOVE;;;; +030F;COMBINING DOUBLE GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE GRAVE;;;; +0310;COMBINING CANDRABINDU;Mn;230;NSM;;;;;N;NON-SPACING CANDRABINDU;;;; +0311;COMBINING INVERTED BREVE;Mn;230;NSM;;;;;N;NON-SPACING INVERTED BREVE;;;; +0312;COMBINING TURNED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING TURNED COMMA ABOVE;;;; +0313;COMBINING COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING COMMA ABOVE;Psili;;; +0314;COMBINING REVERSED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING REVERSED COMMA ABOVE;Dasia;;; +0315;COMBINING COMMA ABOVE RIGHT;Mn;232;NSM;;;;;N;NON-SPACING COMMA ABOVE RIGHT;;;; +0316;COMBINING GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING GRAVE BELOW;;;; +0317;COMBINING ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING ACUTE BELOW;;;; +0318;COMBINING LEFT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT TACK BELOW;;;; +0319;COMBINING RIGHT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT TACK BELOW;;;; +031A;COMBINING LEFT ANGLE ABOVE;Mn;232;NSM;;;;;N;NON-SPACING LEFT ANGLE ABOVE;;;; +031B;COMBINING HORN;Mn;216;NSM;;;;;N;NON-SPACING HORN;;;; +031C;COMBINING LEFT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT HALF RING BELOW;;;; +031D;COMBINING UP TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING UP TACK BELOW;;;; +031E;COMBINING DOWN TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOWN TACK BELOW;;;; +031F;COMBINING PLUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING PLUS SIGN BELOW;;;; +0320;COMBINING MINUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING MINUS SIGN BELOW;;;; +0321;COMBINING PALATALIZED HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING PALATALIZED HOOK BELOW;;;; +0322;COMBINING RETROFLEX HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING RETROFLEX HOOK BELOW;;;; +0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;; +0324;COMBINING DIAERESIS BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE DOT BELOW;;;; +0325;COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;; +0326;COMBINING COMMA BELOW;Mn;220;NSM;;;;;N;NON-SPACING COMMA BELOW;;;; +0327;COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;; +0328;COMBINING OGONEK;Mn;202;NSM;;;;;N;NON-SPACING OGONEK;;;; +0329;COMBINING VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;NON-SPACING VERTICAL LINE BELOW;;;; +032A;COMBINING BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BRIDGE BELOW;;;; +032B;COMBINING INVERTED DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED DOUBLE ARCH BELOW;;;; +032C;COMBINING CARON BELOW;Mn;220;NSM;;;;;N;NON-SPACING HACEK BELOW;;;; +032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;; +032E;COMBINING BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BREVE BELOW;;;; +032F;COMBINING INVERTED BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BREVE BELOW;;;; +0330;COMBINING TILDE BELOW;Mn;220;NSM;;;;;N;NON-SPACING TILDE BELOW;;;; +0331;COMBINING MACRON BELOW;Mn;220;NSM;;;;;N;NON-SPACING MACRON BELOW;;;; +0332;COMBINING LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING UNDERSCORE;;;; +0333;COMBINING DOUBLE LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE UNDERSCORE;;;; +0334;COMBINING TILDE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING TILDE OVERLAY;;;; +0335;COMBINING SHORT STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT BAR OVERLAY;;;; +0336;COMBINING LONG STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG BAR OVERLAY;;;; +0337;COMBINING SHORT SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT SLASH OVERLAY;;;; +0338;COMBINING LONG SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG SLASH OVERLAY;;;; +0339;COMBINING RIGHT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT HALF RING BELOW;;;; +033A;COMBINING INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BRIDGE BELOW;;;; +033B;COMBINING SQUARE BELOW;Mn;220;NSM;;;;;N;NON-SPACING SQUARE BELOW;;;; +033C;COMBINING SEAGULL BELOW;Mn;220;NSM;;;;;N;NON-SPACING SEAGULL BELOW;;;; +033D;COMBINING X ABOVE;Mn;230;NSM;;;;;N;NON-SPACING X ABOVE;;;; +033E;COMBINING VERTICAL TILDE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL TILDE;;;; +033F;COMBINING DOUBLE OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE OVERSCORE;;;; +0340;COMBINING GRAVE TONE MARK;Mn;230;NSM;0300;;;;N;NON-SPACING GRAVE TONE MARK;Vietnamese;;; +0341;COMBINING ACUTE TONE MARK;Mn;230;NSM;0301;;;;N;NON-SPACING ACUTE TONE MARK;Vietnamese;;; +0342;COMBINING GREEK PERISPOMENI;Mn;230;NSM;;;;;N;;;;; +0343;COMBINING GREEK KORONIS;Mn;230;NSM;0313;;;;N;;;;; +0344;COMBINING GREEK DIALYTIKA TONOS;Mn;230;NSM;0308 0301;;;;N;GREEK NON-SPACING DIAERESIS TONOS;;;; +0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA BELOW;;0399;;0399 +0346;COMBINING BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; +0347;COMBINING EQUALS SIGN BELOW;Mn;220;NSM;;;;;N;;;;; +0348;COMBINING DOUBLE VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;;;;; +0349;COMBINING LEFT ANGLE BELOW;Mn;220;NSM;;;;;N;;;;; +034A;COMBINING NOT TILDE ABOVE;Mn;230;NSM;;;;;N;;;;; +034B;COMBINING HOMOTHETIC ABOVE;Mn;230;NSM;;;;;N;;;;; +034C;COMBINING ALMOST EQUAL TO ABOVE;Mn;230;NSM;;;;;N;;;;; +034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +034F;COMBINING GRAPHEME JOINER;Mn;0;NSM;;;;;N;;;;; +0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;; +0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;; +0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;; +0363;COMBINING LATIN SMALL LETTER A;Mn;230;NSM;;;;;N;;;;; +0364;COMBINING LATIN SMALL LETTER E;Mn;230;NSM;;;;;N;;;;; +0365;COMBINING LATIN SMALL LETTER I;Mn;230;NSM;;;;;N;;;;; +0366;COMBINING LATIN SMALL LETTER O;Mn;230;NSM;;;;;N;;;;; +0367;COMBINING LATIN SMALL LETTER U;Mn;230;NSM;;;;;N;;;;; +0368;COMBINING LATIN SMALL LETTER C;Mn;230;NSM;;;;;N;;;;; +0369;COMBINING LATIN SMALL LETTER D;Mn;230;NSM;;;;;N;;;;; +036A;COMBINING LATIN SMALL LETTER H;Mn;230;NSM;;;;;N;;;;; +036B;COMBINING LATIN SMALL LETTER M;Mn;230;NSM;;;;;N;;;;; +036C;COMBINING LATIN SMALL LETTER R;Mn;230;NSM;;;;;N;;;;; +036D;COMBINING LATIN SMALL LETTER T;Mn;230;NSM;;;;;N;;;;; +036E;COMBINING LATIN SMALL LETTER V;Mn;230;NSM;;;;;N;;;;; +036F;COMBINING LATIN SMALL LETTER X;Mn;230;NSM;;;;;N;;;;; +0374;GREEK NUMERAL SIGN;Sk;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;Dexia keraia;;; +0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;Aristeri keraia;;; +037A;GREEK YPOGEGRAMMENI;Lm;0;L;<compat> 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;; +037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;Erotimatiko;;; +0384;GREEK TONOS;Sk;0;ON;<compat> 0020 0301;;;;N;GREEK SPACING TONOS;;;; +0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;; +0386;GREEK CAPITAL LETTER ALPHA WITH TONOS;Lu;0;L;0391 0301;;;;N;GREEK CAPITAL LETTER ALPHA TONOS;;;03AC; +0387;GREEK ANO TELEIA;Po;0;ON;00B7;;;;N;;;;; +0388;GREEK CAPITAL LETTER EPSILON WITH TONOS;Lu;0;L;0395 0301;;;;N;GREEK CAPITAL LETTER EPSILON TONOS;;;03AD; +0389;GREEK CAPITAL LETTER ETA WITH TONOS;Lu;0;L;0397 0301;;;;N;GREEK CAPITAL LETTER ETA TONOS;;;03AE; +038A;GREEK CAPITAL LETTER IOTA WITH TONOS;Lu;0;L;0399 0301;;;;N;GREEK CAPITAL LETTER IOTA TONOS;;;03AF; +038C;GREEK CAPITAL LETTER OMICRON WITH TONOS;Lu;0;L;039F 0301;;;;N;GREEK CAPITAL LETTER OMICRON TONOS;;;03CC; +038E;GREEK CAPITAL LETTER UPSILON WITH TONOS;Lu;0;L;03A5 0301;;;;N;GREEK CAPITAL LETTER UPSILON TONOS;;;03CD; +038F;GREEK CAPITAL LETTER OMEGA WITH TONOS;Lu;0;L;03A9 0301;;;;N;GREEK CAPITAL LETTER OMEGA TONOS;;;03CE; +0390;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS;Ll;0;L;03CA 0301;;;;N;GREEK SMALL LETTER IOTA DIAERESIS TONOS;;;; +0391;GREEK CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;03B1; +0392;GREEK CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;03B2; +0393;GREEK CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;03B3; +0394;GREEK CAPITAL LETTER DELTA;Lu;0;L;;;;;N;;;;03B4; +0395;GREEK CAPITAL LETTER EPSILON;Lu;0;L;;;;;N;;;;03B5; +0396;GREEK CAPITAL LETTER ZETA;Lu;0;L;;;;;N;;;;03B6; +0397;GREEK CAPITAL LETTER ETA;Lu;0;L;;;;;N;;;;03B7; +0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8; +0399;GREEK CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;03B9; +039A;GREEK CAPITAL LETTER KAPPA;Lu;0;L;;;;;N;;;;03BA; +039B;GREEK CAPITAL LETTER LAMDA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER LAMBDA;;;03BB; +039C;GREEK CAPITAL LETTER MU;Lu;0;L;;;;;N;;;;03BC; +039D;GREEK CAPITAL LETTER NU;Lu;0;L;;;;;N;;;;03BD; +039E;GREEK CAPITAL LETTER XI;Lu;0;L;;;;;N;;;;03BE; +039F;GREEK CAPITAL LETTER OMICRON;Lu;0;L;;;;;N;;;;03BF; +03A0;GREEK CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;03C0; +03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1; +03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3; +03A4;GREEK CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;03C4; +03A5;GREEK CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;03C5; +03A6;GREEK CAPITAL LETTER PHI;Lu;0;L;;;;;N;;;;03C6; +03A7;GREEK CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;03C7; +03A8;GREEK CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;03C8; +03A9;GREEK CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;03C9; +03AA;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA;Lu;0;L;0399 0308;;;;N;GREEK CAPITAL LETTER IOTA DIAERESIS;;;03CA; +03AB;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA;Lu;0;L;03A5 0308;;;;N;GREEK CAPITAL LETTER UPSILON DIAERESIS;;;03CB; +03AC;GREEK SMALL LETTER ALPHA WITH TONOS;Ll;0;L;03B1 0301;;;;N;GREEK SMALL LETTER ALPHA TONOS;;0386;;0386 +03AD;GREEK SMALL LETTER EPSILON WITH TONOS;Ll;0;L;03B5 0301;;;;N;GREEK SMALL LETTER EPSILON TONOS;;0388;;0388 +03AE;GREEK SMALL LETTER ETA WITH TONOS;Ll;0;L;03B7 0301;;;;N;GREEK SMALL LETTER ETA TONOS;;0389;;0389 +03AF;GREEK SMALL LETTER IOTA WITH TONOS;Ll;0;L;03B9 0301;;;;N;GREEK SMALL LETTER IOTA TONOS;;038A;;038A +03B0;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS;Ll;0;L;03CB 0301;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS TONOS;;;; +03B1;GREEK SMALL LETTER ALPHA;Ll;0;L;;;;;N;;;0391;;0391 +03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392 +03B3;GREEK SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0393;;0393 +03B4;GREEK SMALL LETTER DELTA;Ll;0;L;;;;;N;;;0394;;0394 +03B5;GREEK SMALL LETTER EPSILON;Ll;0;L;;;;;N;;;0395;;0395 +03B6;GREEK SMALL LETTER ZETA;Ll;0;L;;;;;N;;;0396;;0396 +03B7;GREEK SMALL LETTER ETA;Ll;0;L;;;;;N;;;0397;;0397 +03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398 +03B9;GREEK SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0399;;0399 +03BA;GREEK SMALL LETTER KAPPA;Ll;0;L;;;;;N;;;039A;;039A +03BB;GREEK SMALL LETTER LAMDA;Ll;0;L;;;;;N;GREEK SMALL LETTER LAMBDA;;039B;;039B +03BC;GREEK SMALL LETTER MU;Ll;0;L;;;;;N;;;039C;;039C +03BD;GREEK SMALL LETTER NU;Ll;0;L;;;;;N;;;039D;;039D +03BE;GREEK SMALL LETTER XI;Ll;0;L;;;;;N;;;039E;;039E +03BF;GREEK SMALL LETTER OMICRON;Ll;0;L;;;;;N;;;039F;;039F +03C0;GREEK SMALL LETTER PI;Ll;0;L;;;;;N;;;03A0;;03A0 +03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1 +03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 +03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 +03C4;GREEK SMALL LETTER TAU;Ll;0;L;;;;;N;;;03A4;;03A4 +03C5;GREEK SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;03A5;;03A5 +03C6;GREEK SMALL LETTER PHI;Ll;0;L;;;;;N;;;03A6;;03A6 +03C7;GREEK SMALL LETTER CHI;Ll;0;L;;;;;N;;;03A7;;03A7 +03C8;GREEK SMALL LETTER PSI;Ll;0;L;;;;;N;;;03A8;;03A8 +03C9;GREEK SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;03A9;;03A9 +03CA;GREEK SMALL LETTER IOTA WITH DIALYTIKA;Ll;0;L;03B9 0308;;;;N;GREEK SMALL LETTER IOTA DIAERESIS;;03AA;;03AA +03CB;GREEK SMALL LETTER UPSILON WITH DIALYTIKA;Ll;0;L;03C5 0308;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS;;03AB;;03AB +03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C +03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E +03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F +03D0;GREEK BETA SYMBOL;Ll;0;L;<compat> 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392 +03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398 +03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L;<compat> 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;; +03D3;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL;Lu;0;L;03D2 0301;;;;N;GREEK CAPITAL LETTER UPSILON HOOK TONOS;;;; +03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;; +03D5;GREEK PHI SYMBOL;Ll;0;L;<compat> 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6 +03D6;GREEK PI SYMBOL;Ll;0;L;<compat> 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0 +03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;;; +03D8;GREEK LETTER ARCHAIC KOPPA;Lu;0;L;;;;;N;;*;;03D9; +03D9;GREEK SMALL LETTER ARCHAIC KOPPA;Ll;0;L;;;;;N;;*;03D8;;03D8 +03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB; +03DB;GREEK SMALL LETTER STIGMA;Ll;0;L;;;;;N;;;03DA;;03DA +03DC;GREEK LETTER DIGAMMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DIGAMMA;;;03DD; +03DD;GREEK SMALL LETTER DIGAMMA;Ll;0;L;;;;;N;;;03DC;;03DC +03DE;GREEK LETTER KOPPA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KOPPA;;;03DF; +03DF;GREEK SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;03DE;;03DE +03E0;GREEK LETTER SAMPI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SAMPI;;;03E1; +03E1;GREEK SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;03E0;;03E0 +03E2;COPTIC CAPITAL LETTER SHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHEI;;;03E3; +03E3;COPTIC SMALL LETTER SHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER SHEI;;03E2;;03E2 +03E4;COPTIC CAPITAL LETTER FEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER FEI;;;03E5; +03E5;COPTIC SMALL LETTER FEI;Ll;0;L;;;;;N;GREEK SMALL LETTER FEI;;03E4;;03E4 +03E6;COPTIC CAPITAL LETTER KHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KHEI;;;03E7; +03E7;COPTIC SMALL LETTER KHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER KHEI;;03E6;;03E6 +03E8;COPTIC CAPITAL LETTER HORI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER HORI;;;03E9; +03E9;COPTIC SMALL LETTER HORI;Ll;0;L;;;;;N;GREEK SMALL LETTER HORI;;03E8;;03E8 +03EA;COPTIC CAPITAL LETTER GANGIA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER GANGIA;;;03EB; +03EB;COPTIC SMALL LETTER GANGIA;Ll;0;L;;;;;N;GREEK SMALL LETTER GANGIA;;03EA;;03EA +03EC;COPTIC CAPITAL LETTER SHIMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHIMA;;;03ED; +03ED;COPTIC SMALL LETTER SHIMA;Ll;0;L;;;;;N;GREEK SMALL LETTER SHIMA;;03EC;;03EC +03EE;COPTIC CAPITAL LETTER DEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DEI;;;03EF; +03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE +03F0;GREEK KAPPA SYMBOL;Ll;0;L;<compat> 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A +03F1;GREEK RHO SYMBOL;Ll;0;L;<compat> 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1 +03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L;<compat> 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03A3;;03A3 +03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;;; +03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L;<compat> 0398;;;;N;;;;03B8; +03F5;GREEK LUNATE EPSILON SYMBOL;Ll;0;L;<compat> 03B5;;;;N;;;0395;;0395 +03F6;GREEK REVERSED LUNATE EPSILON SYMBOL;Sm;0;ON;;;;;N;;;;; +0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450; +0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451; +0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;Serbocroatian;;0452; +0403;CYRILLIC CAPITAL LETTER GJE;Lu;0;L;0413 0301;;;;N;;;;0453; +0404;CYRILLIC CAPITAL LETTER UKRAINIAN IE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER E;;;0454; +0405;CYRILLIC CAPITAL LETTER DZE;Lu;0;L;;;;;N;;;;0455; +0406;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER I;;;0456; +0407;CYRILLIC CAPITAL LETTER YI;Lu;0;L;0406 0308;;;;N;;Ukrainian;;0457; +0408;CYRILLIC CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;0458; +0409;CYRILLIC CAPITAL LETTER LJE;Lu;0;L;;;;;N;;;;0459; +040A;CYRILLIC CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;045A; +040B;CYRILLIC CAPITAL LETTER TSHE;Lu;0;L;;;;;N;;Serbocroatian;;045B; +040C;CYRILLIC CAPITAL LETTER KJE;Lu;0;L;041A 0301;;;;N;;;;045C; +040D;CYRILLIC CAPITAL LETTER I WITH GRAVE;Lu;0;L;0418 0300;;;;N;;;;045D; +040E;CYRILLIC CAPITAL LETTER SHORT U;Lu;0;L;0423 0306;;;;N;;Byelorussian;;045E; +040F;CYRILLIC CAPITAL LETTER DZHE;Lu;0;L;;;;;N;;;;045F; +0410;CYRILLIC CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0430; +0411;CYRILLIC CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;0431; +0412;CYRILLIC CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;0432; +0413;CYRILLIC CAPITAL LETTER GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE;;;0433; +0414;CYRILLIC CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;0434; +0415;CYRILLIC CAPITAL LETTER IE;Lu;0;L;;;;;N;;;;0435; +0416;CYRILLIC CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;0436; +0417;CYRILLIC CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;0437; +0418;CYRILLIC CAPITAL LETTER I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER II;;;0438; +0419;CYRILLIC CAPITAL LETTER SHORT I;Lu;0;L;0418 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT II;;;0439; +041A;CYRILLIC CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;043A; +041B;CYRILLIC CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;043B; +041C;CYRILLIC CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;043C; +041D;CYRILLIC CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;043D; +041E;CYRILLIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;043E; +041F;CYRILLIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;043F; +0420;CYRILLIC CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;0440; +0421;CYRILLIC CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;0441; +0422;CYRILLIC CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;0442; +0423;CYRILLIC CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0443; +0424;CYRILLIC CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;0444; +0425;CYRILLIC CAPITAL LETTER HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA;;;0445; +0426;CYRILLIC CAPITAL LETTER TSE;Lu;0;L;;;;;N;;;;0446; +0427;CYRILLIC CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;0447; +0428;CYRILLIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0448; +0429;CYRILLIC CAPITAL LETTER SHCHA;Lu;0;L;;;;;N;;;;0449; +042A;CYRILLIC CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;044A; +042B;CYRILLIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER YERI;;;044B; +042C;CYRILLIC CAPITAL LETTER SOFT SIGN;Lu;0;L;;;;;N;;;;044C; +042D;CYRILLIC CAPITAL LETTER E;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED E;;;044D; +042E;CYRILLIC CAPITAL LETTER YU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IU;;;044E; +042F;CYRILLIC CAPITAL LETTER YA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IA;;;044F; +0430;CYRILLIC SMALL LETTER A;Ll;0;L;;;;;N;;;0410;;0410 +0431;CYRILLIC SMALL LETTER BE;Ll;0;L;;;;;N;;;0411;;0411 +0432;CYRILLIC SMALL LETTER VE;Ll;0;L;;;;;N;;;0412;;0412 +0433;CYRILLIC SMALL LETTER GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE;;0413;;0413 +0434;CYRILLIC SMALL LETTER DE;Ll;0;L;;;;;N;;;0414;;0414 +0435;CYRILLIC SMALL LETTER IE;Ll;0;L;;;;;N;;;0415;;0415 +0436;CYRILLIC SMALL LETTER ZHE;Ll;0;L;;;;;N;;;0416;;0416 +0437;CYRILLIC SMALL LETTER ZE;Ll;0;L;;;;;N;;;0417;;0417 +0438;CYRILLIC SMALL LETTER I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER II;;0418;;0418 +0439;CYRILLIC SMALL LETTER SHORT I;Ll;0;L;0438 0306;;;;N;CYRILLIC SMALL LETTER SHORT II;;0419;;0419 +043A;CYRILLIC SMALL LETTER KA;Ll;0;L;;;;;N;;;041A;;041A +043B;CYRILLIC SMALL LETTER EL;Ll;0;L;;;;;N;;;041B;;041B +043C;CYRILLIC SMALL LETTER EM;Ll;0;L;;;;;N;;;041C;;041C +043D;CYRILLIC SMALL LETTER EN;Ll;0;L;;;;;N;;;041D;;041D +043E;CYRILLIC SMALL LETTER O;Ll;0;L;;;;;N;;;041E;;041E +043F;CYRILLIC SMALL LETTER PE;Ll;0;L;;;;;N;;;041F;;041F +0440;CYRILLIC SMALL LETTER ER;Ll;0;L;;;;;N;;;0420;;0420 +0441;CYRILLIC SMALL LETTER ES;Ll;0;L;;;;;N;;;0421;;0421 +0442;CYRILLIC SMALL LETTER TE;Ll;0;L;;;;;N;;;0422;;0422 +0443;CYRILLIC SMALL LETTER U;Ll;0;L;;;;;N;;;0423;;0423 +0444;CYRILLIC SMALL LETTER EF;Ll;0;L;;;;;N;;;0424;;0424 +0445;CYRILLIC SMALL LETTER HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA;;0425;;0425 +0446;CYRILLIC SMALL LETTER TSE;Ll;0;L;;;;;N;;;0426;;0426 +0447;CYRILLIC SMALL LETTER CHE;Ll;0;L;;;;;N;;;0427;;0427 +0448;CYRILLIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;0428;;0428 +0449;CYRILLIC SMALL LETTER SHCHA;Ll;0;L;;;;;N;;;0429;;0429 +044A;CYRILLIC SMALL LETTER HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A +044B;CYRILLIC SMALL LETTER YERU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER YERI;;042B;;042B +044C;CYRILLIC SMALL LETTER SOFT SIGN;Ll;0;L;;;;;N;;;042C;;042C +044D;CYRILLIC SMALL LETTER E;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED E;;042D;;042D +044E;CYRILLIC SMALL LETTER YU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IU;;042E;;042E +044F;CYRILLIC SMALL LETTER YA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IA;;042F;;042F +0450;CYRILLIC SMALL LETTER IE WITH GRAVE;Ll;0;L;0435 0300;;;;N;;;0400;;0400 +0451;CYRILLIC SMALL LETTER IO;Ll;0;L;0435 0308;;;;N;;;0401;;0401 +0452;CYRILLIC SMALL LETTER DJE;Ll;0;L;;;;;N;;Serbocroatian;0402;;0402 +0453;CYRILLIC SMALL LETTER GJE;Ll;0;L;0433 0301;;;;N;;;0403;;0403 +0454;CYRILLIC SMALL LETTER UKRAINIAN IE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER E;;0404;;0404 +0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405 +0456;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER I;;0406;;0406 +0457;CYRILLIC SMALL LETTER YI;Ll;0;L;0456 0308;;;;N;;Ukrainian;0407;;0407 +0458;CYRILLIC SMALL LETTER JE;Ll;0;L;;;;;N;;;0408;;0408 +0459;CYRILLIC SMALL LETTER LJE;Ll;0;L;;;;;N;;;0409;;0409 +045A;CYRILLIC SMALL LETTER NJE;Ll;0;L;;;;;N;;;040A;;040A +045B;CYRILLIC SMALL LETTER TSHE;Ll;0;L;;;;;N;;Serbocroatian;040B;;040B +045C;CYRILLIC SMALL LETTER KJE;Ll;0;L;043A 0301;;;;N;;;040C;;040C +045D;CYRILLIC SMALL LETTER I WITH GRAVE;Ll;0;L;0438 0300;;;;N;;;040D;;040D +045E;CYRILLIC SMALL LETTER SHORT U;Ll;0;L;0443 0306;;;;N;;Byelorussian;040E;;040E +045F;CYRILLIC SMALL LETTER DZHE;Ll;0;L;;;;;N;;;040F;;040F +0460;CYRILLIC CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;0461; +0461;CYRILLIC SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;0460;;0460 +0462;CYRILLIC CAPITAL LETTER YAT;Lu;0;L;;;;;N;;;;0463; +0463;CYRILLIC SMALL LETTER YAT;Ll;0;L;;;;;N;;;0462;;0462 +0464;CYRILLIC CAPITAL LETTER IOTIFIED E;Lu;0;L;;;;;N;;;;0465; +0465;CYRILLIC SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;0464;;0464 +0466;CYRILLIC CAPITAL LETTER LITTLE YUS;Lu;0;L;;;;;N;;;;0467; +0467;CYRILLIC SMALL LETTER LITTLE YUS;Ll;0;L;;;;;N;;;0466;;0466 +0468;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS;Lu;0;L;;;;;N;;;;0469; +0469;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS;Ll;0;L;;;;;N;;;0468;;0468 +046A;CYRILLIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;046B; +046B;CYRILLIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;046A;;046A +046C;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS;Lu;0;L;;;;;N;;;;046D; +046D;CYRILLIC SMALL LETTER IOTIFIED BIG YUS;Ll;0;L;;;;;N;;;046C;;046C +046E;CYRILLIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;046F; +046F;CYRILLIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;046E;;046E +0470;CYRILLIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;0471; +0471;CYRILLIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;0470;;0470 +0472;CYRILLIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;0473; +0473;CYRILLIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;0472;;0472 +0474;CYRILLIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;0475; +0475;CYRILLIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;0474;;0474 +0476;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Lu;0;L;0474 030F;;;;N;CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE;;;0477; +0477;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Ll;0;L;0475 030F;;;;N;CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE;;0476;;0476 +0478;CYRILLIC CAPITAL LETTER UK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER UK DIGRAPH;;;0479; +0479;CYRILLIC SMALL LETTER UK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER UK DIGRAPH;;0478;;0478 +047A;CYRILLIC CAPITAL LETTER ROUND OMEGA;Lu;0;L;;;;;N;;;;047B; +047B;CYRILLIC SMALL LETTER ROUND OMEGA;Ll;0;L;;;;;N;;;047A;;047A +047C;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER OMEGA TITLO;;;047D; +047D;CYRILLIC SMALL LETTER OMEGA WITH TITLO;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER OMEGA TITLO;;047C;;047C +047E;CYRILLIC CAPITAL LETTER OT;Lu;0;L;;;;;N;;;;047F; +047F;CYRILLIC SMALL LETTER OT;Ll;0;L;;;;;N;;;047E;;047E +0480;CYRILLIC CAPITAL LETTER KOPPA;Lu;0;L;;;;;N;;;;0481; +0481;CYRILLIC SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;0480;;0480 +0482;CYRILLIC THOUSANDS SIGN;So;0;L;;;;;N;;;;; +0483;COMBINING CYRILLIC TITLO;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING TITLO;;;; +0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;; +0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;; +0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;; +0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;; +0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +048A;CYRILLIC CAPITAL LETTER SHORT I WITH TAIL;Lu;0;L;;;;;N;;;;048B; +048B;CYRILLIC SMALL LETTER SHORT I WITH TAIL;Ll;0;L;;;;;N;;;048A;;048A +048C;CYRILLIC CAPITAL LETTER SEMISOFT SIGN;Lu;0;L;;;;;N;;;;048D; +048D;CYRILLIC SMALL LETTER SEMISOFT SIGN;Ll;0;L;;;;;N;;;048C;;048C +048E;CYRILLIC CAPITAL LETTER ER WITH TICK;Lu;0;L;;;;;N;;;;048F; +048F;CYRILLIC SMALL LETTER ER WITH TICK;Ll;0;L;;;;;N;;;048E;;048E +0490;CYRILLIC CAPITAL LETTER GHE WITH UPTURN;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE WITH UPTURN;;;0491; +0491;CYRILLIC SMALL LETTER GHE WITH UPTURN;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE WITH UPTURN;;0490;;0490 +0492;CYRILLIC CAPITAL LETTER GHE WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE BAR;;;0493; +0493;CYRILLIC SMALL LETTER GHE WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE BAR;;0492;;0492 +0494;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE HOOK;;;0495; +0495;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE HOOK;;0494;;0494 +0496;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER;;;0497; +0497;CYRILLIC SMALL LETTER ZHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER;;0496;;0496 +0498;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZE CEDILLA;;;0499; +0499;CYRILLIC SMALL LETTER ZE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZE CEDILLA;;0498;;0498 +049A;CYRILLIC CAPITAL LETTER KA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER;;;049B; +049B;CYRILLIC SMALL LETTER KA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER;;049A;;049A +049C;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA VERTICAL BAR;;;049D; +049D;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA VERTICAL BAR;;049C;;049C +049E;CYRILLIC CAPITAL LETTER KA WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA BAR;;;049F; +049F;CYRILLIC SMALL LETTER KA WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA BAR;;049E;;049E +04A0;CYRILLIC CAPITAL LETTER BASHKIR KA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED GE KA;;;04A1; +04A1;CYRILLIC SMALL LETTER BASHKIR KA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED GE KA;;04A0;;04A0 +04A2;CYRILLIC CAPITAL LETTER EN WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER;;;04A3; +04A3;CYRILLIC SMALL LETTER EN WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER;;04A2;;04A2 +04A4;CYRILLIC CAPITAL LIGATURE EN GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN GE;;;04A5; +04A5;CYRILLIC SMALL LIGATURE EN GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN GE;;04A4;;04A4 +04A6;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER PE HOOK;Abkhasian;;04A7; +04A7;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER PE HOOK;Abkhasian;04A6;;04A6 +04A8;CYRILLIC CAPITAL LETTER ABKHASIAN HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER O HOOK;;;04A9; +04A9;CYRILLIC SMALL LETTER ABKHASIAN HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER O HOOK;;04A8;;04A8 +04AA;CYRILLIC CAPITAL LETTER ES WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ES CEDILLA;;;04AB; +04AB;CYRILLIC SMALL LETTER ES WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ES CEDILLA;;04AA;;04AA +04AC;CYRILLIC CAPITAL LETTER TE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER;;;04AD; +04AD;CYRILLIC SMALL LETTER TE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER;;04AC;;04AC +04AE;CYRILLIC CAPITAL LETTER STRAIGHT U;Lu;0;L;;;;;N;;;;04AF; +04AF;CYRILLIC SMALL LETTER STRAIGHT U;Ll;0;L;;;;;N;;;04AE;;04AE +04B0;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER STRAIGHT U BAR;;;04B1; +04B1;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER STRAIGHT U BAR;;04B0;;04B0 +04B2;CYRILLIC CAPITAL LETTER HA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER;;;04B3; +04B3;CYRILLIC SMALL LETTER HA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER;;04B2;;04B2 +04B4;CYRILLIC CAPITAL LIGATURE TE TSE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE TSE;Abkhasian;;04B5; +04B5;CYRILLIC SMALL LIGATURE TE TSE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE TSE;Abkhasian;04B4;;04B4 +04B6;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER;;;04B7; +04B7;CYRILLIC SMALL LETTER CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER;;04B6;;04B6 +04B8;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE VERTICAL BAR;;;04B9; +04B9;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE VERTICAL BAR;;04B8;;04B8 +04BA;CYRILLIC CAPITAL LETTER SHHA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER H;;;04BB; +04BB;CYRILLIC SMALL LETTER SHHA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER H;;04BA;;04BA +04BC;CYRILLIC CAPITAL LETTER ABKHASIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK;;;04BD; +04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC +04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF; +04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE +04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;; +04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2; +04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1 +04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4; +04C4;CYRILLIC SMALL LETTER KA WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA HOOK;;04C3;;04C3 +04C5;CYRILLIC CAPITAL LETTER EL WITH TAIL;Lu;0;L;;;;;N;;;;04C6; +04C6;CYRILLIC SMALL LETTER EL WITH TAIL;Ll;0;L;;;;;N;;;04C5;;04C5 +04C7;CYRILLIC CAPITAL LETTER EN WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN HOOK;;;04C8; +04C8;CYRILLIC SMALL LETTER EN WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN HOOK;;04C7;;04C7 +04C9;CYRILLIC CAPITAL LETTER EN WITH TAIL;Lu;0;L;;;;;N;;;;04CA; +04CA;CYRILLIC SMALL LETTER EN WITH TAIL;Ll;0;L;;;;;N;;;04C9;;04C9 +04CB;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER;;;04CC; +04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB +04CD;CYRILLIC CAPITAL LETTER EM WITH TAIL;Lu;0;L;;;;;N;;;;04CE; +04CE;CYRILLIC SMALL LETTER EM WITH TAIL;Ll;0;L;;;;;N;;;04CD;;04CD +04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1; +04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0 +04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3; +04D3;CYRILLIC SMALL LETTER A WITH DIAERESIS;Ll;0;L;0430 0308;;;;N;;;04D2;;04D2 +04D4;CYRILLIC CAPITAL LIGATURE A IE;Lu;0;L;;;;;N;;;;04D5; +04D5;CYRILLIC SMALL LIGATURE A IE;Ll;0;L;;;;;N;;;04D4;;04D4 +04D6;CYRILLIC CAPITAL LETTER IE WITH BREVE;Lu;0;L;0415 0306;;;;N;;;;04D7; +04D7;CYRILLIC SMALL LETTER IE WITH BREVE;Ll;0;L;0435 0306;;;;N;;;04D6;;04D6 +04D8;CYRILLIC CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;04D9; +04D9;CYRILLIC SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;04D8;;04D8 +04DA;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS;Lu;0;L;04D8 0308;;;;N;;;;04DB; +04DB;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS;Ll;0;L;04D9 0308;;;;N;;;04DA;;04DA +04DC;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS;Lu;0;L;0416 0308;;;;N;;;;04DD; +04DD;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS;Ll;0;L;0436 0308;;;;N;;;04DC;;04DC +04DE;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS;Lu;0;L;0417 0308;;;;N;;;;04DF; +04DF;CYRILLIC SMALL LETTER ZE WITH DIAERESIS;Ll;0;L;0437 0308;;;;N;;;04DE;;04DE +04E0;CYRILLIC CAPITAL LETTER ABKHASIAN DZE;Lu;0;L;;;;;N;;;;04E1; +04E1;CYRILLIC SMALL LETTER ABKHASIAN DZE;Ll;0;L;;;;;N;;;04E0;;04E0 +04E2;CYRILLIC CAPITAL LETTER I WITH MACRON;Lu;0;L;0418 0304;;;;N;;;;04E3; +04E3;CYRILLIC SMALL LETTER I WITH MACRON;Ll;0;L;0438 0304;;;;N;;;04E2;;04E2 +04E4;CYRILLIC CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0418 0308;;;;N;;;;04E5; +04E5;CYRILLIC SMALL LETTER I WITH DIAERESIS;Ll;0;L;0438 0308;;;;N;;;04E4;;04E4 +04E6;CYRILLIC CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;041E 0308;;;;N;;;;04E7; +04E7;CYRILLIC SMALL LETTER O WITH DIAERESIS;Ll;0;L;043E 0308;;;;N;;;04E6;;04E6 +04E8;CYRILLIC CAPITAL LETTER BARRED O;Lu;0;L;;;;;N;;;;04E9; +04E9;CYRILLIC SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;04E8;;04E8 +04EA;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS;Lu;0;L;04E8 0308;;;;N;;;;04EB; +04EB;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS;Ll;0;L;04E9 0308;;;;N;;;04EA;;04EA +04EC;CYRILLIC CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;042D 0308;;;;N;;;;04ED; +04ED;CYRILLIC SMALL LETTER E WITH DIAERESIS;Ll;0;L;044D 0308;;;;N;;;04EC;;04EC +04EE;CYRILLIC CAPITAL LETTER U WITH MACRON;Lu;0;L;0423 0304;;;;N;;;;04EF; +04EF;CYRILLIC SMALL LETTER U WITH MACRON;Ll;0;L;0443 0304;;;;N;;;04EE;;04EE +04F0;CYRILLIC CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0423 0308;;;;N;;;;04F1; +04F1;CYRILLIC SMALL LETTER U WITH DIAERESIS;Ll;0;L;0443 0308;;;;N;;;04F0;;04F0 +04F2;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0423 030B;;;;N;;;;04F3; +04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2 +04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5; +04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4 +04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9; +04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8 +0500;CYRILLIC CAPITAL LETTER KOMI DE;Lu;0;L;;;;;N;;;;0501; +0501;CYRILLIC SMALL LETTER KOMI DE;Ll;0;L;;;;;N;;;0500;;0500 +0502;CYRILLIC CAPITAL LETTER KOMI DJE;Lu;0;L;;;;;N;;;;0503; +0503;CYRILLIC SMALL LETTER KOMI DJE;Ll;0;L;;;;;N;;;0502;;0502 +0504;CYRILLIC CAPITAL LETTER KOMI ZJE;Lu;0;L;;;;;N;;;;0505; +0505;CYRILLIC SMALL LETTER KOMI ZJE;Ll;0;L;;;;;N;;;0504;;0504 +0506;CYRILLIC CAPITAL LETTER KOMI DZJE;Lu;0;L;;;;;N;;;;0507; +0507;CYRILLIC SMALL LETTER KOMI DZJE;Ll;0;L;;;;;N;;;0506;;0506 +0508;CYRILLIC CAPITAL LETTER KOMI LJE;Lu;0;L;;;;;N;;;;0509; +0509;CYRILLIC SMALL LETTER KOMI LJE;Ll;0;L;;;;;N;;;0508;;0508 +050A;CYRILLIC CAPITAL LETTER KOMI NJE;Lu;0;L;;;;;N;;;;050B; +050B;CYRILLIC SMALL LETTER KOMI NJE;Ll;0;L;;;;;N;;;050A;;050A +050C;CYRILLIC CAPITAL LETTER KOMI SJE;Lu;0;L;;;;;N;;;;050D; +050D;CYRILLIC SMALL LETTER KOMI SJE;Ll;0;L;;;;;N;;;050C;;050C +050E;CYRILLIC CAPITAL LETTER KOMI TJE;Lu;0;L;;;;;N;;;;050F; +050F;CYRILLIC SMALL LETTER KOMI TJE;Ll;0;L;;;;;N;;;050E;;050E +0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561; +0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562; +0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563; +0534;ARMENIAN CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;0564; +0535;ARMENIAN CAPITAL LETTER ECH;Lu;0;L;;;;;N;;;;0565; +0536;ARMENIAN CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;0566; +0537;ARMENIAN CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;0567; +0538;ARMENIAN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;0568; +0539;ARMENIAN CAPITAL LETTER TO;Lu;0;L;;;;;N;;;;0569; +053A;ARMENIAN CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;056A; +053B;ARMENIAN CAPITAL LETTER INI;Lu;0;L;;;;;N;;;;056B; +053C;ARMENIAN CAPITAL LETTER LIWN;Lu;0;L;;;;;N;;;;056C; +053D;ARMENIAN CAPITAL LETTER XEH;Lu;0;L;;;;;N;;;;056D; +053E;ARMENIAN CAPITAL LETTER CA;Lu;0;L;;;;;N;;;;056E; +053F;ARMENIAN CAPITAL LETTER KEN;Lu;0;L;;;;;N;;;;056F; +0540;ARMENIAN CAPITAL LETTER HO;Lu;0;L;;;;;N;;;;0570; +0541;ARMENIAN CAPITAL LETTER JA;Lu;0;L;;;;;N;;;;0571; +0542;ARMENIAN CAPITAL LETTER GHAD;Lu;0;L;;;;;N;ARMENIAN CAPITAL LETTER LAD;;;0572; +0543;ARMENIAN CAPITAL LETTER CHEH;Lu;0;L;;;;;N;;;;0573; +0544;ARMENIAN CAPITAL LETTER MEN;Lu;0;L;;;;;N;;;;0574; +0545;ARMENIAN CAPITAL LETTER YI;Lu;0;L;;;;;N;;;;0575; +0546;ARMENIAN CAPITAL LETTER NOW;Lu;0;L;;;;;N;;;;0576; +0547;ARMENIAN CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0577; +0548;ARMENIAN CAPITAL LETTER VO;Lu;0;L;;;;;N;;;;0578; +0549;ARMENIAN CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;0579; +054A;ARMENIAN CAPITAL LETTER PEH;Lu;0;L;;;;;N;;;;057A; +054B;ARMENIAN CAPITAL LETTER JHEH;Lu;0;L;;;;;N;;;;057B; +054C;ARMENIAN CAPITAL LETTER RA;Lu;0;L;;;;;N;;;;057C; +054D;ARMENIAN CAPITAL LETTER SEH;Lu;0;L;;;;;N;;;;057D; +054E;ARMENIAN CAPITAL LETTER VEW;Lu;0;L;;;;;N;;;;057E; +054F;ARMENIAN CAPITAL LETTER TIWN;Lu;0;L;;;;;N;;;;057F; +0550;ARMENIAN CAPITAL LETTER REH;Lu;0;L;;;;;N;;;;0580; +0551;ARMENIAN CAPITAL LETTER CO;Lu;0;L;;;;;N;;;;0581; +0552;ARMENIAN CAPITAL LETTER YIWN;Lu;0;L;;;;;N;;;;0582; +0553;ARMENIAN CAPITAL LETTER PIWR;Lu;0;L;;;;;N;;;;0583; +0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584; +0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585; +0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586; +0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; +055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;; +055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;; +055C;ARMENIAN EXCLAMATION MARK;Po;0;L;;;;;N;;;;; +055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;; +055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;; +055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;; +0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531 +0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532 +0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533 +0564;ARMENIAN SMALL LETTER DA;Ll;0;L;;;;;N;;;0534;;0534 +0565;ARMENIAN SMALL LETTER ECH;Ll;0;L;;;;;N;;;0535;;0535 +0566;ARMENIAN SMALL LETTER ZA;Ll;0;L;;;;;N;;;0536;;0536 +0567;ARMENIAN SMALL LETTER EH;Ll;0;L;;;;;N;;;0537;;0537 +0568;ARMENIAN SMALL LETTER ET;Ll;0;L;;;;;N;;;0538;;0538 +0569;ARMENIAN SMALL LETTER TO;Ll;0;L;;;;;N;;;0539;;0539 +056A;ARMENIAN SMALL LETTER ZHE;Ll;0;L;;;;;N;;;053A;;053A +056B;ARMENIAN SMALL LETTER INI;Ll;0;L;;;;;N;;;053B;;053B +056C;ARMENIAN SMALL LETTER LIWN;Ll;0;L;;;;;N;;;053C;;053C +056D;ARMENIAN SMALL LETTER XEH;Ll;0;L;;;;;N;;;053D;;053D +056E;ARMENIAN SMALL LETTER CA;Ll;0;L;;;;;N;;;053E;;053E +056F;ARMENIAN SMALL LETTER KEN;Ll;0;L;;;;;N;;;053F;;053F +0570;ARMENIAN SMALL LETTER HO;Ll;0;L;;;;;N;;;0540;;0540 +0571;ARMENIAN SMALL LETTER JA;Ll;0;L;;;;;N;;;0541;;0541 +0572;ARMENIAN SMALL LETTER GHAD;Ll;0;L;;;;;N;ARMENIAN SMALL LETTER LAD;;0542;;0542 +0573;ARMENIAN SMALL LETTER CHEH;Ll;0;L;;;;;N;;;0543;;0543 +0574;ARMENIAN SMALL LETTER MEN;Ll;0;L;;;;;N;;;0544;;0544 +0575;ARMENIAN SMALL LETTER YI;Ll;0;L;;;;;N;;;0545;;0545 +0576;ARMENIAN SMALL LETTER NOW;Ll;0;L;;;;;N;;;0546;;0546 +0577;ARMENIAN SMALL LETTER SHA;Ll;0;L;;;;;N;;;0547;;0547 +0578;ARMENIAN SMALL LETTER VO;Ll;0;L;;;;;N;;;0548;;0548 +0579;ARMENIAN SMALL LETTER CHA;Ll;0;L;;;;;N;;;0549;;0549 +057A;ARMENIAN SMALL LETTER PEH;Ll;0;L;;;;;N;;;054A;;054A +057B;ARMENIAN SMALL LETTER JHEH;Ll;0;L;;;;;N;;;054B;;054B +057C;ARMENIAN SMALL LETTER RA;Ll;0;L;;;;;N;;;054C;;054C +057D;ARMENIAN SMALL LETTER SEH;Ll;0;L;;;;;N;;;054D;;054D +057E;ARMENIAN SMALL LETTER VEW;Ll;0;L;;;;;N;;;054E;;054E +057F;ARMENIAN SMALL LETTER TIWN;Ll;0;L;;;;;N;;;054F;;054F +0580;ARMENIAN SMALL LETTER REH;Ll;0;L;;;;;N;;;0550;;0550 +0581;ARMENIAN SMALL LETTER CO;Ll;0;L;;;;;N;;;0551;;0551 +0582;ARMENIAN SMALL LETTER YIWN;Ll;0;L;;;;;N;;;0552;;0552 +0583;ARMENIAN SMALL LETTER PIWR;Ll;0;L;;;;;N;;;0553;;0553 +0584;ARMENIAN SMALL LETTER KEH;Ll;0;L;;;;;N;;;0554;;0554 +0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555 +0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556 +0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L;<compat> 0565 0582;;;;N;;;;; +0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;; +058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;; +0591;HEBREW ACCENT ETNAHTA;Mn;220;NSM;;;;;N;;;;; +0592;HEBREW ACCENT SEGOL;Mn;230;NSM;;;;;N;;;;; +0593;HEBREW ACCENT SHALSHELET;Mn;230;NSM;;;;;N;;;;; +0594;HEBREW ACCENT ZAQEF QATAN;Mn;230;NSM;;;;;N;;;;; +0595;HEBREW ACCENT ZAQEF GADOL;Mn;230;NSM;;;;;N;;;;; +0596;HEBREW ACCENT TIPEHA;Mn;220;NSM;;;;;N;;*;;; +0597;HEBREW ACCENT REVIA;Mn;230;NSM;;;;;N;;;;; +0598;HEBREW ACCENT ZARQA;Mn;230;NSM;;;;;N;;*;;; +0599;HEBREW ACCENT PASHTA;Mn;230;NSM;;;;;N;;;;; +059A;HEBREW ACCENT YETIV;Mn;222;NSM;;;;;N;;;;; +059B;HEBREW ACCENT TEVIR;Mn;220;NSM;;;;;N;;;;; +059C;HEBREW ACCENT GERESH;Mn;230;NSM;;;;;N;;;;; +059D;HEBREW ACCENT GERESH MUQDAM;Mn;230;NSM;;;;;N;;;;; +059E;HEBREW ACCENT GERSHAYIM;Mn;230;NSM;;;;;N;;;;; +059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;; +05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;; +05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;; +05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;; +05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;; +05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;*;;; +05A6;HEBREW ACCENT MERKHA KEFULA;Mn;220;NSM;;;;;N;;;;; +05A7;HEBREW ACCENT DARGA;Mn;220;NSM;;;;;N;;;;; +05A8;HEBREW ACCENT QADMA;Mn;230;NSM;;;;;N;;*;;; +05A9;HEBREW ACCENT TELISHA QETANA;Mn;230;NSM;;;;;N;;;;; +05AA;HEBREW ACCENT YERAH BEN YOMO;Mn;220;NSM;;;;;N;;*;;; +05AB;HEBREW ACCENT OLE;Mn;230;NSM;;;;;N;;;;; +05AC;HEBREW ACCENT ILUY;Mn;230;NSM;;;;;N;;;;; +05AD;HEBREW ACCENT DEHI;Mn;222;NSM;;;;;N;;;;; +05AE;HEBREW ACCENT ZINOR;Mn;228;NSM;;;;;N;;;;; +05AF;HEBREW MARK MASORA CIRCLE;Mn;230;NSM;;;;;N;;;;; +05B0;HEBREW POINT SHEVA;Mn;10;NSM;;;;;N;;;;; +05B1;HEBREW POINT HATAF SEGOL;Mn;11;NSM;;;;;N;;;;; +05B2;HEBREW POINT HATAF PATAH;Mn;12;NSM;;;;;N;;;;; +05B3;HEBREW POINT HATAF QAMATS;Mn;13;NSM;;;;;N;;;;; +05B4;HEBREW POINT HIRIQ;Mn;14;NSM;;;;;N;;;;; +05B5;HEBREW POINT TSERE;Mn;15;NSM;;;;;N;;;;; +05B6;HEBREW POINT SEGOL;Mn;16;NSM;;;;;N;;;;; +05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;; +05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;; +05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;; +05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;; +05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;or shuruq;;; +05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;*;;; +05BE;HEBREW PUNCTUATION MAQAF;Po;0;R;;;;;N;;;;; +05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;; +05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;*;;; +05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;; +05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;; +05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;*;;; +05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;; +05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;; +05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;; +05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;; +05D3;HEBREW LETTER DALET;Lo;0;R;;;;;N;;;;; +05D4;HEBREW LETTER HE;Lo;0;R;;;;;N;;;;; +05D5;HEBREW LETTER VAV;Lo;0;R;;;;;N;;;;; +05D6;HEBREW LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +05D7;HEBREW LETTER HET;Lo;0;R;;;;;N;;;;; +05D8;HEBREW LETTER TET;Lo;0;R;;;;;N;;;;; +05D9;HEBREW LETTER YOD;Lo;0;R;;;;;N;;;;; +05DA;HEBREW LETTER FINAL KAF;Lo;0;R;;;;;N;;;;; +05DB;HEBREW LETTER KAF;Lo;0;R;;;;;N;;;;; +05DC;HEBREW LETTER LAMED;Lo;0;R;;;;;N;;;;; +05DD;HEBREW LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; +05DE;HEBREW LETTER MEM;Lo;0;R;;;;;N;;;;; +05DF;HEBREW LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +05E0;HEBREW LETTER NUN;Lo;0;R;;;;;N;;;;; +05E1;HEBREW LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +05E2;HEBREW LETTER AYIN;Lo;0;R;;;;;N;;;;; +05E3;HEBREW LETTER FINAL PE;Lo;0;R;;;;;N;;;;; +05E4;HEBREW LETTER PE;Lo;0;R;;;;;N;;;;; +05E5;HEBREW LETTER FINAL TSADI;Lo;0;R;;;;;N;;;;; +05E6;HEBREW LETTER TSADI;Lo;0;R;;;;;N;;;;; +05E7;HEBREW LETTER QOF;Lo;0;R;;;;;N;;;;; +05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;; +05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;; +05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;; +05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;; +05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;; +05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;; +05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;; +05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;; +060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;; +061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;; +061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;; +0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;; +0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;; +0623;ARABIC LETTER ALEF WITH HAMZA ABOVE;Lo;0;AL;0627 0654;;;;N;ARABIC LETTER HAMZAH ON ALEF;;;; +0624;ARABIC LETTER WAW WITH HAMZA ABOVE;Lo;0;AL;0648 0654;;;;N;ARABIC LETTER HAMZAH ON WAW;;;; +0625;ARABIC LETTER ALEF WITH HAMZA BELOW;Lo;0;AL;0627 0655;;;;N;ARABIC LETTER HAMZAH UNDER ALEF;;;; +0626;ARABIC LETTER YEH WITH HAMZA ABOVE;Lo;0;AL;064A 0654;;;;N;ARABIC LETTER HAMZAH ON YA;;;; +0627;ARABIC LETTER ALEF;Lo;0;AL;;;;;N;;;;; +0628;ARABIC LETTER BEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA;;;; +0629;ARABIC LETTER TEH MARBUTA;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH;;;; +062A;ARABIC LETTER TEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA;;;; +062B;ARABIC LETTER THEH;Lo;0;AL;;;;;N;ARABIC LETTER THAA;;;; +062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;; +062D;ARABIC LETTER HAH;Lo;0;AL;;;;;N;ARABIC LETTER HAA;;;; +062E;ARABIC LETTER KHAH;Lo;0;AL;;;;;N;ARABIC LETTER KHAA;;;; +062F;ARABIC LETTER DAL;Lo;0;AL;;;;;N;;;;; +0630;ARABIC LETTER THAL;Lo;0;AL;;;;;N;;;;; +0631;ARABIC LETTER REH;Lo;0;AL;;;;;N;ARABIC LETTER RA;;;; +0632;ARABIC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; +0633;ARABIC LETTER SEEN;Lo;0;AL;;;;;N;;;;; +0634;ARABIC LETTER SHEEN;Lo;0;AL;;;;;N;;;;; +0635;ARABIC LETTER SAD;Lo;0;AL;;;;;N;;;;; +0636;ARABIC LETTER DAD;Lo;0;AL;;;;;N;;;;; +0637;ARABIC LETTER TAH;Lo;0;AL;;;;;N;;;;; +0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;; +0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;; +063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;; +0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;; +0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;; +0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;; +0643;ARABIC LETTER KAF;Lo;0;AL;;;;;N;ARABIC LETTER CAF;;;; +0644;ARABIC LETTER LAM;Lo;0;AL;;;;;N;;;;; +0645;ARABIC LETTER MEEM;Lo;0;AL;;;;;N;;;;; +0646;ARABIC LETTER NOON;Lo;0;AL;;;;;N;;;;; +0647;ARABIC LETTER HEH;Lo;0;AL;;;;;N;ARABIC LETTER HA;;;; +0648;ARABIC LETTER WAW;Lo;0;AL;;;;;N;;;;; +0649;ARABIC LETTER ALEF MAKSURA;Lo;0;AL;;;;;N;ARABIC LETTER ALEF MAQSURAH;;;; +064A;ARABIC LETTER YEH;Lo;0;AL;;;;;N;ARABIC LETTER YA;;;; +064B;ARABIC FATHATAN;Mn;27;NSM;;;;;N;;;;; +064C;ARABIC DAMMATAN;Mn;28;NSM;;;;;N;;;;; +064D;ARABIC KASRATAN;Mn;29;NSM;;;;;N;;;;; +064E;ARABIC FATHA;Mn;30;NSM;;;;;N;ARABIC FATHAH;;;; +064F;ARABIC DAMMA;Mn;31;NSM;;;;;N;ARABIC DAMMAH;;;; +0650;ARABIC KASRA;Mn;32;NSM;;;;;N;ARABIC KASRAH;;;; +0651;ARABIC SHADDA;Mn;33;NSM;;;;;N;ARABIC SHADDAH;;;; +0652;ARABIC SUKUN;Mn;34;NSM;;;;;N;;;;; +0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;; +0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;; +0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; +0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;; +0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;; +0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;; +0663;ARABIC-INDIC DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;; +0664;ARABIC-INDIC DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;; +0665;ARABIC-INDIC DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;; +0666;ARABIC-INDIC DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;; +0667;ARABIC-INDIC DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;; +0668;ARABIC-INDIC DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;; +0669;ARABIC-INDIC DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;; +066A;ARABIC PERCENT SIGN;Po;0;ET;;;;;N;;;;; +066B;ARABIC DECIMAL SEPARATOR;Po;0;AN;;;;;N;;;;; +066C;ARABIC THOUSANDS SEPARATOR;Po;0;AN;;;;;N;;;;; +066D;ARABIC FIVE POINTED STAR;Po;0;AL;;;;;N;;;;; +066E;ARABIC LETTER DOTLESS BEH;Lo;0;AL;;;;;N;;;;; +066F;ARABIC LETTER DOTLESS QAF;Lo;0;AL;;;;;N;;;;; +0670;ARABIC LETTER SUPERSCRIPT ALEF;Mn;35;NSM;;;;;N;ARABIC ALEF ABOVE;;;; +0671;ARABIC LETTER ALEF WASLA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAT WASL ON ALEF;;;; +0672;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH ON ALEF;;;; +0673;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH UNDER ALEF;;;; +0674;ARABIC LETTER HIGH HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HIGH HAMZAH;;;; +0675;ARABIC LETTER HIGH HAMZA ALEF;Lo;0;AL;<compat> 0627 0674;;;;N;ARABIC LETTER HIGH HAMZAH ALEF;;;; +0676;ARABIC LETTER HIGH HAMZA WAW;Lo;0;AL;<compat> 0648 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW;;;; +0677;ARABIC LETTER U WITH HAMZA ABOVE;Lo;0;AL;<compat> 06C7 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH;;;; +0678;ARABIC LETTER HIGH HAMZA YEH;Lo;0;AL;<compat> 064A 0674;;;;N;ARABIC LETTER HIGH HAMZAH YA;;;; +0679;ARABIC LETTER TTEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH SMALL TAH;;;; +067A;ARABIC LETTER TTEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE;;;; +067B;ARABIC LETTER BEEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW;;;; +067C;ARABIC LETTER TEH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH RING;;;; +067D;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD;;;; +067E;ARABIC LETTER PEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS BELOW;;;; +067F;ARABIC LETTER TEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH FOUR DOTS ABOVE;;;; +0680;ARABIC LETTER BEHEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH FOUR DOTS BELOW;;;; +0681;ARABIC LETTER HAH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH ON HAA;;;; +0682;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE;;;; +0683;ARABIC LETTER NYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS;;;; +0684;ARABIC LETTER DYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL;;;; +0685;ARABIC LETTER HAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH THREE DOTS ABOVE;;;; +0686;ARABIC LETTER TCHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD;;;; +0687;ARABIC LETTER TCHEHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE FOUR DOTS;;;; +0688;ARABIC LETTER DDAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH SMALL TAH;;;; +0689;ARABIC LETTER DAL WITH RING;Lo;0;AL;;;;;N;;;;; +068A;ARABIC LETTER DAL WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +068B;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; +068C;ARABIC LETTER DAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS ABOVE;;;; +068D;ARABIC LETTER DDAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS BELOW;;;; +068E;ARABIC LETTER DUL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE;;;; +068F;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD;;;; +0690;ARABIC LETTER DAL WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0691;ARABIC LETTER RREH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL TAH;;;; +0692;ARABIC LETTER REH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V;;;; +0693;ARABIC LETTER REH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH RING;;;; +0694;ARABIC LETTER REH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW;;;; +0695;ARABIC LETTER REH WITH SMALL V BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V BELOW;;;; +0696;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE;;;; +0697;ARABIC LETTER REH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH TWO DOTS ABOVE;;;; +0698;ARABIC LETTER JEH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH THREE DOTS ABOVE;;;; +0699;ARABIC LETTER REH WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH FOUR DOTS ABOVE;;;; +069A;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +069B;ARABIC LETTER SEEN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +069C;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +069D;ARABIC LETTER SAD WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +069E;ARABIC LETTER SAD WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +069F;ARABIC LETTER TAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A0;ARABIC LETTER AIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A1;ARABIC LETTER DOTLESS FEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS FA;;;; +06A2;ARABIC LETTER FEH WITH DOT MOVED BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT MOVED BELOW;;;; +06A3;ARABIC LETTER FEH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT BELOW;;;; +06A4;ARABIC LETTER VEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS ABOVE;;;; +06A5;ARABIC LETTER FEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS BELOW;;;; +06A6;ARABIC LETTER PEHEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH FOUR DOTS ABOVE;;;; +06A7;ARABIC LETTER QAF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06A8;ARABIC LETTER QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A9;ARABIC LETTER KEHEH;Lo;0;AL;;;;;N;ARABIC LETTER OPEN CAF;;;; +06AA;ARABIC LETTER SWASH KAF;Lo;0;AL;;;;;N;ARABIC LETTER SWASH CAF;;;; +06AB;ARABIC LETTER KAF WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH RING;;;; +06AC;ARABIC LETTER KAF WITH DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH DOT ABOVE;;;; +06AD;ARABIC LETTER NG;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS ABOVE;;;; +06AE;ARABIC LETTER KAF WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS BELOW;;;; +06AF;ARABIC LETTER GAF;Lo;0;AL;;;;;N;;*;;; +06B0;ARABIC LETTER GAF WITH RING;Lo;0;AL;;;;;N;;;;; +06B1;ARABIC LETTER NGOEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS ABOVE;;;; +06B2;ARABIC LETTER GAF WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +06B3;ARABIC LETTER GUEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW;;;; +06B4;ARABIC LETTER GAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06B5;ARABIC LETTER LAM WITH SMALL V;Lo;0;AL;;;;;N;;;;; +06B6;ARABIC LETTER LAM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06B7;ARABIC LETTER LAM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06B8;ARABIC LETTER LAM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +06B9;ARABIC LETTER NOON WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06BA;ARABIC LETTER NOON GHUNNA;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON;;;; +06BB;ARABIC LETTER RNOON;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON WITH SMALL TAH;;;; +06BC;ARABIC LETTER NOON WITH RING;Lo;0;AL;;;;;N;;;;; +06BD;ARABIC LETTER NOON WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06BE;ARABIC LETTER HEH DOACHASHMEE;Lo;0;AL;;;;;N;ARABIC LETTER KNOTTED HA;;;; +06BF;ARABIC LETTER TCHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06C0;ARABIC LETTER HEH WITH YEH ABOVE;Lo;0;AL;06D5 0654;;;;N;ARABIC LETTER HAMZAH ON HA;;;; +06C1;ARABIC LETTER HEH GOAL;Lo;0;AL;;;;;N;ARABIC LETTER HA GOAL;;;; +06C2;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE;Lo;0;AL;06C1 0654;;;;N;ARABIC LETTER HAMZAH ON HA GOAL;;;; +06C3;ARABIC LETTER TEH MARBUTA GOAL;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH GOAL;;;; +06C4;ARABIC LETTER WAW WITH RING;Lo;0;AL;;;;;N;;;;; +06C5;ARABIC LETTER KIRGHIZ OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH BAR;;;; +06C6;ARABIC LETTER OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH SMALL V;;;; +06C7;ARABIC LETTER U;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH DAMMAH;;;; +06C8;ARABIC LETTER YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH ALEF ABOVE;;;; +06C9;ARABIC LETTER KIRGHIZ YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH INVERTED SMALL V;;;; +06CA;ARABIC LETTER WAW WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06CB;ARABIC LETTER VE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH THREE DOTS ABOVE;;;; +06CC;ARABIC LETTER FARSI YEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS YA;;;; +06CD;ARABIC LETTER YEH WITH TAIL;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TAIL;;;; +06CE;ARABIC LETTER YEH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH SMALL V;;;; +06CF;ARABIC LETTER WAW WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06D0;ARABIC LETTER E;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW;*;;; +06D1;ARABIC LETTER YEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH THREE DOTS BELOW;;;; +06D2;ARABIC LETTER YEH BARREE;Lo;0;AL;;;;;N;ARABIC LETTER YA BARREE;;;; +06D3;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE;Lo;0;AL;06D2 0654;;;;N;ARABIC LETTER HAMZAH ON YA BARREE;;;; +06D4;ARABIC FULL STOP;Po;0;AL;;;;;N;ARABIC PERIOD;;;; +06D5;ARABIC LETTER AE;Lo;0;AL;;;;;N;;;;; +06D6;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; +06D7;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; +06D8;ARABIC SMALL HIGH MEEM INITIAL FORM;Mn;230;NSM;;;;;N;;;;; +06D9;ARABIC SMALL HIGH LAM ALEF;Mn;230;NSM;;;;;N;;;;; +06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;; +06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;; +06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;; +06DD;ARABIC END OF AYAH;Cf;0;AL;;;;;N;;;;; +06DE;ARABIC START OF RUB EL HIZB;Me;0;NSM;;;;;N;;;;; +06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;; +06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;; +06E1;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH;Mn;230;NSM;;;;;N;;;;; +06E2;ARABIC SMALL HIGH MEEM ISOLATED FORM;Mn;230;NSM;;;;;N;;;;; +06E3;ARABIC SMALL LOW SEEN;Mn;220;NSM;;;;;N;;;;; +06E4;ARABIC SMALL HIGH MADDA;Mn;230;NSM;;;;;N;;;;; +06E5;ARABIC SMALL WAW;Lm;0;AL;;;;;N;;;;; +06E6;ARABIC SMALL YEH;Lm;0;AL;;;;;N;;;;; +06E7;ARABIC SMALL HIGH YEH;Mn;230;NSM;;;;;N;;;;; +06E8;ARABIC SMALL HIGH NOON;Mn;230;NSM;;;;;N;;;;; +06E9;ARABIC PLACE OF SAJDAH;So;0;ON;;;;;N;;;;; +06EA;ARABIC EMPTY CENTRE LOW STOP;Mn;220;NSM;;;;;N;;;;; +06EB;ARABIC EMPTY CENTRE HIGH STOP;Mn;230;NSM;;;;;N;;;;; +06EC;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE;Mn;230;NSM;;;;;N;;;;; +06ED;ARABIC SMALL LOW MEEM;Mn;220;NSM;;;;;N;;;;; +06F0;EXTENDED ARABIC-INDIC DIGIT ZERO;Nd;0;EN;;0;0;0;N;EASTERN ARABIC-INDIC DIGIT ZERO;;;; +06F1;EXTENDED ARABIC-INDIC DIGIT ONE;Nd;0;EN;;1;1;1;N;EASTERN ARABIC-INDIC DIGIT ONE;;;; +06F2;EXTENDED ARABIC-INDIC DIGIT TWO;Nd;0;EN;;2;2;2;N;EASTERN ARABIC-INDIC DIGIT TWO;;;; +06F3;EXTENDED ARABIC-INDIC DIGIT THREE;Nd;0;EN;;3;3;3;N;EASTERN ARABIC-INDIC DIGIT THREE;;;; +06F4;EXTENDED ARABIC-INDIC DIGIT FOUR;Nd;0;EN;;4;4;4;N;EASTERN ARABIC-INDIC DIGIT FOUR;;;; +06F5;EXTENDED ARABIC-INDIC DIGIT FIVE;Nd;0;EN;;5;5;5;N;EASTERN ARABIC-INDIC DIGIT FIVE;;;; +06F6;EXTENDED ARABIC-INDIC DIGIT SIX;Nd;0;EN;;6;6;6;N;EASTERN ARABIC-INDIC DIGIT SIX;;;; +06F7;EXTENDED ARABIC-INDIC DIGIT SEVEN;Nd;0;EN;;7;7;7;N;EASTERN ARABIC-INDIC DIGIT SEVEN;;;; +06F8;EXTENDED ARABIC-INDIC DIGIT EIGHT;Nd;0;EN;;8;8;8;N;EASTERN ARABIC-INDIC DIGIT EIGHT;;;; +06F9;EXTENDED ARABIC-INDIC DIGIT NINE;Nd;0;EN;;9;9;9;N;EASTERN ARABIC-INDIC DIGIT NINE;;;; +06FA;ARABIC LETTER SHEEN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FB;ARABIC LETTER DAD WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FC;ARABIC LETTER GHAIN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FD;ARABIC SIGN SINDHI AMPERSAND;So;0;AL;;;;;N;;;;; +06FE;ARABIC SIGN SINDHI POSTPOSITION MEN;So;0;AL;;;;;N;;;;; +0700;SYRIAC END OF PARAGRAPH;Po;0;AL;;;;;N;;;;; +0701;SYRIAC SUPRALINEAR FULL STOP;Po;0;AL;;;;;N;;;;; +0702;SYRIAC SUBLINEAR FULL STOP;Po;0;AL;;;;;N;;;;; +0703;SYRIAC SUPRALINEAR COLON;Po;0;AL;;;;;N;;;;; +0704;SYRIAC SUBLINEAR COLON;Po;0;AL;;;;;N;;;;; +0705;SYRIAC HORIZONTAL COLON;Po;0;AL;;;;;N;;;;; +0706;SYRIAC COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; +0707;SYRIAC COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; +0708;SYRIAC SUPRALINEAR COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; +0709;SYRIAC SUBLINEAR COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; +070A;SYRIAC CONTRACTION;Po;0;AL;;;;;N;;;;; +070B;SYRIAC HARKLEAN OBELUS;Po;0;AL;;;;;N;;;;; +070C;SYRIAC HARKLEAN METOBELUS;Po;0;AL;;;;;N;;;;; +070D;SYRIAC HARKLEAN ASTERISCUS;Po;0;AL;;;;;N;;;;; +070F;SYRIAC ABBREVIATION MARK;Cf;0;BN;;;;;N;;;;; +0710;SYRIAC LETTER ALAPH;Lo;0;AL;;;;;N;;;;; +0711;SYRIAC LETTER SUPERSCRIPT ALAPH;Mn;36;NSM;;;;;N;;;;; +0712;SYRIAC LETTER BETH;Lo;0;AL;;;;;N;;;;; +0713;SYRIAC LETTER GAMAL;Lo;0;AL;;;;;N;;;;; +0714;SYRIAC LETTER GAMAL GARSHUNI;Lo;0;AL;;;;;N;;;;; +0715;SYRIAC LETTER DALATH;Lo;0;AL;;;;;N;;;;; +0716;SYRIAC LETTER DOTLESS DALATH RISH;Lo;0;AL;;;;;N;;;;; +0717;SYRIAC LETTER HE;Lo;0;AL;;;;;N;;;;; +0718;SYRIAC LETTER WAW;Lo;0;AL;;;;;N;;;;; +0719;SYRIAC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; +071A;SYRIAC LETTER HETH;Lo;0;AL;;;;;N;;;;; +071B;SYRIAC LETTER TETH;Lo;0;AL;;;;;N;;;;; +071C;SYRIAC LETTER TETH GARSHUNI;Lo;0;AL;;;;;N;;;;; +071D;SYRIAC LETTER YUDH;Lo;0;AL;;;;;N;;;;; +071E;SYRIAC LETTER YUDH HE;Lo;0;AL;;;;;N;;;;; +071F;SYRIAC LETTER KAPH;Lo;0;AL;;;;;N;;;;; +0720;SYRIAC LETTER LAMADH;Lo;0;AL;;;;;N;;;;; +0721;SYRIAC LETTER MIM;Lo;0;AL;;;;;N;;;;; +0722;SYRIAC LETTER NUN;Lo;0;AL;;;;;N;;;;; +0723;SYRIAC LETTER SEMKATH;Lo;0;AL;;;;;N;;;;; +0724;SYRIAC LETTER FINAL SEMKATH;Lo;0;AL;;;;;N;;;;; +0725;SYRIAC LETTER E;Lo;0;AL;;;;;N;;;;; +0726;SYRIAC LETTER PE;Lo;0;AL;;;;;N;;;;; +0727;SYRIAC LETTER REVERSED PE;Lo;0;AL;;;;;N;;;;; +0728;SYRIAC LETTER SADHE;Lo;0;AL;;;;;N;;;;; +0729;SYRIAC LETTER QAPH;Lo;0;AL;;;;;N;;;;; +072A;SYRIAC LETTER RISH;Lo;0;AL;;;;;N;;;;; +072B;SYRIAC LETTER SHIN;Lo;0;AL;;;;;N;;;;; +072C;SYRIAC LETTER TAW;Lo;0;AL;;;;;N;;;;; +0730;SYRIAC PTHAHA ABOVE;Mn;230;NSM;;;;;N;;;;; +0731;SYRIAC PTHAHA BELOW;Mn;220;NSM;;;;;N;;;;; +0732;SYRIAC PTHAHA DOTTED;Mn;230;NSM;;;;;N;;;;; +0733;SYRIAC ZQAPHA ABOVE;Mn;230;NSM;;;;;N;;;;; +0734;SYRIAC ZQAPHA BELOW;Mn;220;NSM;;;;;N;;;;; +0735;SYRIAC ZQAPHA DOTTED;Mn;230;NSM;;;;;N;;;;; +0736;SYRIAC RBASA ABOVE;Mn;230;NSM;;;;;N;;;;; +0737;SYRIAC RBASA BELOW;Mn;220;NSM;;;;;N;;;;; +0738;SYRIAC DOTTED ZLAMA HORIZONTAL;Mn;220;NSM;;;;;N;;;;; +0739;SYRIAC DOTTED ZLAMA ANGULAR;Mn;220;NSM;;;;;N;;;;; +073A;SYRIAC HBASA ABOVE;Mn;230;NSM;;;;;N;;;;; +073B;SYRIAC HBASA BELOW;Mn;220;NSM;;;;;N;;;;; +073C;SYRIAC HBASA-ESASA DOTTED;Mn;220;NSM;;;;;N;;;;; +073D;SYRIAC ESASA ABOVE;Mn;230;NSM;;;;;N;;;;; +073E;SYRIAC ESASA BELOW;Mn;220;NSM;;;;;N;;;;; +073F;SYRIAC RWAHA;Mn;230;NSM;;;;;N;;;;; +0740;SYRIAC FEMININE DOT;Mn;230;NSM;;;;;N;;;;; +0741;SYRIAC QUSHSHAYA;Mn;230;NSM;;;;;N;;;;; +0742;SYRIAC RUKKAKHA;Mn;220;NSM;;;;;N;;;;; +0743;SYRIAC TWO VERTICAL DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +0744;SYRIAC TWO VERTICAL DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +0745;SYRIAC THREE DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +0746;SYRIAC THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +0747;SYRIAC OBLIQUE LINE ABOVE;Mn;230;NSM;;;;;N;;;;; +0748;SYRIAC OBLIQUE LINE BELOW;Mn;220;NSM;;;;;N;;;;; +0749;SYRIAC MUSIC;Mn;230;NSM;;;;;N;;;;; +074A;SYRIAC BARREKH;Mn;230;NSM;;;;;N;;;;; +0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;; +0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;; +0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;; +0783;THAANA LETTER RAA;Lo;0;AL;;;;;N;;;;; +0784;THAANA LETTER BAA;Lo;0;AL;;;;;N;;;;; +0785;THAANA LETTER LHAVIYANI;Lo;0;AL;;;;;N;;;;; +0786;THAANA LETTER KAAFU;Lo;0;AL;;;;;N;;;;; +0787;THAANA LETTER ALIFU;Lo;0;AL;;;;;N;;;;; +0788;THAANA LETTER VAAVU;Lo;0;AL;;;;;N;;;;; +0789;THAANA LETTER MEEMU;Lo;0;AL;;;;;N;;;;; +078A;THAANA LETTER FAAFU;Lo;0;AL;;;;;N;;;;; +078B;THAANA LETTER DHAALU;Lo;0;AL;;;;;N;;;;; +078C;THAANA LETTER THAA;Lo;0;AL;;;;;N;;;;; +078D;THAANA LETTER LAAMU;Lo;0;AL;;;;;N;;;;; +078E;THAANA LETTER GAAFU;Lo;0;AL;;;;;N;;;;; +078F;THAANA LETTER GNAVIYANI;Lo;0;AL;;;;;N;;;;; +0790;THAANA LETTER SEENU;Lo;0;AL;;;;;N;;;;; +0791;THAANA LETTER DAVIYANI;Lo;0;AL;;;;;N;;;;; +0792;THAANA LETTER ZAVIYANI;Lo;0;AL;;;;;N;;;;; +0793;THAANA LETTER TAVIYANI;Lo;0;AL;;;;;N;;;;; +0794;THAANA LETTER YAA;Lo;0;AL;;;;;N;;;;; +0795;THAANA LETTER PAVIYANI;Lo;0;AL;;;;;N;;;;; +0796;THAANA LETTER JAVIYANI;Lo;0;AL;;;;;N;;;;; +0797;THAANA LETTER CHAVIYANI;Lo;0;AL;;;;;N;;;;; +0798;THAANA LETTER TTAA;Lo;0;AL;;;;;N;;;;; +0799;THAANA LETTER HHAA;Lo;0;AL;;;;;N;;;;; +079A;THAANA LETTER KHAA;Lo;0;AL;;;;;N;;;;; +079B;THAANA LETTER THAALU;Lo;0;AL;;;;;N;;;;; +079C;THAANA LETTER ZAA;Lo;0;AL;;;;;N;;;;; +079D;THAANA LETTER SHEENU;Lo;0;AL;;;;;N;;;;; +079E;THAANA LETTER SAADHU;Lo;0;AL;;;;;N;;;;; +079F;THAANA LETTER DAADHU;Lo;0;AL;;;;;N;;;;; +07A0;THAANA LETTER TO;Lo;0;AL;;;;;N;;;;; +07A1;THAANA LETTER ZO;Lo;0;AL;;;;;N;;;;; +07A2;THAANA LETTER AINU;Lo;0;AL;;;;;N;;;;; +07A3;THAANA LETTER GHAINU;Lo;0;AL;;;;;N;;;;; +07A4;THAANA LETTER QAAFU;Lo;0;AL;;;;;N;;;;; +07A5;THAANA LETTER WAAVU;Lo;0;AL;;;;;N;;;;; +07A6;THAANA ABAFILI;Mn;0;NSM;;;;;N;;;;; +07A7;THAANA AABAAFILI;Mn;0;NSM;;;;;N;;;;; +07A8;THAANA IBIFILI;Mn;0;NSM;;;;;N;;;;; +07A9;THAANA EEBEEFILI;Mn;0;NSM;;;;;N;;;;; +07AA;THAANA UBUFILI;Mn;0;NSM;;;;;N;;;;; +07AB;THAANA OOBOOFILI;Mn;0;NSM;;;;;N;;;;; +07AC;THAANA EBEFILI;Mn;0;NSM;;;;;N;;;;; +07AD;THAANA EYBEYFILI;Mn;0;NSM;;;;;N;;;;; +07AE;THAANA OBOFILI;Mn;0;NSM;;;;;N;;;;; +07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;; +07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;; +07B1;THAANA LETTER NAA;Lo;0;AL;;;;;N;;;;; +0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0905;DEVANAGARI LETTER A;Lo;0;L;;;;;N;;;;; +0906;DEVANAGARI LETTER AA;Lo;0;L;;;;;N;;;;; +0907;DEVANAGARI LETTER I;Lo;0;L;;;;;N;;;;; +0908;DEVANAGARI LETTER II;Lo;0;L;;;;;N;;;;; +0909;DEVANAGARI LETTER U;Lo;0;L;;;;;N;;;;; +090A;DEVANAGARI LETTER UU;Lo;0;L;;;;;N;;;;; +090B;DEVANAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +090C;DEVANAGARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +090D;DEVANAGARI LETTER CANDRA E;Lo;0;L;;;;;N;;;;; +090E;DEVANAGARI LETTER SHORT E;Lo;0;L;;;;;N;;;;; +090F;DEVANAGARI LETTER E;Lo;0;L;;;;;N;;;;; +0910;DEVANAGARI LETTER AI;Lo;0;L;;;;;N;;;;; +0911;DEVANAGARI LETTER CANDRA O;Lo;0;L;;;;;N;;;;; +0912;DEVANAGARI LETTER SHORT O;Lo;0;L;;;;;N;;;;; +0913;DEVANAGARI LETTER O;Lo;0;L;;;;;N;;;;; +0914;DEVANAGARI LETTER AU;Lo;0;L;;;;;N;;;;; +0915;DEVANAGARI LETTER KA;Lo;0;L;;;;;N;;;;; +0916;DEVANAGARI LETTER KHA;Lo;0;L;;;;;N;;;;; +0917;DEVANAGARI LETTER GA;Lo;0;L;;;;;N;;;;; +0918;DEVANAGARI LETTER GHA;Lo;0;L;;;;;N;;;;; +0919;DEVANAGARI LETTER NGA;Lo;0;L;;;;;N;;;;; +091A;DEVANAGARI LETTER CA;Lo;0;L;;;;;N;;;;; +091B;DEVANAGARI LETTER CHA;Lo;0;L;;;;;N;;;;; +091C;DEVANAGARI LETTER JA;Lo;0;L;;;;;N;;;;; +091D;DEVANAGARI LETTER JHA;Lo;0;L;;;;;N;;;;; +091E;DEVANAGARI LETTER NYA;Lo;0;L;;;;;N;;;;; +091F;DEVANAGARI LETTER TTA;Lo;0;L;;;;;N;;;;; +0920;DEVANAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0921;DEVANAGARI LETTER DDA;Lo;0;L;;;;;N;;;;; +0922;DEVANAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0923;DEVANAGARI LETTER NNA;Lo;0;L;;;;;N;;;;; +0924;DEVANAGARI LETTER TA;Lo;0;L;;;;;N;;;;; +0925;DEVANAGARI LETTER THA;Lo;0;L;;;;;N;;;;; +0926;DEVANAGARI LETTER DA;Lo;0;L;;;;;N;;;;; +0927;DEVANAGARI LETTER DHA;Lo;0;L;;;;;N;;;;; +0928;DEVANAGARI LETTER NA;Lo;0;L;;;;;N;;;;; +0929;DEVANAGARI LETTER NNNA;Lo;0;L;0928 093C;;;;N;;;;; +092A;DEVANAGARI LETTER PA;Lo;0;L;;;;;N;;;;; +092B;DEVANAGARI LETTER PHA;Lo;0;L;;;;;N;;;;; +092C;DEVANAGARI LETTER BA;Lo;0;L;;;;;N;;;;; +092D;DEVANAGARI LETTER BHA;Lo;0;L;;;;;N;;;;; +092E;DEVANAGARI LETTER MA;Lo;0;L;;;;;N;;;;; +092F;DEVANAGARI LETTER YA;Lo;0;L;;;;;N;;;;; +0930;DEVANAGARI LETTER RA;Lo;0;L;;;;;N;;;;; +0931;DEVANAGARI LETTER RRA;Lo;0;L;0930 093C;;;;N;;;;; +0932;DEVANAGARI LETTER LA;Lo;0;L;;;;;N;;;;; +0933;DEVANAGARI LETTER LLA;Lo;0;L;;;;;N;;;;; +0934;DEVANAGARI LETTER LLLA;Lo;0;L;0933 093C;;;;N;;;;; +0935;DEVANAGARI LETTER VA;Lo;0;L;;;;;N;;;;; +0936;DEVANAGARI LETTER SHA;Lo;0;L;;;;;N;;;;; +0937;DEVANAGARI LETTER SSA;Lo;0;L;;;;;N;;;;; +0938;DEVANAGARI LETTER SA;Lo;0;L;;;;;N;;;;; +0939;DEVANAGARI LETTER HA;Lo;0;L;;;;;N;;;;; +093C;DEVANAGARI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +093D;DEVANAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +093E;DEVANAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +093F;DEVANAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0940;DEVANAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0941;DEVANAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0942;DEVANAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0943;DEVANAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0944;DEVANAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0945;DEVANAGARI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; +0946;DEVANAGARI VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; +0947;DEVANAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0948;DEVANAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0949;DEVANAGARI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; +094A;DEVANAGARI VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; +094B;DEVANAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +094C;DEVANAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +094D;DEVANAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0950;DEVANAGARI OM;Lo;0;L;;;;;N;;;;; +0951;DEVANAGARI STRESS SIGN UDATTA;Mn;230;NSM;;;;;N;;;;; +0952;DEVANAGARI STRESS SIGN ANUDATTA;Mn;220;NSM;;;;;N;;;;; +0953;DEVANAGARI GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; +0954;DEVANAGARI ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; +0958;DEVANAGARI LETTER QA;Lo;0;L;0915 093C;;;;N;;;;; +0959;DEVANAGARI LETTER KHHA;Lo;0;L;0916 093C;;;;N;;;;; +095A;DEVANAGARI LETTER GHHA;Lo;0;L;0917 093C;;;;N;;;;; +095B;DEVANAGARI LETTER ZA;Lo;0;L;091C 093C;;;;N;;;;; +095C;DEVANAGARI LETTER DDDHA;Lo;0;L;0921 093C;;;;N;;;;; +095D;DEVANAGARI LETTER RHA;Lo;0;L;0922 093C;;;;N;;;;; +095E;DEVANAGARI LETTER FA;Lo;0;L;092B 093C;;;;N;;;;; +095F;DEVANAGARI LETTER YYA;Lo;0;L;092F 093C;;;;N;;;;; +0960;DEVANAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0961;DEVANAGARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0962;DEVANAGARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0963;DEVANAGARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0964;DEVANAGARI DANDA;Po;0;L;;;;;N;;;;; +0965;DEVANAGARI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +0966;DEVANAGARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0967;DEVANAGARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0968;DEVANAGARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0969;DEVANAGARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +096A;DEVANAGARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +096B;DEVANAGARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +096C;DEVANAGARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +096D;DEVANAGARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0985;BENGALI LETTER A;Lo;0;L;;;;;N;;;;; +0986;BENGALI LETTER AA;Lo;0;L;;;;;N;;;;; +0987;BENGALI LETTER I;Lo;0;L;;;;;N;;;;; +0988;BENGALI LETTER II;Lo;0;L;;;;;N;;;;; +0989;BENGALI LETTER U;Lo;0;L;;;;;N;;;;; +098A;BENGALI LETTER UU;Lo;0;L;;;;;N;;;;; +098B;BENGALI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +098C;BENGALI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +098F;BENGALI LETTER E;Lo;0;L;;;;;N;;;;; +0990;BENGALI LETTER AI;Lo;0;L;;;;;N;;;;; +0993;BENGALI LETTER O;Lo;0;L;;;;;N;;;;; +0994;BENGALI LETTER AU;Lo;0;L;;;;;N;;;;; +0995;BENGALI LETTER KA;Lo;0;L;;;;;N;;;;; +0996;BENGALI LETTER KHA;Lo;0;L;;;;;N;;;;; +0997;BENGALI LETTER GA;Lo;0;L;;;;;N;;;;; +0998;BENGALI LETTER GHA;Lo;0;L;;;;;N;;;;; +0999;BENGALI LETTER NGA;Lo;0;L;;;;;N;;;;; +099A;BENGALI LETTER CA;Lo;0;L;;;;;N;;;;; +099B;BENGALI LETTER CHA;Lo;0;L;;;;;N;;;;; +099C;BENGALI LETTER JA;Lo;0;L;;;;;N;;;;; +099D;BENGALI LETTER JHA;Lo;0;L;;;;;N;;;;; +099E;BENGALI LETTER NYA;Lo;0;L;;;;;N;;;;; +099F;BENGALI LETTER TTA;Lo;0;L;;;;;N;;;;; +09A0;BENGALI LETTER TTHA;Lo;0;L;;;;;N;;;;; +09A1;BENGALI LETTER DDA;Lo;0;L;;;;;N;;;;; +09A2;BENGALI LETTER DDHA;Lo;0;L;;;;;N;;;;; +09A3;BENGALI LETTER NNA;Lo;0;L;;;;;N;;;;; +09A4;BENGALI LETTER TA;Lo;0;L;;;;;N;;;;; +09A5;BENGALI LETTER THA;Lo;0;L;;;;;N;;;;; +09A6;BENGALI LETTER DA;Lo;0;L;;;;;N;;;;; +09A7;BENGALI LETTER DHA;Lo;0;L;;;;;N;;;;; +09A8;BENGALI LETTER NA;Lo;0;L;;;;;N;;;;; +09AA;BENGALI LETTER PA;Lo;0;L;;;;;N;;;;; +09AB;BENGALI LETTER PHA;Lo;0;L;;;;;N;;;;; +09AC;BENGALI LETTER BA;Lo;0;L;;;;;N;;;;; +09AD;BENGALI LETTER BHA;Lo;0;L;;;;;N;;;;; +09AE;BENGALI LETTER MA;Lo;0;L;;;;;N;;;;; +09AF;BENGALI LETTER YA;Lo;0;L;;;;;N;;;;; +09B0;BENGALI LETTER RA;Lo;0;L;;;;;N;;;;; +09B2;BENGALI LETTER LA;Lo;0;L;;;;;N;;;;; +09B6;BENGALI LETTER SHA;Lo;0;L;;;;;N;;;;; +09B7;BENGALI LETTER SSA;Lo;0;L;;;;;N;;;;; +09B8;BENGALI LETTER SA;Lo;0;L;;;;;N;;;;; +09B9;BENGALI LETTER HA;Lo;0;L;;;;;N;;;;; +09BC;BENGALI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +09BE;BENGALI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +09BF;BENGALI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +09C0;BENGALI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +09C1;BENGALI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +09C2;BENGALI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +09C3;BENGALI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +09C4;BENGALI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +09C7;BENGALI VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +09C8;BENGALI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;; +09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;; +09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;; +09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;; +09DF;BENGALI LETTER YYA;Lo;0;L;09AF 09BC;;;;N;;;;; +09E0;BENGALI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +09E1;BENGALI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +09E2;BENGALI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +09E3;BENGALI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +09E6;BENGALI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +09E7;BENGALI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +09E8;BENGALI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +09E9;BENGALI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +09EA;BENGALI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +09EB;BENGALI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +09EC;BENGALI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +09ED;BENGALI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +09EE;BENGALI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +09EF;BENGALI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +09F0;BENGALI LETTER RA WITH MIDDLE DIAGONAL;Lo;0;L;;;;;N;;Assamese;;; +09F1;BENGALI LETTER RA WITH LOWER DIAGONAL;Lo;0;L;;;;;N;BENGALI LETTER VA WITH LOWER DIAGONAL;Assamese;;; +09F2;BENGALI RUPEE MARK;Sc;0;ET;;;;;N;;;;; +09F3;BENGALI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +09F4;BENGALI CURRENCY NUMERATOR ONE;No;0;L;;;;1;N;;;;; +09F5;BENGALI CURRENCY NUMERATOR TWO;No;0;L;;;;2;N;;;;; +09F6;BENGALI CURRENCY NUMERATOR THREE;No;0;L;;;;3;N;;;;; +09F7;BENGALI CURRENCY NUMERATOR FOUR;No;0;L;;;;4;N;;;;; +09F8;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR;No;0;L;;;;;N;;;;; +09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;; +09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;; +0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;; +0A05;GURMUKHI LETTER A;Lo;0;L;;;;;N;;;;; +0A06;GURMUKHI LETTER AA;Lo;0;L;;;;;N;;;;; +0A07;GURMUKHI LETTER I;Lo;0;L;;;;;N;;;;; +0A08;GURMUKHI LETTER II;Lo;0;L;;;;;N;;;;; +0A09;GURMUKHI LETTER U;Lo;0;L;;;;;N;;;;; +0A0A;GURMUKHI LETTER UU;Lo;0;L;;;;;N;;;;; +0A0F;GURMUKHI LETTER EE;Lo;0;L;;;;;N;;;;; +0A10;GURMUKHI LETTER AI;Lo;0;L;;;;;N;;;;; +0A13;GURMUKHI LETTER OO;Lo;0;L;;;;;N;;;;; +0A14;GURMUKHI LETTER AU;Lo;0;L;;;;;N;;;;; +0A15;GURMUKHI LETTER KA;Lo;0;L;;;;;N;;;;; +0A16;GURMUKHI LETTER KHA;Lo;0;L;;;;;N;;;;; +0A17;GURMUKHI LETTER GA;Lo;0;L;;;;;N;;;;; +0A18;GURMUKHI LETTER GHA;Lo;0;L;;;;;N;;;;; +0A19;GURMUKHI LETTER NGA;Lo;0;L;;;;;N;;;;; +0A1A;GURMUKHI LETTER CA;Lo;0;L;;;;;N;;;;; +0A1B;GURMUKHI LETTER CHA;Lo;0;L;;;;;N;;;;; +0A1C;GURMUKHI LETTER JA;Lo;0;L;;;;;N;;;;; +0A1D;GURMUKHI LETTER JHA;Lo;0;L;;;;;N;;;;; +0A1E;GURMUKHI LETTER NYA;Lo;0;L;;;;;N;;;;; +0A1F;GURMUKHI LETTER TTA;Lo;0;L;;;;;N;;;;; +0A20;GURMUKHI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0A21;GURMUKHI LETTER DDA;Lo;0;L;;;;;N;;;;; +0A22;GURMUKHI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0A23;GURMUKHI LETTER NNA;Lo;0;L;;;;;N;;;;; +0A24;GURMUKHI LETTER TA;Lo;0;L;;;;;N;;;;; +0A25;GURMUKHI LETTER THA;Lo;0;L;;;;;N;;;;; +0A26;GURMUKHI LETTER DA;Lo;0;L;;;;;N;;;;; +0A27;GURMUKHI LETTER DHA;Lo;0;L;;;;;N;;;;; +0A28;GURMUKHI LETTER NA;Lo;0;L;;;;;N;;;;; +0A2A;GURMUKHI LETTER PA;Lo;0;L;;;;;N;;;;; +0A2B;GURMUKHI LETTER PHA;Lo;0;L;;;;;N;;;;; +0A2C;GURMUKHI LETTER BA;Lo;0;L;;;;;N;;;;; +0A2D;GURMUKHI LETTER BHA;Lo;0;L;;;;;N;;;;; +0A2E;GURMUKHI LETTER MA;Lo;0;L;;;;;N;;;;; +0A2F;GURMUKHI LETTER YA;Lo;0;L;;;;;N;;;;; +0A30;GURMUKHI LETTER RA;Lo;0;L;;;;;N;;;;; +0A32;GURMUKHI LETTER LA;Lo;0;L;;;;;N;;;;; +0A33;GURMUKHI LETTER LLA;Lo;0;L;0A32 0A3C;;;;N;;;;; +0A35;GURMUKHI LETTER VA;Lo;0;L;;;;;N;;;;; +0A36;GURMUKHI LETTER SHA;Lo;0;L;0A38 0A3C;;;;N;;;;; +0A38;GURMUKHI LETTER SA;Lo;0;L;;;;;N;;;;; +0A39;GURMUKHI LETTER HA;Lo;0;L;;;;;N;;;;; +0A3C;GURMUKHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0A3E;GURMUKHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0A3F;GURMUKHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0A40;GURMUKHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0A41;GURMUKHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0A42;GURMUKHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0A47;GURMUKHI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +0A48;GURMUKHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; +0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;; +0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;; +0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;; +0A5C;GURMUKHI LETTER RRA;Lo;0;L;;;;;N;;;;; +0A5E;GURMUKHI LETTER FA;Lo;0;L;0A2B 0A3C;;;;N;;;;; +0A66;GURMUKHI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0A67;GURMUKHI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0A68;GURMUKHI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0A69;GURMUKHI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0A6A;GURMUKHI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0A6B;GURMUKHI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0A6C;GURMUKHI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0A6D;GURMUKHI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0A6E;GURMUKHI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0A6F;GURMUKHI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0A70;GURMUKHI TIPPI;Mn;0;NSM;;;;;N;;;;; +0A71;GURMUKHI ADDAK;Mn;0;NSM;;;;;N;;;;; +0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;; +0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;; +0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;; +0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0A85;GUJARATI LETTER A;Lo;0;L;;;;;N;;;;; +0A86;GUJARATI LETTER AA;Lo;0;L;;;;;N;;;;; +0A87;GUJARATI LETTER I;Lo;0;L;;;;;N;;;;; +0A88;GUJARATI LETTER II;Lo;0;L;;;;;N;;;;; +0A89;GUJARATI LETTER U;Lo;0;L;;;;;N;;;;; +0A8A;GUJARATI LETTER UU;Lo;0;L;;;;;N;;;;; +0A8B;GUJARATI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0A8D;GUJARATI VOWEL CANDRA E;Lo;0;L;;;;;N;;;;; +0A8F;GUJARATI LETTER E;Lo;0;L;;;;;N;;;;; +0A90;GUJARATI LETTER AI;Lo;0;L;;;;;N;;;;; +0A91;GUJARATI VOWEL CANDRA O;Lo;0;L;;;;;N;;;;; +0A93;GUJARATI LETTER O;Lo;0;L;;;;;N;;;;; +0A94;GUJARATI LETTER AU;Lo;0;L;;;;;N;;;;; +0A95;GUJARATI LETTER KA;Lo;0;L;;;;;N;;;;; +0A96;GUJARATI LETTER KHA;Lo;0;L;;;;;N;;;;; +0A97;GUJARATI LETTER GA;Lo;0;L;;;;;N;;;;; +0A98;GUJARATI LETTER GHA;Lo;0;L;;;;;N;;;;; +0A99;GUJARATI LETTER NGA;Lo;0;L;;;;;N;;;;; +0A9A;GUJARATI LETTER CA;Lo;0;L;;;;;N;;;;; +0A9B;GUJARATI LETTER CHA;Lo;0;L;;;;;N;;;;; +0A9C;GUJARATI LETTER JA;Lo;0;L;;;;;N;;;;; +0A9D;GUJARATI LETTER JHA;Lo;0;L;;;;;N;;;;; +0A9E;GUJARATI LETTER NYA;Lo;0;L;;;;;N;;;;; +0A9F;GUJARATI LETTER TTA;Lo;0;L;;;;;N;;;;; +0AA0;GUJARATI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0AA1;GUJARATI LETTER DDA;Lo;0;L;;;;;N;;;;; +0AA2;GUJARATI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0AA3;GUJARATI LETTER NNA;Lo;0;L;;;;;N;;;;; +0AA4;GUJARATI LETTER TA;Lo;0;L;;;;;N;;;;; +0AA5;GUJARATI LETTER THA;Lo;0;L;;;;;N;;;;; +0AA6;GUJARATI LETTER DA;Lo;0;L;;;;;N;;;;; +0AA7;GUJARATI LETTER DHA;Lo;0;L;;;;;N;;;;; +0AA8;GUJARATI LETTER NA;Lo;0;L;;;;;N;;;;; +0AAA;GUJARATI LETTER PA;Lo;0;L;;;;;N;;;;; +0AAB;GUJARATI LETTER PHA;Lo;0;L;;;;;N;;;;; +0AAC;GUJARATI LETTER BA;Lo;0;L;;;;;N;;;;; +0AAD;GUJARATI LETTER BHA;Lo;0;L;;;;;N;;;;; +0AAE;GUJARATI LETTER MA;Lo;0;L;;;;;N;;;;; +0AAF;GUJARATI LETTER YA;Lo;0;L;;;;;N;;;;; +0AB0;GUJARATI LETTER RA;Lo;0;L;;;;;N;;;;; +0AB2;GUJARATI LETTER LA;Lo;0;L;;;;;N;;;;; +0AB3;GUJARATI LETTER LLA;Lo;0;L;;;;;N;;;;; +0AB5;GUJARATI LETTER VA;Lo;0;L;;;;;N;;;;; +0AB6;GUJARATI LETTER SHA;Lo;0;L;;;;;N;;;;; +0AB7;GUJARATI LETTER SSA;Lo;0;L;;;;;N;;;;; +0AB8;GUJARATI LETTER SA;Lo;0;L;;;;;N;;;;; +0AB9;GUJARATI LETTER HA;Lo;0;L;;;;;N;;;;; +0ABC;GUJARATI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0ABD;GUJARATI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0ABE;GUJARATI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0ABF;GUJARATI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0AC0;GUJARATI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0AC1;GUJARATI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0AC2;GUJARATI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0AC3;GUJARATI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0AC4;GUJARATI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0AC5;GUJARATI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; +0AC7;GUJARATI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0AC8;GUJARATI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0AC9;GUJARATI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; +0ACB;GUJARATI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +0ACC;GUJARATI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +0ACD;GUJARATI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0AD0;GUJARATI OM;Lo;0;L;;;;;N;;;;; +0AE0;GUJARATI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0AE6;GUJARATI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0AE7;GUJARATI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0AE8;GUJARATI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0AE9;GUJARATI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0AEA;GUJARATI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0AEB;GUJARATI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0AEC;GUJARATI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0AED;GUJARATI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0AEE;GUJARATI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0B05;ORIYA LETTER A;Lo;0;L;;;;;N;;;;; +0B06;ORIYA LETTER AA;Lo;0;L;;;;;N;;;;; +0B07;ORIYA LETTER I;Lo;0;L;;;;;N;;;;; +0B08;ORIYA LETTER II;Lo;0;L;;;;;N;;;;; +0B09;ORIYA LETTER U;Lo;0;L;;;;;N;;;;; +0B0A;ORIYA LETTER UU;Lo;0;L;;;;;N;;;;; +0B0B;ORIYA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0B0C;ORIYA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0B0F;ORIYA LETTER E;Lo;0;L;;;;;N;;;;; +0B10;ORIYA LETTER AI;Lo;0;L;;;;;N;;;;; +0B13;ORIYA LETTER O;Lo;0;L;;;;;N;;;;; +0B14;ORIYA LETTER AU;Lo;0;L;;;;;N;;;;; +0B15;ORIYA LETTER KA;Lo;0;L;;;;;N;;;;; +0B16;ORIYA LETTER KHA;Lo;0;L;;;;;N;;;;; +0B17;ORIYA LETTER GA;Lo;0;L;;;;;N;;;;; +0B18;ORIYA LETTER GHA;Lo;0;L;;;;;N;;;;; +0B19;ORIYA LETTER NGA;Lo;0;L;;;;;N;;;;; +0B1A;ORIYA LETTER CA;Lo;0;L;;;;;N;;;;; +0B1B;ORIYA LETTER CHA;Lo;0;L;;;;;N;;;;; +0B1C;ORIYA LETTER JA;Lo;0;L;;;;;N;;;;; +0B1D;ORIYA LETTER JHA;Lo;0;L;;;;;N;;;;; +0B1E;ORIYA LETTER NYA;Lo;0;L;;;;;N;;;;; +0B1F;ORIYA LETTER TTA;Lo;0;L;;;;;N;;;;; +0B20;ORIYA LETTER TTHA;Lo;0;L;;;;;N;;;;; +0B21;ORIYA LETTER DDA;Lo;0;L;;;;;N;;;;; +0B22;ORIYA LETTER DDHA;Lo;0;L;;;;;N;;;;; +0B23;ORIYA LETTER NNA;Lo;0;L;;;;;N;;;;; +0B24;ORIYA LETTER TA;Lo;0;L;;;;;N;;;;; +0B25;ORIYA LETTER THA;Lo;0;L;;;;;N;;;;; +0B26;ORIYA LETTER DA;Lo;0;L;;;;;N;;;;; +0B27;ORIYA LETTER DHA;Lo;0;L;;;;;N;;;;; +0B28;ORIYA LETTER NA;Lo;0;L;;;;;N;;;;; +0B2A;ORIYA LETTER PA;Lo;0;L;;;;;N;;;;; +0B2B;ORIYA LETTER PHA;Lo;0;L;;;;;N;;;;; +0B2C;ORIYA LETTER BA;Lo;0;L;;;;;N;;;;; +0B2D;ORIYA LETTER BHA;Lo;0;L;;;;;N;;;;; +0B2E;ORIYA LETTER MA;Lo;0;L;;;;;N;;;;; +0B2F;ORIYA LETTER YA;Lo;0;L;;;;;N;;;;; +0B30;ORIYA LETTER RA;Lo;0;L;;;;;N;;;;; +0B32;ORIYA LETTER LA;Lo;0;L;;;;;N;;;;; +0B33;ORIYA LETTER LLA;Lo;0;L;;;;;N;;;;; +0B36;ORIYA LETTER SHA;Lo;0;L;;;;;N;;;;; +0B37;ORIYA LETTER SSA;Lo;0;L;;;;;N;;;;; +0B38;ORIYA LETTER SA;Lo;0;L;;;;;N;;;;; +0B39;ORIYA LETTER HA;Lo;0;L;;;;;N;;;;; +0B3C;ORIYA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0B3D;ORIYA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0B3E;ORIYA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0B3F;ORIYA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0B40;ORIYA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;; +0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;; +0B4C;ORIYA VOWEL SIGN AU;Mc;0;L;0B47 0B57;;;;N;;;;; +0B4D;ORIYA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0B56;ORIYA AI LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +0B57;ORIYA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0B5C;ORIYA LETTER RRA;Lo;0;L;0B21 0B3C;;;;N;;;;; +0B5D;ORIYA LETTER RHA;Lo;0;L;0B22 0B3C;;;;N;;;;; +0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;; +0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0B69;ORIYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0B6A;ORIYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0B6B;ORIYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0B6C;ORIYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0B6D;ORIYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0B6E;ORIYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0B6F;ORIYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0B70;ORIYA ISSHAR;So;0;L;;;;;N;;;;; +0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0B83;TAMIL SIGN VISARGA;Lo;0;L;;;;;N;;;;; +0B85;TAMIL LETTER A;Lo;0;L;;;;;N;;;;; +0B86;TAMIL LETTER AA;Lo;0;L;;;;;N;;;;; +0B87;TAMIL LETTER I;Lo;0;L;;;;;N;;;;; +0B88;TAMIL LETTER II;Lo;0;L;;;;;N;;;;; +0B89;TAMIL LETTER U;Lo;0;L;;;;;N;;;;; +0B8A;TAMIL LETTER UU;Lo;0;L;;;;;N;;;;; +0B8E;TAMIL LETTER E;Lo;0;L;;;;;N;;;;; +0B8F;TAMIL LETTER EE;Lo;0;L;;;;;N;;;;; +0B90;TAMIL LETTER AI;Lo;0;L;;;;;N;;;;; +0B92;TAMIL LETTER O;Lo;0;L;;;;;N;;;;; +0B93;TAMIL LETTER OO;Lo;0;L;;;;;N;;;;; +0B94;TAMIL LETTER AU;Lo;0;L;0B92 0BD7;;;;N;;;;; +0B95;TAMIL LETTER KA;Lo;0;L;;;;;N;;;;; +0B99;TAMIL LETTER NGA;Lo;0;L;;;;;N;;;;; +0B9A;TAMIL LETTER CA;Lo;0;L;;;;;N;;;;; +0B9C;TAMIL LETTER JA;Lo;0;L;;;;;N;;;;; +0B9E;TAMIL LETTER NYA;Lo;0;L;;;;;N;;;;; +0B9F;TAMIL LETTER TTA;Lo;0;L;;;;;N;;;;; +0BA3;TAMIL LETTER NNA;Lo;0;L;;;;;N;;;;; +0BA4;TAMIL LETTER TA;Lo;0;L;;;;;N;;;;; +0BA8;TAMIL LETTER NA;Lo;0;L;;;;;N;;;;; +0BA9;TAMIL LETTER NNNA;Lo;0;L;;;;;N;;;;; +0BAA;TAMIL LETTER PA;Lo;0;L;;;;;N;;;;; +0BAE;TAMIL LETTER MA;Lo;0;L;;;;;N;;;;; +0BAF;TAMIL LETTER YA;Lo;0;L;;;;;N;;;;; +0BB0;TAMIL LETTER RA;Lo;0;L;;;;;N;;;;; +0BB1;TAMIL LETTER RRA;Lo;0;L;;;;;N;;;;; +0BB2;TAMIL LETTER LA;Lo;0;L;;;;;N;;;;; +0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;; +0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;; +0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;; +0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;; +0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;; +0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;; +0BBE;TAMIL VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0BBF;TAMIL VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0BC0;TAMIL VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0BC1;TAMIL VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0BC2;TAMIL VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0BC6;TAMIL VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0BC7;TAMIL VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +0BC8;TAMIL VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +0BCA;TAMIL VOWEL SIGN O;Mc;0;L;0BC6 0BBE;;;;N;;;;; +0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;; +0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;; +0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0BEA;TAMIL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0BEB;TAMIL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0BEC;TAMIL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0BED;TAMIL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0BEE;TAMIL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0BEF;TAMIL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0BF0;TAMIL NUMBER TEN;No;0;L;;;;10;N;;;;; +0BF1;TAMIL NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +0BF2;TAMIL NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; +0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;; +0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;; +0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;; +0C08;TELUGU LETTER II;Lo;0;L;;;;;N;;;;; +0C09;TELUGU LETTER U;Lo;0;L;;;;;N;;;;; +0C0A;TELUGU LETTER UU;Lo;0;L;;;;;N;;;;; +0C0B;TELUGU LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0C0C;TELUGU LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0C0E;TELUGU LETTER E;Lo;0;L;;;;;N;;;;; +0C0F;TELUGU LETTER EE;Lo;0;L;;;;;N;;;;; +0C10;TELUGU LETTER AI;Lo;0;L;;;;;N;;;;; +0C12;TELUGU LETTER O;Lo;0;L;;;;;N;;;;; +0C13;TELUGU LETTER OO;Lo;0;L;;;;;N;;;;; +0C14;TELUGU LETTER AU;Lo;0;L;;;;;N;;;;; +0C15;TELUGU LETTER KA;Lo;0;L;;;;;N;;;;; +0C16;TELUGU LETTER KHA;Lo;0;L;;;;;N;;;;; +0C17;TELUGU LETTER GA;Lo;0;L;;;;;N;;;;; +0C18;TELUGU LETTER GHA;Lo;0;L;;;;;N;;;;; +0C19;TELUGU LETTER NGA;Lo;0;L;;;;;N;;;;; +0C1A;TELUGU LETTER CA;Lo;0;L;;;;;N;;;;; +0C1B;TELUGU LETTER CHA;Lo;0;L;;;;;N;;;;; +0C1C;TELUGU LETTER JA;Lo;0;L;;;;;N;;;;; +0C1D;TELUGU LETTER JHA;Lo;0;L;;;;;N;;;;; +0C1E;TELUGU LETTER NYA;Lo;0;L;;;;;N;;;;; +0C1F;TELUGU LETTER TTA;Lo;0;L;;;;;N;;;;; +0C20;TELUGU LETTER TTHA;Lo;0;L;;;;;N;;;;; +0C21;TELUGU LETTER DDA;Lo;0;L;;;;;N;;;;; +0C22;TELUGU LETTER DDHA;Lo;0;L;;;;;N;;;;; +0C23;TELUGU LETTER NNA;Lo;0;L;;;;;N;;;;; +0C24;TELUGU LETTER TA;Lo;0;L;;;;;N;;;;; +0C25;TELUGU LETTER THA;Lo;0;L;;;;;N;;;;; +0C26;TELUGU LETTER DA;Lo;0;L;;;;;N;;;;; +0C27;TELUGU LETTER DHA;Lo;0;L;;;;;N;;;;; +0C28;TELUGU LETTER NA;Lo;0;L;;;;;N;;;;; +0C2A;TELUGU LETTER PA;Lo;0;L;;;;;N;;;;; +0C2B;TELUGU LETTER PHA;Lo;0;L;;;;;N;;;;; +0C2C;TELUGU LETTER BA;Lo;0;L;;;;;N;;;;; +0C2D;TELUGU LETTER BHA;Lo;0;L;;;;;N;;;;; +0C2E;TELUGU LETTER MA;Lo;0;L;;;;;N;;;;; +0C2F;TELUGU LETTER YA;Lo;0;L;;;;;N;;;;; +0C30;TELUGU LETTER RA;Lo;0;L;;;;;N;;;;; +0C31;TELUGU LETTER RRA;Lo;0;L;;;;;N;;;;; +0C32;TELUGU LETTER LA;Lo;0;L;;;;;N;;;;; +0C33;TELUGU LETTER LLA;Lo;0;L;;;;;N;;;;; +0C35;TELUGU LETTER VA;Lo;0;L;;;;;N;;;;; +0C36;TELUGU LETTER SHA;Lo;0;L;;;;;N;;;;; +0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;; +0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;; +0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;; +0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0C41;TELUGU VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0C42;TELUGU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0C43;TELUGU VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +0C44;TELUGU VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +0C46;TELUGU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0C47;TELUGU VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +0C48;TELUGU VOWEL SIGN AI;Mn;0;NSM;0C46 0C56;;;;N;;;;; +0C4A;TELUGU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +0C4B;TELUGU VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; +0C4C;TELUGU VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;; +0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;; +0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0C69;TELUGU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0C6A;TELUGU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0C6B;TELUGU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0C6C;TELUGU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;; +0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;; +0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;; +0C88;KANNADA LETTER II;Lo;0;L;;;;;N;;;;; +0C89;KANNADA LETTER U;Lo;0;L;;;;;N;;;;; +0C8A;KANNADA LETTER UU;Lo;0;L;;;;;N;;;;; +0C8B;KANNADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0C8C;KANNADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0C8E;KANNADA LETTER E;Lo;0;L;;;;;N;;;;; +0C8F;KANNADA LETTER EE;Lo;0;L;;;;;N;;;;; +0C90;KANNADA LETTER AI;Lo;0;L;;;;;N;;;;; +0C92;KANNADA LETTER O;Lo;0;L;;;;;N;;;;; +0C93;KANNADA LETTER OO;Lo;0;L;;;;;N;;;;; +0C94;KANNADA LETTER AU;Lo;0;L;;;;;N;;;;; +0C95;KANNADA LETTER KA;Lo;0;L;;;;;N;;;;; +0C96;KANNADA LETTER KHA;Lo;0;L;;;;;N;;;;; +0C97;KANNADA LETTER GA;Lo;0;L;;;;;N;;;;; +0C98;KANNADA LETTER GHA;Lo;0;L;;;;;N;;;;; +0C99;KANNADA LETTER NGA;Lo;0;L;;;;;N;;;;; +0C9A;KANNADA LETTER CA;Lo;0;L;;;;;N;;;;; +0C9B;KANNADA LETTER CHA;Lo;0;L;;;;;N;;;;; +0C9C;KANNADA LETTER JA;Lo;0;L;;;;;N;;;;; +0C9D;KANNADA LETTER JHA;Lo;0;L;;;;;N;;;;; +0C9E;KANNADA LETTER NYA;Lo;0;L;;;;;N;;;;; +0C9F;KANNADA LETTER TTA;Lo;0;L;;;;;N;;;;; +0CA0;KANNADA LETTER TTHA;Lo;0;L;;;;;N;;;;; +0CA1;KANNADA LETTER DDA;Lo;0;L;;;;;N;;;;; +0CA2;KANNADA LETTER DDHA;Lo;0;L;;;;;N;;;;; +0CA3;KANNADA LETTER NNA;Lo;0;L;;;;;N;;;;; +0CA4;KANNADA LETTER TA;Lo;0;L;;;;;N;;;;; +0CA5;KANNADA LETTER THA;Lo;0;L;;;;;N;;;;; +0CA6;KANNADA LETTER DA;Lo;0;L;;;;;N;;;;; +0CA7;KANNADA LETTER DHA;Lo;0;L;;;;;N;;;;; +0CA8;KANNADA LETTER NA;Lo;0;L;;;;;N;;;;; +0CAA;KANNADA LETTER PA;Lo;0;L;;;;;N;;;;; +0CAB;KANNADA LETTER PHA;Lo;0;L;;;;;N;;;;; +0CAC;KANNADA LETTER BA;Lo;0;L;;;;;N;;;;; +0CAD;KANNADA LETTER BHA;Lo;0;L;;;;;N;;;;; +0CAE;KANNADA LETTER MA;Lo;0;L;;;;;N;;;;; +0CAF;KANNADA LETTER YA;Lo;0;L;;;;;N;;;;; +0CB0;KANNADA LETTER RA;Lo;0;L;;;;;N;;;;; +0CB1;KANNADA LETTER RRA;Lo;0;L;;;;;N;;;;; +0CB2;KANNADA LETTER LA;Lo;0;L;;;;;N;;;;; +0CB3;KANNADA LETTER LLA;Lo;0;L;;;;;N;;;;; +0CB5;KANNADA LETTER VA;Lo;0;L;;;;;N;;;;; +0CB6;KANNADA LETTER SHA;Lo;0;L;;;;;N;;;;; +0CB7;KANNADA LETTER SSA;Lo;0;L;;;;;N;;;;; +0CB8;KANNADA LETTER SA;Lo;0;L;;;;;N;;;;; +0CB9;KANNADA LETTER HA;Lo;0;L;;;;;N;;;;; +0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0CBF;KANNADA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0CC0;KANNADA VOWEL SIGN II;Mc;0;L;0CBF 0CD5;;;;N;;;;; +0CC1;KANNADA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0CC2;KANNADA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0CC3;KANNADA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +0CC4;KANNADA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +0CC6;KANNADA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0CC7;KANNADA VOWEL SIGN EE;Mc;0;L;0CC6 0CD5;;;;N;;;;; +0CC8;KANNADA VOWEL SIGN AI;Mc;0;L;0CC6 0CD6;;;;N;;;;; +0CCA;KANNADA VOWEL SIGN O;Mc;0;L;0CC6 0CC2;;;;N;;;;; +0CCB;KANNADA VOWEL SIGN OO;Mc;0;L;0CCA 0CD5;;;;N;;;;; +0CCC;KANNADA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0CCD;KANNADA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0CD5;KANNADA LENGTH MARK;Mc;0;L;;;;;N;;;;; +0CD6;KANNADA AI LENGTH MARK;Mc;0;L;;;;;N;;;;; +0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;; +0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0CE9;KANNADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0CEA;KANNADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0CEB;KANNADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0CEC;KANNADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;; +0D06;MALAYALAM LETTER AA;Lo;0;L;;;;;N;;;;; +0D07;MALAYALAM LETTER I;Lo;0;L;;;;;N;;;;; +0D08;MALAYALAM LETTER II;Lo;0;L;;;;;N;;;;; +0D09;MALAYALAM LETTER U;Lo;0;L;;;;;N;;;;; +0D0A;MALAYALAM LETTER UU;Lo;0;L;;;;;N;;;;; +0D0B;MALAYALAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0D0C;MALAYALAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0D0E;MALAYALAM LETTER E;Lo;0;L;;;;;N;;;;; +0D0F;MALAYALAM LETTER EE;Lo;0;L;;;;;N;;;;; +0D10;MALAYALAM LETTER AI;Lo;0;L;;;;;N;;;;; +0D12;MALAYALAM LETTER O;Lo;0;L;;;;;N;;;;; +0D13;MALAYALAM LETTER OO;Lo;0;L;;;;;N;;;;; +0D14;MALAYALAM LETTER AU;Lo;0;L;;;;;N;;;;; +0D15;MALAYALAM LETTER KA;Lo;0;L;;;;;N;;;;; +0D16;MALAYALAM LETTER KHA;Lo;0;L;;;;;N;;;;; +0D17;MALAYALAM LETTER GA;Lo;0;L;;;;;N;;;;; +0D18;MALAYALAM LETTER GHA;Lo;0;L;;;;;N;;;;; +0D19;MALAYALAM LETTER NGA;Lo;0;L;;;;;N;;;;; +0D1A;MALAYALAM LETTER CA;Lo;0;L;;;;;N;;;;; +0D1B;MALAYALAM LETTER CHA;Lo;0;L;;;;;N;;;;; +0D1C;MALAYALAM LETTER JA;Lo;0;L;;;;;N;;;;; +0D1D;MALAYALAM LETTER JHA;Lo;0;L;;;;;N;;;;; +0D1E;MALAYALAM LETTER NYA;Lo;0;L;;;;;N;;;;; +0D1F;MALAYALAM LETTER TTA;Lo;0;L;;;;;N;;;;; +0D20;MALAYALAM LETTER TTHA;Lo;0;L;;;;;N;;;;; +0D21;MALAYALAM LETTER DDA;Lo;0;L;;;;;N;;;;; +0D22;MALAYALAM LETTER DDHA;Lo;0;L;;;;;N;;;;; +0D23;MALAYALAM LETTER NNA;Lo;0;L;;;;;N;;;;; +0D24;MALAYALAM LETTER TA;Lo;0;L;;;;;N;;;;; +0D25;MALAYALAM LETTER THA;Lo;0;L;;;;;N;;;;; +0D26;MALAYALAM LETTER DA;Lo;0;L;;;;;N;;;;; +0D27;MALAYALAM LETTER DHA;Lo;0;L;;;;;N;;;;; +0D28;MALAYALAM LETTER NA;Lo;0;L;;;;;N;;;;; +0D2A;MALAYALAM LETTER PA;Lo;0;L;;;;;N;;;;; +0D2B;MALAYALAM LETTER PHA;Lo;0;L;;;;;N;;;;; +0D2C;MALAYALAM LETTER BA;Lo;0;L;;;;;N;;;;; +0D2D;MALAYALAM LETTER BHA;Lo;0;L;;;;;N;;;;; +0D2E;MALAYALAM LETTER MA;Lo;0;L;;;;;N;;;;; +0D2F;MALAYALAM LETTER YA;Lo;0;L;;;;;N;;;;; +0D30;MALAYALAM LETTER RA;Lo;0;L;;;;;N;;;;; +0D31;MALAYALAM LETTER RRA;Lo;0;L;;;;;N;;;;; +0D32;MALAYALAM LETTER LA;Lo;0;L;;;;;N;;;;; +0D33;MALAYALAM LETTER LLA;Lo;0;L;;;;;N;;;;; +0D34;MALAYALAM LETTER LLLA;Lo;0;L;;;;;N;;;;; +0D35;MALAYALAM LETTER VA;Lo;0;L;;;;;N;;;;; +0D36;MALAYALAM LETTER SHA;Lo;0;L;;;;;N;;;;; +0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;; +0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;; +0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;; +0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +0D4A;MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;; +0D4B;MALAYALAM VOWEL SIGN OO;Mc;0;L;0D47 0D3E;;;;N;;;;; +0D4C;MALAYALAM VOWEL SIGN AU;Mc;0;L;0D46 0D57;;;;N;;;;; +0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0D69;MALAYALAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0D6A;MALAYALAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0D6B;MALAYALAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0D6C;MALAYALAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;; +0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;; +0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;; +0D86;SINHALA LETTER AAYANNA;Lo;0;L;;;;;N;;;;; +0D87;SINHALA LETTER AEYANNA;Lo;0;L;;;;;N;;;;; +0D88;SINHALA LETTER AEEYANNA;Lo;0;L;;;;;N;;;;; +0D89;SINHALA LETTER IYANNA;Lo;0;L;;;;;N;;;;; +0D8A;SINHALA LETTER IIYANNA;Lo;0;L;;;;;N;;;;; +0D8B;SINHALA LETTER UYANNA;Lo;0;L;;;;;N;;;;; +0D8C;SINHALA LETTER UUYANNA;Lo;0;L;;;;;N;;;;; +0D8D;SINHALA LETTER IRUYANNA;Lo;0;L;;;;;N;;;;; +0D8E;SINHALA LETTER IRUUYANNA;Lo;0;L;;;;;N;;;;; +0D8F;SINHALA LETTER ILUYANNA;Lo;0;L;;;;;N;;;;; +0D90;SINHALA LETTER ILUUYANNA;Lo;0;L;;;;;N;;;;; +0D91;SINHALA LETTER EYANNA;Lo;0;L;;;;;N;;;;; +0D92;SINHALA LETTER EEYANNA;Lo;0;L;;;;;N;;;;; +0D93;SINHALA LETTER AIYANNA;Lo;0;L;;;;;N;;;;; +0D94;SINHALA LETTER OYANNA;Lo;0;L;;;;;N;;;;; +0D95;SINHALA LETTER OOYANNA;Lo;0;L;;;;;N;;;;; +0D96;SINHALA LETTER AUYANNA;Lo;0;L;;;;;N;;;;; +0D9A;SINHALA LETTER ALPAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; +0D9B;SINHALA LETTER MAHAAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; +0D9C;SINHALA LETTER ALPAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; +0D9D;SINHALA LETTER MAHAAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; +0D9E;SINHALA LETTER KANTAJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; +0D9F;SINHALA LETTER SANYAKA GAYANNA;Lo;0;L;;;;;N;;;;; +0DA0;SINHALA LETTER ALPAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; +0DA1;SINHALA LETTER MAHAAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; +0DA2;SINHALA LETTER ALPAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA3;SINHALA LETTER MAHAAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA4;SINHALA LETTER TAALUJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; +0DA5;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA;Lo;0;L;;;;;N;;;;; +0DA6;SINHALA LETTER SANYAKA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA7;SINHALA LETTER ALPAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; +0DA8;SINHALA LETTER MAHAAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; +0DA9;SINHALA LETTER ALPAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAA;SINHALA LETTER MAHAAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAB;SINHALA LETTER MUURDHAJA NAYANNA;Lo;0;L;;;;;N;;;;; +0DAC;SINHALA LETTER SANYAKA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAD;SINHALA LETTER ALPAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; +0DAE;SINHALA LETTER MAHAAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; +0DAF;SINHALA LETTER ALPAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB0;SINHALA LETTER MAHAAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB1;SINHALA LETTER DANTAJA NAYANNA;Lo;0;L;;;;;N;;;;; +0DB3;SINHALA LETTER SANYAKA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB4;SINHALA LETTER ALPAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; +0DB5;SINHALA LETTER MAHAAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; +0DB6;SINHALA LETTER ALPAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; +0DB7;SINHALA LETTER MAHAAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; +0DB8;SINHALA LETTER MAYANNA;Lo;0;L;;;;;N;;;;; +0DB9;SINHALA LETTER AMBA BAYANNA;Lo;0;L;;;;;N;;;;; +0DBA;SINHALA LETTER YAYANNA;Lo;0;L;;;;;N;;;;; +0DBB;SINHALA LETTER RAYANNA;Lo;0;L;;;;;N;;;;; +0DBD;SINHALA LETTER DANTAJA LAYANNA;Lo;0;L;;;;;N;;;;; +0DC0;SINHALA LETTER VAYANNA;Lo;0;L;;;;;N;;;;; +0DC1;SINHALA LETTER TAALUJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC2;SINHALA LETTER MUURDHAJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC3;SINHALA LETTER DANTAJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC4;SINHALA LETTER HAYANNA;Lo;0;L;;;;;N;;;;; +0DC5;SINHALA LETTER MUURDHAJA LAYANNA;Lo;0;L;;;;;N;;;;; +0DC6;SINHALA LETTER FAYANNA;Lo;0;L;;;;;N;;;;; +0DCA;SINHALA SIGN AL-LAKUNA;Mn;9;NSM;;;;;N;;;;; +0DCF;SINHALA VOWEL SIGN AELA-PILLA;Mc;0;L;;;;;N;;;;; +0DD0;SINHALA VOWEL SIGN KETTI AEDA-PILLA;Mc;0;L;;;;;N;;;;; +0DD1;SINHALA VOWEL SIGN DIGA AEDA-PILLA;Mc;0;L;;;;;N;;;;; +0DD2;SINHALA VOWEL SIGN KETTI IS-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD3;SINHALA VOWEL SIGN DIGA IS-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD4;SINHALA VOWEL SIGN KETTI PAA-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD6;SINHALA VOWEL SIGN DIGA PAA-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD8;SINHALA VOWEL SIGN GAETTA-PILLA;Mc;0;L;;;;;N;;;;; +0DD9;SINHALA VOWEL SIGN KOMBUVA;Mc;0;L;;;;;N;;;;; +0DDA;SINHALA VOWEL SIGN DIGA KOMBUVA;Mc;0;L;0DD9 0DCA;;;;N;;;;; +0DDB;SINHALA VOWEL SIGN KOMBU DEKA;Mc;0;L;;;;;N;;;;; +0DDC;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA;Mc;0;L;0DD9 0DCF;;;;N;;;;; +0DDD;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA;Mc;0;L;0DDC 0DCA;;;;N;;;;; +0DDE;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA;Mc;0;L;0DD9 0DDF;;;;N;;;;; +0DDF;SINHALA VOWEL SIGN GAYANUKITTA;Mc;0;L;;;;;N;;;;; +0DF2;SINHALA VOWEL SIGN DIGA GAETTA-PILLA;Mc;0;L;;;;;N;;;;; +0DF3;SINHALA VOWEL SIGN DIGA GAYANUKITTA;Mc;0;L;;;;;N;;;;; +0DF4;SINHALA PUNCTUATION KUNDDALIYA;Po;0;L;;;;;N;;;;; +0E01;THAI CHARACTER KO KAI;Lo;0;L;;;;;N;THAI LETTER KO KAI;;;; +0E02;THAI CHARACTER KHO KHAI;Lo;0;L;;;;;N;THAI LETTER KHO KHAI;;;; +0E03;THAI CHARACTER KHO KHUAT;Lo;0;L;;;;;N;THAI LETTER KHO KHUAT;;;; +0E04;THAI CHARACTER KHO KHWAI;Lo;0;L;;;;;N;THAI LETTER KHO KHWAI;;;; +0E05;THAI CHARACTER KHO KHON;Lo;0;L;;;;;N;THAI LETTER KHO KHON;;;; +0E06;THAI CHARACTER KHO RAKHANG;Lo;0;L;;;;;N;THAI LETTER KHO RAKHANG;;;; +0E07;THAI CHARACTER NGO NGU;Lo;0;L;;;;;N;THAI LETTER NGO NGU;;;; +0E08;THAI CHARACTER CHO CHAN;Lo;0;L;;;;;N;THAI LETTER CHO CHAN;;;; +0E09;THAI CHARACTER CHO CHING;Lo;0;L;;;;;N;THAI LETTER CHO CHING;;;; +0E0A;THAI CHARACTER CHO CHANG;Lo;0;L;;;;;N;THAI LETTER CHO CHANG;;;; +0E0B;THAI CHARACTER SO SO;Lo;0;L;;;;;N;THAI LETTER SO SO;;;; +0E0C;THAI CHARACTER CHO CHOE;Lo;0;L;;;;;N;THAI LETTER CHO CHOE;;;; +0E0D;THAI CHARACTER YO YING;Lo;0;L;;;;;N;THAI LETTER YO YING;;;; +0E0E;THAI CHARACTER DO CHADA;Lo;0;L;;;;;N;THAI LETTER DO CHADA;;;; +0E0F;THAI CHARACTER TO PATAK;Lo;0;L;;;;;N;THAI LETTER TO PATAK;;;; +0E10;THAI CHARACTER THO THAN;Lo;0;L;;;;;N;THAI LETTER THO THAN;;;; +0E11;THAI CHARACTER THO NANGMONTHO;Lo;0;L;;;;;N;THAI LETTER THO NANGMONTHO;;;; +0E12;THAI CHARACTER THO PHUTHAO;Lo;0;L;;;;;N;THAI LETTER THO PHUTHAO;;;; +0E13;THAI CHARACTER NO NEN;Lo;0;L;;;;;N;THAI LETTER NO NEN;;;; +0E14;THAI CHARACTER DO DEK;Lo;0;L;;;;;N;THAI LETTER DO DEK;;;; +0E15;THAI CHARACTER TO TAO;Lo;0;L;;;;;N;THAI LETTER TO TAO;;;; +0E16;THAI CHARACTER THO THUNG;Lo;0;L;;;;;N;THAI LETTER THO THUNG;;;; +0E17;THAI CHARACTER THO THAHAN;Lo;0;L;;;;;N;THAI LETTER THO THAHAN;;;; +0E18;THAI CHARACTER THO THONG;Lo;0;L;;;;;N;THAI LETTER THO THONG;;;; +0E19;THAI CHARACTER NO NU;Lo;0;L;;;;;N;THAI LETTER NO NU;;;; +0E1A;THAI CHARACTER BO BAIMAI;Lo;0;L;;;;;N;THAI LETTER BO BAIMAI;;;; +0E1B;THAI CHARACTER PO PLA;Lo;0;L;;;;;N;THAI LETTER PO PLA;;;; +0E1C;THAI CHARACTER PHO PHUNG;Lo;0;L;;;;;N;THAI LETTER PHO PHUNG;;;; +0E1D;THAI CHARACTER FO FA;Lo;0;L;;;;;N;THAI LETTER FO FA;;;; +0E1E;THAI CHARACTER PHO PHAN;Lo;0;L;;;;;N;THAI LETTER PHO PHAN;;;; +0E1F;THAI CHARACTER FO FAN;Lo;0;L;;;;;N;THAI LETTER FO FAN;;;; +0E20;THAI CHARACTER PHO SAMPHAO;Lo;0;L;;;;;N;THAI LETTER PHO SAMPHAO;;;; +0E21;THAI CHARACTER MO MA;Lo;0;L;;;;;N;THAI LETTER MO MA;;;; +0E22;THAI CHARACTER YO YAK;Lo;0;L;;;;;N;THAI LETTER YO YAK;;;; +0E23;THAI CHARACTER RO RUA;Lo;0;L;;;;;N;THAI LETTER RO RUA;;;; +0E24;THAI CHARACTER RU;Lo;0;L;;;;;N;THAI LETTER RU;;;; +0E25;THAI CHARACTER LO LING;Lo;0;L;;;;;N;THAI LETTER LO LING;;;; +0E26;THAI CHARACTER LU;Lo;0;L;;;;;N;THAI LETTER LU;;;; +0E27;THAI CHARACTER WO WAEN;Lo;0;L;;;;;N;THAI LETTER WO WAEN;;;; +0E28;THAI CHARACTER SO SALA;Lo;0;L;;;;;N;THAI LETTER SO SALA;;;; +0E29;THAI CHARACTER SO RUSI;Lo;0;L;;;;;N;THAI LETTER SO RUSI;;;; +0E2A;THAI CHARACTER SO SUA;Lo;0;L;;;;;N;THAI LETTER SO SUA;;;; +0E2B;THAI CHARACTER HO HIP;Lo;0;L;;;;;N;THAI LETTER HO HIP;;;; +0E2C;THAI CHARACTER LO CHULA;Lo;0;L;;;;;N;THAI LETTER LO CHULA;;;; +0E2D;THAI CHARACTER O ANG;Lo;0;L;;;;;N;THAI LETTER O ANG;;;; +0E2E;THAI CHARACTER HO NOKHUK;Lo;0;L;;;;;N;THAI LETTER HO NOK HUK;;;; +0E2F;THAI CHARACTER PAIYANNOI;Lo;0;L;;;;;N;THAI PAI YAN NOI;paiyan noi;;; +0E30;THAI CHARACTER SARA A;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA A;;;; +0E31;THAI CHARACTER MAI HAN-AKAT;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI HAN-AKAT;;;; +0E32;THAI CHARACTER SARA AA;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AA;;;; +0E33;THAI CHARACTER SARA AM;Lo;0;L;<compat> 0E4D 0E32;;;;N;THAI VOWEL SIGN SARA AM;;;; +0E34;THAI CHARACTER SARA I;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA I;;;; +0E35;THAI CHARACTER SARA II;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA II;;;; +0E36;THAI CHARACTER SARA UE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UE;;;; +0E37;THAI CHARACTER SARA UEE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UEE;sara uue;;; +0E38;THAI CHARACTER SARA U;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA U;;;; +0E39;THAI CHARACTER SARA UU;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA UU;;;; +0E3A;THAI CHARACTER PHINTHU;Mn;9;NSM;;;;;N;THAI VOWEL SIGN PHINTHU;;;; +0E3F;THAI CURRENCY SYMBOL BAHT;Sc;0;ET;;;;;N;THAI BAHT SIGN;;;; +0E40;THAI CHARACTER SARA E;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA E;;;; +0E41;THAI CHARACTER SARA AE;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AE;;;; +0E42;THAI CHARACTER SARA O;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA O;;;; +0E43;THAI CHARACTER SARA AI MAIMUAN;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MUAN;sara ai mai muan;;; +0E44;THAI CHARACTER SARA AI MAIMALAI;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MALAI;sara ai mai malai;;; +0E45;THAI CHARACTER LAKKHANGYAO;Lo;0;L;;;;;N;THAI LAK KHANG YAO;lakkhang yao;;; +0E46;THAI CHARACTER MAIYAMOK;Lm;0;L;;;;;N;THAI MAI YAMOK;mai yamok;;; +0E47;THAI CHARACTER MAITAIKHU;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI TAI KHU;mai taikhu;;; +0E48;THAI CHARACTER MAI EK;Mn;107;NSM;;;;;N;THAI TONE MAI EK;;;; +0E49;THAI CHARACTER MAI THO;Mn;107;NSM;;;;;N;THAI TONE MAI THO;;;; +0E4A;THAI CHARACTER MAI TRI;Mn;107;NSM;;;;;N;THAI TONE MAI TRI;;;; +0E4B;THAI CHARACTER MAI CHATTAWA;Mn;107;NSM;;;;;N;THAI TONE MAI CHATTAWA;;;; +0E4C;THAI CHARACTER THANTHAKHAT;Mn;0;NSM;;;;;N;THAI THANTHAKHAT;;;; +0E4D;THAI CHARACTER NIKHAHIT;Mn;0;NSM;;;;;N;THAI NIKKHAHIT;nikkhahit;;; +0E4E;THAI CHARACTER YAMAKKAN;Mn;0;NSM;;;;;N;THAI YAMAKKAN;;;; +0E4F;THAI CHARACTER FONGMAN;Po;0;L;;;;;N;THAI FONGMAN;;;; +0E50;THAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0E51;THAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0E52;THAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0E53;THAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0E54;THAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0E55;THAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0E56;THAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0E57;THAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0E58;THAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0E59;THAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0E5A;THAI CHARACTER ANGKHANKHU;Po;0;L;;;;;N;THAI ANGKHANKHU;;;; +0E5B;THAI CHARACTER KHOMUT;Po;0;L;;;;;N;THAI KHOMUT;;;; +0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;; +0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;; +0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;; +0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;; +0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;; +0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;; +0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;; +0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;; +0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;; +0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;; +0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;; +0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;; +0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;; +0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;; +0E9C;LAO LETTER PHO SUNG;Lo;0;L;;;;;N;;;;; +0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;; +0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;; +0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;; +0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;; +0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;; +0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;; +0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;; +0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;; +0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;; +0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;; +0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;; +0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;; +0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;; +0EB0;LAO VOWEL SIGN A;Lo;0;L;;;;;N;;;;; +0EB1;LAO VOWEL SIGN MAI KAN;Mn;0;NSM;;;;;N;;;;; +0EB2;LAO VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; +0EB3;LAO VOWEL SIGN AM;Lo;0;L;<compat> 0ECD 0EB2;;;;N;;;;; +0EB4;LAO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0EB5;LAO VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0EB6;LAO VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; +0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; +0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;; +0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;; +0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;; +0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;; +0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;; +0EC0;LAO VOWEL SIGN E;Lo;0;L;;;;;N;;;;; +0EC1;LAO VOWEL SIGN EI;Lo;0;L;;;;;N;;;;; +0EC2;LAO VOWEL SIGN O;Lo;0;L;;;;;N;;;;; +0EC3;LAO VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; +0EC4;LAO VOWEL SIGN AI;Lo;0;L;;;;;N;;;;; +0EC6;LAO KO LA;Lm;0;L;;;;;N;;;;; +0EC8;LAO TONE MAI EK;Mn;122;NSM;;;;;N;;;;; +0EC9;LAO TONE MAI THO;Mn;122;NSM;;;;;N;;;;; +0ECA;LAO TONE MAI TI;Mn;122;NSM;;;;;N;;;;; +0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;; +0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;; +0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;; +0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0ED3;LAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0ED4;LAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0ED5;LAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0ED6;LAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0ED7;LAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0ED8;LAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0ED9;LAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0EDC;LAO HO NO;Lo;0;L;<compat> 0EAB 0E99;;;;N;;;;; +0EDD;LAO HO MO;Lo;0;L;<compat> 0EAB 0EA1;;;;N;;;;; +0F00;TIBETAN SYLLABLE OM;Lo;0;L;;;;;N;;;;; +0F01;TIBETAN MARK GTER YIG MGO TRUNCATED A;So;0;L;;;;;N;;ter yik go a thung;;; +0F02;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA;So;0;L;;;;;N;;ter yik go wum nam chey ma;;; +0F03;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA;So;0;L;;;;;N;;ter yik go wum ter tsek ma;;; +0F04;TIBETAN MARK INITIAL YIG MGO MDUN MA;Po;0;L;;;;;N;TIBETAN SINGLE ORNAMENT;yik go dun ma;;; +0F05;TIBETAN MARK CLOSING YIG MGO SGAB MA;Po;0;L;;;;;N;;yik go kab ma;;; +0F06;TIBETAN MARK CARET YIG MGO PHUR SHAD MA;Po;0;L;;;;;N;;yik go pur shey ma;;; +0F07;TIBETAN MARK YIG MGO TSHEG SHAD MA;Po;0;L;;;;;N;;yik go tsek shey ma;;; +0F08;TIBETAN MARK SBRUL SHAD;Po;0;L;;;;;N;TIBETAN RGYANSHAD;drul shey;;; +0F09;TIBETAN MARK BSKUR YIG MGO;Po;0;L;;;;;N;;kur yik go;;; +0F0A;TIBETAN MARK BKA- SHOG YIG MGO;Po;0;L;;;;;N;;ka sho yik go;;; +0F0B;TIBETAN MARK INTERSYLLABIC TSHEG;Po;0;L;;;;;N;TIBETAN TSEG;tsek;;; +0F0C;TIBETAN MARK DELIMITER TSHEG BSTAR;Po;0;L;<noBreak> 0F0B;;;;N;;tsek tar;;; +0F0D;TIBETAN MARK SHAD;Po;0;L;;;;;N;TIBETAN SHAD;shey;;; +0F0E;TIBETAN MARK NYIS SHAD;Po;0;L;;;;;N;TIBETAN DOUBLE SHAD;nyi shey;;; +0F0F;TIBETAN MARK TSHEG SHAD;Po;0;L;;;;;N;;tsek shey;;; +0F10;TIBETAN MARK NYIS TSHEG SHAD;Po;0;L;;;;;N;;nyi tsek shey;;; +0F11;TIBETAN MARK RIN CHEN SPUNGS SHAD;Po;0;L;;;;;N;TIBETAN RINCHANPHUNGSHAD;rinchen pung shey;;; +0F12;TIBETAN MARK RGYA GRAM SHAD;Po;0;L;;;;;N;;gya tram shey;;; +0F13;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN;So;0;L;;;;;N;;dzu ta me long chen;;; +0F14;TIBETAN MARK GTER TSHEG;So;0;L;;;;;N;TIBETAN COMMA;ter tsek;;; +0F15;TIBETAN LOGOTYPE SIGN CHAD RTAGS;So;0;L;;;;;N;;che ta;;; +0F16;TIBETAN LOGOTYPE SIGN LHAG RTAGS;So;0;L;;;;;N;;hlak ta;;; +0F17;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS;So;0;L;;;;;N;;trachen char ta;;; +0F18;TIBETAN ASTROLOGICAL SIGN -KHYUD PA;Mn;220;NSM;;;;;N;;kyu pa;;; +0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS;Mn;220;NSM;;;;;N;;dong tsu;;; +0F1A;TIBETAN SIGN RDEL DKAR GCIG;So;0;L;;;;;N;;deka chig;;; +0F1B;TIBETAN SIGN RDEL DKAR GNYIS;So;0;L;;;;;N;;deka nyi;;; +0F1C;TIBETAN SIGN RDEL DKAR GSUM;So;0;L;;;;;N;;deka sum;;; +0F1D;TIBETAN SIGN RDEL NAG GCIG;So;0;L;;;;;N;;dena chig;;; +0F1E;TIBETAN SIGN RDEL NAG GNYIS;So;0;L;;;;;N;;dena nyi;;; +0F1F;TIBETAN SIGN RDEL DKAR RDEL NAG;So;0;L;;;;;N;;deka dena;;; +0F20;TIBETAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0F21;TIBETAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0F22;TIBETAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0F23;TIBETAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0F24;TIBETAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0F25;TIBETAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0F26;TIBETAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;1/2;N;;;;; +0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;3/2;N;;;;; +0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;5/2;N;;;;; +0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;7/2;N;;;;; +0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;9/2;N;;;;; +0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;11/2;N;;;;; +0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;13/2;N;;;;; +0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;15/2;N;;;;; +0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;17/2;N;;;;; +0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;N;;;;; +0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;du ta;;; +0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;nge zung nyi da;;; +0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;dzu ta shi mig chen;;; +0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;nge zung gor ta;;; +0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;che go;;; +0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;tsa tru;;; +0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;N;;gug ta yun;;; +0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;N;;gug ta ye;;; +0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;N;TIBETAN LEFT BRACE;ang kang yun;;; +0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;N;TIBETAN RIGHT BRACE;ang kang ye;;; +0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;yar tse;;; +0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;mar tse;;; +0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;; +0F41;TIBETAN LETTER KHA;Lo;0;L;;;;;N;;;;; +0F42;TIBETAN LETTER GA;Lo;0;L;;;;;N;;;;; +0F43;TIBETAN LETTER GHA;Lo;0;L;0F42 0FB7;;;;N;;;;; +0F44;TIBETAN LETTER NGA;Lo;0;L;;;;;N;;;;; +0F45;TIBETAN LETTER CA;Lo;0;L;;;;;N;;;;; +0F46;TIBETAN LETTER CHA;Lo;0;L;;;;;N;;;;; +0F47;TIBETAN LETTER JA;Lo;0;L;;;;;N;;;;; +0F49;TIBETAN LETTER NYA;Lo;0;L;;;;;N;;;;; +0F4A;TIBETAN LETTER TTA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED TA;;;; +0F4B;TIBETAN LETTER TTHA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED THA;;;; +0F4C;TIBETAN LETTER DDA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED DA;;;; +0F4D;TIBETAN LETTER DDHA;Lo;0;L;0F4C 0FB7;;;;N;;;;; +0F4E;TIBETAN LETTER NNA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED NA;;;; +0F4F;TIBETAN LETTER TA;Lo;0;L;;;;;N;;;;; +0F50;TIBETAN LETTER THA;Lo;0;L;;;;;N;;;;; +0F51;TIBETAN LETTER DA;Lo;0;L;;;;;N;;;;; +0F52;TIBETAN LETTER DHA;Lo;0;L;0F51 0FB7;;;;N;;;;; +0F53;TIBETAN LETTER NA;Lo;0;L;;;;;N;;;;; +0F54;TIBETAN LETTER PA;Lo;0;L;;;;;N;;;;; +0F55;TIBETAN LETTER PHA;Lo;0;L;;;;;N;;;;; +0F56;TIBETAN LETTER BA;Lo;0;L;;;;;N;;;;; +0F57;TIBETAN LETTER BHA;Lo;0;L;0F56 0FB7;;;;N;;;;; +0F58;TIBETAN LETTER MA;Lo;0;L;;;;;N;;;;; +0F59;TIBETAN LETTER TSA;Lo;0;L;;;;;N;;;;; +0F5A;TIBETAN LETTER TSHA;Lo;0;L;;;;;N;;;;; +0F5B;TIBETAN LETTER DZA;Lo;0;L;;;;;N;;;;; +0F5C;TIBETAN LETTER DZHA;Lo;0;L;0F5B 0FB7;;;;N;;;;; +0F5D;TIBETAN LETTER WA;Lo;0;L;;;;;N;;;;; +0F5E;TIBETAN LETTER ZHA;Lo;0;L;;;;;N;;;;; +0F5F;TIBETAN LETTER ZA;Lo;0;L;;;;;N;;;;; +0F60;TIBETAN LETTER -A;Lo;0;L;;;;;N;TIBETAN LETTER AA;;;; +0F61;TIBETAN LETTER YA;Lo;0;L;;;;;N;;;;; +0F62;TIBETAN LETTER RA;Lo;0;L;;;;;N;;*;;; +0F63;TIBETAN LETTER LA;Lo;0;L;;;;;N;;;;; +0F64;TIBETAN LETTER SHA;Lo;0;L;;;;;N;;;;; +0F65;TIBETAN LETTER SSA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED SHA;;;; +0F66;TIBETAN LETTER SA;Lo;0;L;;;;;N;;;;; +0F67;TIBETAN LETTER HA;Lo;0;L;;;;;N;;;;; +0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;; +0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;; +0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;*;;; +0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;; +0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;; +0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;; +0F74;TIBETAN VOWEL SIGN U;Mn;132;NSM;;;;;N;;;;; +0F75;TIBETAN VOWEL SIGN UU;Mn;0;NSM;0F71 0F74;;;;N;;;;; +0F76;TIBETAN VOWEL SIGN VOCALIC R;Mn;0;NSM;0FB2 0F80;;;;N;;;;; +0F77;TIBETAN VOWEL SIGN VOCALIC RR;Mn;0;NSM;<compat> 0FB2 0F81;;;;N;;;;; +0F78;TIBETAN VOWEL SIGN VOCALIC L;Mn;0;NSM;0FB3 0F80;;;;N;;;;; +0F79;TIBETAN VOWEL SIGN VOCALIC LL;Mn;0;NSM;<compat> 0FB3 0F81;;;;N;;;;; +0F7A;TIBETAN VOWEL SIGN E;Mn;130;NSM;;;;;N;;;;; +0F7B;TIBETAN VOWEL SIGN EE;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AI;;;; +0F7C;TIBETAN VOWEL SIGN O;Mn;130;NSM;;;;;N;;;;; +0F7D;TIBETAN VOWEL SIGN OO;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AU;;;; +0F7E;TIBETAN SIGN RJES SU NGA RO;Mn;0;NSM;;;;;N;TIBETAN ANUSVARA;je su nga ro;;; +0F7F;TIBETAN SIGN RNAM BCAD;Mc;0;L;;;;;N;TIBETAN VISARGA;nam chey;;; +0F80;TIBETAN VOWEL SIGN REVERSED I;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN SHORT I;;;; +0F81;TIBETAN VOWEL SIGN REVERSED II;Mn;0;NSM;0F71 0F80;;;;N;;;;; +0F82;TIBETAN SIGN NYI ZLA NAA DA;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU WITH ORNAMENT;nyi da na da;;; +0F83;TIBETAN SIGN SNA LDAN;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU;nan de;;; +0F84;TIBETAN MARK HALANTA;Mn;9;NSM;;;;;N;TIBETAN VIRAMA;;;; +0F85;TIBETAN MARK PALUTA;Po;0;L;;;;;N;TIBETAN CHUCHENYIGE;;;; +0F86;TIBETAN SIGN LCI RTAGS;Mn;230;NSM;;;;;N;;ji ta;;; +0F87;TIBETAN SIGN YANG RTAGS;Mn;230;NSM;;;;;N;;yang ta;;; +0F88;TIBETAN SIGN LCE TSA CAN;Lo;0;L;;;;;N;;che tsa chen;;; +0F89;TIBETAN SIGN MCHU CAN;Lo;0;L;;;;;N;;chu chen;;; +0F8A;TIBETAN SIGN GRU CAN RGYINGS;Lo;0;L;;;;;N;;tru chen ging;;; +0F8B;TIBETAN SIGN GRU MED RGYINGS;Lo;0;L;;;;;N;;tru me ging;;; +0F90;TIBETAN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;; +0F91;TIBETAN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;; +0F92;TIBETAN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;; +0F93;TIBETAN SUBJOINED LETTER GHA;Mn;0;NSM;0F92 0FB7;;;;N;;;;; +0F94;TIBETAN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;; +0F95;TIBETAN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;; +0F96;TIBETAN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;; +0F97;TIBETAN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;; +0F99;TIBETAN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;; +0F9A;TIBETAN SUBJOINED LETTER TTA;Mn;0;NSM;;;;;N;;;;; +0F9B;TIBETAN SUBJOINED LETTER TTHA;Mn;0;NSM;;;;;N;;;;; +0F9C;TIBETAN SUBJOINED LETTER DDA;Mn;0;NSM;;;;;N;;;;; +0F9D;TIBETAN SUBJOINED LETTER DDHA;Mn;0;NSM;0F9C 0FB7;;;;N;;;;; +0F9E;TIBETAN SUBJOINED LETTER NNA;Mn;0;NSM;;;;;N;;;;; +0F9F;TIBETAN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;; +0FA0;TIBETAN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;; +0FA1;TIBETAN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;; +0FA2;TIBETAN SUBJOINED LETTER DHA;Mn;0;NSM;0FA1 0FB7;;;;N;;;;; +0FA3;TIBETAN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;; +0FA4;TIBETAN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;; +0FA5;TIBETAN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;; +0FA6;TIBETAN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;; +0FA7;TIBETAN SUBJOINED LETTER BHA;Mn;0;NSM;0FA6 0FB7;;;;N;;;;; +0FA8;TIBETAN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;; +0FA9;TIBETAN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;; +0FAA;TIBETAN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;; +0FAB;TIBETAN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;; +0FAC;TIBETAN SUBJOINED LETTER DZHA;Mn;0;NSM;0FAB 0FB7;;;;N;;;;; +0FAD;TIBETAN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;*;;; +0FAE;TIBETAN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;; +0FAF;TIBETAN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;; +0FB0;TIBETAN SUBJOINED LETTER -A;Mn;0;NSM;;;;;N;;;;; +0FB1;TIBETAN SUBJOINED LETTER YA;Mn;0;NSM;;;;;N;;*;;; +0FB2;TIBETAN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;*;;; +0FB3;TIBETAN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;; +0FB4;TIBETAN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;; +0FB5;TIBETAN SUBJOINED LETTER SSA;Mn;0;NSM;;;;;N;;;;; +0FB6;TIBETAN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;; +0FB7;TIBETAN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;; +0FB8;TIBETAN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;; +0FB9;TIBETAN SUBJOINED LETTER KSSA;Mn;0;NSM;0F90 0FB5;;;;N;;;;; +0FBA;TIBETAN SUBJOINED LETTER FIXED-FORM WA;Mn;0;NSM;;;;;N;;*;;; +0FBB;TIBETAN SUBJOINED LETTER FIXED-FORM YA;Mn;0;NSM;;;;;N;;*;;; +0FBC;TIBETAN SUBJOINED LETTER FIXED-FORM RA;Mn;0;NSM;;;;;N;;*;;; +0FBE;TIBETAN KU RU KHA;So;0;L;;;;;N;;kuruka;;; +0FBF;TIBETAN KU RU KHA BZHI MIG CAN;So;0;L;;;;;N;;kuruka shi mik chen;;; +0FC0;TIBETAN CANTILLATION SIGN HEAVY BEAT;So;0;L;;;;;N;;;;; +0FC1;TIBETAN CANTILLATION SIGN LIGHT BEAT;So;0;L;;;;;N;;;;; +0FC2;TIBETAN CANTILLATION SIGN CANG TE-U;So;0;L;;;;;N;;chang tyu;;; +0FC3;TIBETAN CANTILLATION SIGN SBUB -CHAL;So;0;L;;;;;N;;bub chey;;; +0FC4;TIBETAN SYMBOL DRIL BU;So;0;L;;;;;N;;drilbu;;; +0FC5;TIBETAN SYMBOL RDO RJE;So;0;L;;;;;N;;dorje;;; +0FC6;TIBETAN SYMBOL PADMA GDAN;Mn;220;NSM;;;;;N;;pema den;;; +0FC7;TIBETAN SYMBOL RDO RJE RGYA GRAM;So;0;L;;;;;N;;dorje gya dram;;; +0FC8;TIBETAN SYMBOL PHUR PA;So;0;L;;;;;N;;phurba;;; +0FC9;TIBETAN SYMBOL NOR BU;So;0;L;;;;;N;;norbu;;; +0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;norbu nyi khyi;;; +0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;norbu sum khyi;;; +0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;norbu shi khyi;;; +0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;dena sum;;; +1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;; +1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;; +1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;; +1003;MYANMAR LETTER GHA;Lo;0;L;;;;;N;;;;; +1004;MYANMAR LETTER NGA;Lo;0;L;;;;;N;;;;; +1005;MYANMAR LETTER CA;Lo;0;L;;;;;N;;;;; +1006;MYANMAR LETTER CHA;Lo;0;L;;;;;N;;;;; +1007;MYANMAR LETTER JA;Lo;0;L;;;;;N;;;;; +1008;MYANMAR LETTER JHA;Lo;0;L;;;;;N;;;;; +1009;MYANMAR LETTER NYA;Lo;0;L;;;;;N;;;;; +100A;MYANMAR LETTER NNYA;Lo;0;L;;;;;N;;;;; +100B;MYANMAR LETTER TTA;Lo;0;L;;;;;N;;;;; +100C;MYANMAR LETTER TTHA;Lo;0;L;;;;;N;;;;; +100D;MYANMAR LETTER DDA;Lo;0;L;;;;;N;;;;; +100E;MYANMAR LETTER DDHA;Lo;0;L;;;;;N;;;;; +100F;MYANMAR LETTER NNA;Lo;0;L;;;;;N;;;;; +1010;MYANMAR LETTER TA;Lo;0;L;;;;;N;;;;; +1011;MYANMAR LETTER THA;Lo;0;L;;;;;N;;;;; +1012;MYANMAR LETTER DA;Lo;0;L;;;;;N;;;;; +1013;MYANMAR LETTER DHA;Lo;0;L;;;;;N;;;;; +1014;MYANMAR LETTER NA;Lo;0;L;;;;;N;;;;; +1015;MYANMAR LETTER PA;Lo;0;L;;;;;N;;;;; +1016;MYANMAR LETTER PHA;Lo;0;L;;;;;N;;;;; +1017;MYANMAR LETTER BA;Lo;0;L;;;;;N;;;;; +1018;MYANMAR LETTER BHA;Lo;0;L;;;;;N;;;;; +1019;MYANMAR LETTER MA;Lo;0;L;;;;;N;;;;; +101A;MYANMAR LETTER YA;Lo;0;L;;;;;N;;;;; +101B;MYANMAR LETTER RA;Lo;0;L;;;;;N;;;;; +101C;MYANMAR LETTER LA;Lo;0;L;;;;;N;;;;; +101D;MYANMAR LETTER WA;Lo;0;L;;;;;N;;;;; +101E;MYANMAR LETTER SA;Lo;0;L;;;;;N;;;;; +101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;; +1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;; +1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;; +1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;; +1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;; +1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;; +1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;; +1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;; +1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;; +102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;; +102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +102F;MYANMAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;; +1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;; +1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1043;MYANMAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1044;MYANMAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1045;MYANMAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1046;MYANMAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1047;MYANMAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1048;MYANMAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1049;MYANMAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +104A;MYANMAR SIGN LITTLE SECTION;Po;0;L;;;;;N;;;;; +104B;MYANMAR SIGN SECTION;Po;0;L;;;;;N;;;;; +104C;MYANMAR SYMBOL LOCATIVE;Po;0;L;;;;;N;;;;; +104D;MYANMAR SYMBOL COMPLETED;Po;0;L;;;;;N;;;;; +104E;MYANMAR SYMBOL AFOREMENTIONED;Po;0;L;;;;;N;;;;; +104F;MYANMAR SYMBOL GENITIVE;Po;0;L;;;;;N;;;;; +1050;MYANMAR LETTER SHA;Lo;0;L;;;;;N;;;;; +1051;MYANMAR LETTER SSA;Lo;0;L;;;;;N;;;;; +1052;MYANMAR LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1053;MYANMAR LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +1054;MYANMAR LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1055;MYANMAR LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1056;MYANMAR VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;Khutsuri;;; +10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;Khutsuri;;; +10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;Khutsuri;;; +10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;Khutsuri;;; +10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;Khutsuri;;; +10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;Khutsuri;;; +10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;Khutsuri;;; +10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;Khutsuri;;; +10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;Khutsuri;;; +10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;Khutsuri;;; +10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;Khutsuri;;; +10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;Khutsuri;;; +10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;Khutsuri;;; +10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;Khutsuri;;; +10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;Khutsuri;;; +10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;Khutsuri;;; +10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;Khutsuri;;; +10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;Khutsuri;;; +10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;Khutsuri;;; +10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;Khutsuri;;; +10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;Khutsuri;;; +10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;Khutsuri;;; +10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;Khutsuri;;; +10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;Khutsuri;;; +10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;Khutsuri;;; +10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;Khutsuri;;; +10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;Khutsuri;;; +10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;Khutsuri;;; +10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;Khutsuri;;; +10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;Khutsuri;;; +10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;Khutsuri;;; +10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;Khutsuri;;; +10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;Khutsuri;;; +10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;Khutsuri;;; +10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;Khutsuri;;; +10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;Khutsuri;;; +10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;Khutsuri;;; +10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;Khutsuri;;; +10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;; +10D1;GEORGIAN LETTER BAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;;; +10D2;GEORGIAN LETTER GAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;;; +10D3;GEORGIAN LETTER DON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;;; +10D4;GEORGIAN LETTER EN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;;; +10D5;GEORGIAN LETTER VIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;;; +10D6;GEORGIAN LETTER ZEN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;;; +10D7;GEORGIAN LETTER TAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;;; +10D8;GEORGIAN LETTER IN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;;; +10D9;GEORGIAN LETTER KAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;;; +10DA;GEORGIAN LETTER LAS;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;;; +10DB;GEORGIAN LETTER MAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;;; +10DC;GEORGIAN LETTER NAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;;; +10DD;GEORGIAN LETTER ON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;;; +10DE;GEORGIAN LETTER PAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;;; +10DF;GEORGIAN LETTER ZHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;;; +10E0;GEORGIAN LETTER RAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;;; +10E1;GEORGIAN LETTER SAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;;; +10E2;GEORGIAN LETTER TAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;;; +10E3;GEORGIAN LETTER UN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;;; +10E4;GEORGIAN LETTER PHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;;; +10E5;GEORGIAN LETTER KHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;;; +10E6;GEORGIAN LETTER GHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;;; +10E7;GEORGIAN LETTER QAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;;; +10E8;GEORGIAN LETTER SHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;;; +10E9;GEORGIAN LETTER CHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;;; +10EA;GEORGIAN LETTER CAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;;; +10EB;GEORGIAN LETTER JIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;;; +10EC;GEORGIAN LETTER CIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;;; +10ED;GEORGIAN LETTER CHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;;; +10EE;GEORGIAN LETTER XAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;;; +10EF;GEORGIAN LETTER JHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;;; +10F0;GEORGIAN LETTER HAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;;; +10F1;GEORGIAN LETTER HE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;;; +10F2;GEORGIAN LETTER HIE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;;; +10F3;GEORGIAN LETTER WE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;;; +10F4;GEORGIAN LETTER HAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;;; +10F5;GEORGIAN LETTER HOE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;;; +10F6;GEORGIAN LETTER FI;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;;; +10F7;GEORGIAN LETTER YN;Lo;0;L;;;;;N;;;;; +10F8;GEORGIAN LETTER ELIFI;Lo;0;L;;;;;N;;;;; +10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; +1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;; +1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;; +1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;n *;;; +1103;HANGUL CHOSEONG TIKEUT;Lo;0;L;;;;;N;;d *;;; +1104;HANGUL CHOSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;dd *;;; +1105;HANGUL CHOSEONG RIEUL;Lo;0;L;;;;;N;;r *;;; +1106;HANGUL CHOSEONG MIEUM;Lo;0;L;;;;;N;;m *;;; +1107;HANGUL CHOSEONG PIEUP;Lo;0;L;;;;;N;;b *;;; +1108;HANGUL CHOSEONG SSANGPIEUP;Lo;0;L;;;;;N;;bb *;;; +1109;HANGUL CHOSEONG SIOS;Lo;0;L;;;;;N;;s *;;; +110A;HANGUL CHOSEONG SSANGSIOS;Lo;0;L;;;;;N;;ss *;;; +110B;HANGUL CHOSEONG IEUNG;Lo;0;L;;;;;N;;;;; +110C;HANGUL CHOSEONG CIEUC;Lo;0;L;;;;;N;;j *;;; +110D;HANGUL CHOSEONG SSANGCIEUC;Lo;0;L;;;;;N;;jj *;;; +110E;HANGUL CHOSEONG CHIEUCH;Lo;0;L;;;;;N;;c *;;; +110F;HANGUL CHOSEONG KHIEUKH;Lo;0;L;;;;;N;;k *;;; +1110;HANGUL CHOSEONG THIEUTH;Lo;0;L;;;;;N;;t *;;; +1111;HANGUL CHOSEONG PHIEUPH;Lo;0;L;;;;;N;;p *;;; +1112;HANGUL CHOSEONG HIEUH;Lo;0;L;;;;;N;;h *;;; +1113;HANGUL CHOSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; +1114;HANGUL CHOSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; +1115;HANGUL CHOSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; +1116;HANGUL CHOSEONG NIEUN-PIEUP;Lo;0;L;;;;;N;;;;; +1117;HANGUL CHOSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; +1118;HANGUL CHOSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; +1119;HANGUL CHOSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; +111A;HANGUL CHOSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; +111B;HANGUL CHOSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; +111C;HANGUL CHOSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; +111D;HANGUL CHOSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; +111E;HANGUL CHOSEONG PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; +111F;HANGUL CHOSEONG PIEUP-NIEUN;Lo;0;L;;;;;N;;;;; +1120;HANGUL CHOSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +1121;HANGUL CHOSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +1122;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +1123;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +1124;HANGUL CHOSEONG PIEUP-SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +1125;HANGUL CHOSEONG PIEUP-SSANGSIOS;Lo;0;L;;;;;N;;;;; +1126;HANGUL CHOSEONG PIEUP-SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +1127;HANGUL CHOSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; +1128;HANGUL CHOSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; +1129;HANGUL CHOSEONG PIEUP-THIEUTH;Lo;0;L;;;;;N;;;;; +112A;HANGUL CHOSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +112B;HANGUL CHOSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +112C;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP;Lo;0;L;;;;;N;;;;; +112D;HANGUL CHOSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +112E;HANGUL CHOSEONG SIOS-NIEUN;Lo;0;L;;;;;N;;;;; +112F;HANGUL CHOSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +1130;HANGUL CHOSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; +1131;HANGUL CHOSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; +1132;HANGUL CHOSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +1133;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; +1134;HANGUL CHOSEONG SIOS-SSANGSIOS;Lo;0;L;;;;;N;;;;; +1135;HANGUL CHOSEONG SIOS-IEUNG;Lo;0;L;;;;;N;;;;; +1136;HANGUL CHOSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +1137;HANGUL CHOSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; +1138;HANGUL CHOSEONG SIOS-KHIEUKH;Lo;0;L;;;;;N;;;;; +1139;HANGUL CHOSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +113A;HANGUL CHOSEONG SIOS-PHIEUPH;Lo;0;L;;;;;N;;;;; +113B;HANGUL CHOSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; +113C;HANGUL CHOSEONG CHITUEUMSIOS;Lo;0;L;;;;;N;;;;; +113D;HANGUL CHOSEONG CHITUEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; +113E;HANGUL CHOSEONG CEONGCHIEUMSIOS;Lo;0;L;;;;;N;;;;; +113F;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; +1140;HANGUL CHOSEONG PANSIOS;Lo;0;L;;;;;N;;;;; +1141;HANGUL CHOSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; +1142;HANGUL CHOSEONG IEUNG-TIKEUT;Lo;0;L;;;;;N;;;;; +1143;HANGUL CHOSEONG IEUNG-MIEUM;Lo;0;L;;;;;N;;;;; +1144;HANGUL CHOSEONG IEUNG-PIEUP;Lo;0;L;;;;;N;;;;; +1145;HANGUL CHOSEONG IEUNG-SIOS;Lo;0;L;;;;;N;;;;; +1146;HANGUL CHOSEONG IEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; +1147;HANGUL CHOSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; +1148;HANGUL CHOSEONG IEUNG-CIEUC;Lo;0;L;;;;;N;;;;; +1149;HANGUL CHOSEONG IEUNG-CHIEUCH;Lo;0;L;;;;;N;;;;; +114A;HANGUL CHOSEONG IEUNG-THIEUTH;Lo;0;L;;;;;N;;;;; +114B;HANGUL CHOSEONG IEUNG-PHIEUPH;Lo;0;L;;;;;N;;;;; +114C;HANGUL CHOSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; +114D;HANGUL CHOSEONG CIEUC-IEUNG;Lo;0;L;;;;;N;;;;; +114E;HANGUL CHOSEONG CHITUEUMCIEUC;Lo;0;L;;;;;N;;;;; +114F;HANGUL CHOSEONG CHITUEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; +1150;HANGUL CHOSEONG CEONGCHIEUMCIEUC;Lo;0;L;;;;;N;;;;; +1151;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; +1152;HANGUL CHOSEONG CHIEUCH-KHIEUKH;Lo;0;L;;;;;N;;;;; +1153;HANGUL CHOSEONG CHIEUCH-HIEUH;Lo;0;L;;;;;N;;;;; +1154;HANGUL CHOSEONG CHITUEUMCHIEUCH;Lo;0;L;;;;;N;;;;; +1155;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH;Lo;0;L;;;;;N;;;;; +1156;HANGUL CHOSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; +1157;HANGUL CHOSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; +1158;HANGUL CHOSEONG SSANGHIEUH;Lo;0;L;;;;;N;;;;; +1159;HANGUL CHOSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; +115F;HANGUL CHOSEONG FILLER;Lo;0;L;;;;;N;;;;; +1160;HANGUL JUNGSEONG FILLER;Lo;0;L;;;;;N;;;;; +1161;HANGUL JUNGSEONG A;Lo;0;L;;;;;N;;;;; +1162;HANGUL JUNGSEONG AE;Lo;0;L;;;;;N;;;;; +1163;HANGUL JUNGSEONG YA;Lo;0;L;;;;;N;;;;; +1164;HANGUL JUNGSEONG YAE;Lo;0;L;;;;;N;;;;; +1165;HANGUL JUNGSEONG EO;Lo;0;L;;;;;N;;;;; +1166;HANGUL JUNGSEONG E;Lo;0;L;;;;;N;;;;; +1167;HANGUL JUNGSEONG YEO;Lo;0;L;;;;;N;;;;; +1168;HANGUL JUNGSEONG YE;Lo;0;L;;;;;N;;;;; +1169;HANGUL JUNGSEONG O;Lo;0;L;;;;;N;;;;; +116A;HANGUL JUNGSEONG WA;Lo;0;L;;;;;N;;;;; +116B;HANGUL JUNGSEONG WAE;Lo;0;L;;;;;N;;;;; +116C;HANGUL JUNGSEONG OE;Lo;0;L;;;;;N;;;;; +116D;HANGUL JUNGSEONG YO;Lo;0;L;;;;;N;;;;; +116E;HANGUL JUNGSEONG U;Lo;0;L;;;;;N;;;;; +116F;HANGUL JUNGSEONG WEO;Lo;0;L;;;;;N;;;;; +1170;HANGUL JUNGSEONG WE;Lo;0;L;;;;;N;;;;; +1171;HANGUL JUNGSEONG WI;Lo;0;L;;;;;N;;;;; +1172;HANGUL JUNGSEONG YU;Lo;0;L;;;;;N;;;;; +1173;HANGUL JUNGSEONG EU;Lo;0;L;;;;;N;;;;; +1174;HANGUL JUNGSEONG YI;Lo;0;L;;;;;N;;;;; +1175;HANGUL JUNGSEONG I;Lo;0;L;;;;;N;;;;; +1176;HANGUL JUNGSEONG A-O;Lo;0;L;;;;;N;;;;; +1177;HANGUL JUNGSEONG A-U;Lo;0;L;;;;;N;;;;; +1178;HANGUL JUNGSEONG YA-O;Lo;0;L;;;;;N;;;;; +1179;HANGUL JUNGSEONG YA-YO;Lo;0;L;;;;;N;;;;; +117A;HANGUL JUNGSEONG EO-O;Lo;0;L;;;;;N;;;;; +117B;HANGUL JUNGSEONG EO-U;Lo;0;L;;;;;N;;;;; +117C;HANGUL JUNGSEONG EO-EU;Lo;0;L;;;;;N;;;;; +117D;HANGUL JUNGSEONG YEO-O;Lo;0;L;;;;;N;;;;; +117E;HANGUL JUNGSEONG YEO-U;Lo;0;L;;;;;N;;;;; +117F;HANGUL JUNGSEONG O-EO;Lo;0;L;;;;;N;;;;; +1180;HANGUL JUNGSEONG O-E;Lo;0;L;;;;;N;;;;; +1181;HANGUL JUNGSEONG O-YE;Lo;0;L;;;;;N;;;;; +1182;HANGUL JUNGSEONG O-O;Lo;0;L;;;;;N;;;;; +1183;HANGUL JUNGSEONG O-U;Lo;0;L;;;;;N;;;;; +1184;HANGUL JUNGSEONG YO-YA;Lo;0;L;;;;;N;;;;; +1185;HANGUL JUNGSEONG YO-YAE;Lo;0;L;;;;;N;;;;; +1186;HANGUL JUNGSEONG YO-YEO;Lo;0;L;;;;;N;;;;; +1187;HANGUL JUNGSEONG YO-O;Lo;0;L;;;;;N;;;;; +1188;HANGUL JUNGSEONG YO-I;Lo;0;L;;;;;N;;;;; +1189;HANGUL JUNGSEONG U-A;Lo;0;L;;;;;N;;;;; +118A;HANGUL JUNGSEONG U-AE;Lo;0;L;;;;;N;;;;; +118B;HANGUL JUNGSEONG U-EO-EU;Lo;0;L;;;;;N;;;;; +118C;HANGUL JUNGSEONG U-YE;Lo;0;L;;;;;N;;;;; +118D;HANGUL JUNGSEONG U-U;Lo;0;L;;;;;N;;;;; +118E;HANGUL JUNGSEONG YU-A;Lo;0;L;;;;;N;;;;; +118F;HANGUL JUNGSEONG YU-EO;Lo;0;L;;;;;N;;;;; +1190;HANGUL JUNGSEONG YU-E;Lo;0;L;;;;;N;;;;; +1191;HANGUL JUNGSEONG YU-YEO;Lo;0;L;;;;;N;;;;; +1192;HANGUL JUNGSEONG YU-YE;Lo;0;L;;;;;N;;;;; +1193;HANGUL JUNGSEONG YU-U;Lo;0;L;;;;;N;;;;; +1194;HANGUL JUNGSEONG YU-I;Lo;0;L;;;;;N;;;;; +1195;HANGUL JUNGSEONG EU-U;Lo;0;L;;;;;N;;;;; +1196;HANGUL JUNGSEONG EU-EU;Lo;0;L;;;;;N;;;;; +1197;HANGUL JUNGSEONG YI-U;Lo;0;L;;;;;N;;;;; +1198;HANGUL JUNGSEONG I-A;Lo;0;L;;;;;N;;;;; +1199;HANGUL JUNGSEONG I-YA;Lo;0;L;;;;;N;;;;; +119A;HANGUL JUNGSEONG I-O;Lo;0;L;;;;;N;;;;; +119B;HANGUL JUNGSEONG I-U;Lo;0;L;;;;;N;;;;; +119C;HANGUL JUNGSEONG I-EU;Lo;0;L;;;;;N;;;;; +119D;HANGUL JUNGSEONG I-ARAEA;Lo;0;L;;;;;N;;;;; +119E;HANGUL JUNGSEONG ARAEA;Lo;0;L;;;;;N;;;;; +119F;HANGUL JUNGSEONG ARAEA-EO;Lo;0;L;;;;;N;;;;; +11A0;HANGUL JUNGSEONG ARAEA-U;Lo;0;L;;;;;N;;;;; +11A1;HANGUL JUNGSEONG ARAEA-I;Lo;0;L;;;;;N;;;;; +11A2;HANGUL JUNGSEONG SSANGARAEA;Lo;0;L;;;;;N;;;;; +11A8;HANGUL JONGSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;; +11A9;HANGUL JONGSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;; +11AA;HANGUL JONGSEONG KIYEOK-SIOS;Lo;0;L;;;;;N;;gs *;;; +11AB;HANGUL JONGSEONG NIEUN;Lo;0;L;;;;;N;;n *;;; +11AC;HANGUL JONGSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;nj *;;; +11AD;HANGUL JONGSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;nh *;;; +11AE;HANGUL JONGSEONG TIKEUT;Lo;0;L;;;;;N;;d *;;; +11AF;HANGUL JONGSEONG RIEUL;Lo;0;L;;;;;N;;l *;;; +11B0;HANGUL JONGSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;lg *;;; +11B1;HANGUL JONGSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;lm *;;; +11B2;HANGUL JONGSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;lb *;;; +11B3;HANGUL JONGSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;ls *;;; +11B4;HANGUL JONGSEONG RIEUL-THIEUTH;Lo;0;L;;;;;N;;lt *;;; +11B5;HANGUL JONGSEONG RIEUL-PHIEUPH;Lo;0;L;;;;;N;;lp *;;; +11B6;HANGUL JONGSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;lh *;;; +11B7;HANGUL JONGSEONG MIEUM;Lo;0;L;;;;;N;;m *;;; +11B8;HANGUL JONGSEONG PIEUP;Lo;0;L;;;;;N;;b *;;; +11B9;HANGUL JONGSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;bs *;;; +11BA;HANGUL JONGSEONG SIOS;Lo;0;L;;;;;N;;s *;;; +11BB;HANGUL JONGSEONG SSANGSIOS;Lo;0;L;;;;;N;;ss *;;; +11BC;HANGUL JONGSEONG IEUNG;Lo;0;L;;;;;N;;ng *;;; +11BD;HANGUL JONGSEONG CIEUC;Lo;0;L;;;;;N;;j *;;; +11BE;HANGUL JONGSEONG CHIEUCH;Lo;0;L;;;;;N;;c *;;; +11BF;HANGUL JONGSEONG KHIEUKH;Lo;0;L;;;;;N;;k *;;; +11C0;HANGUL JONGSEONG THIEUTH;Lo;0;L;;;;;N;;t *;;; +11C1;HANGUL JONGSEONG PHIEUPH;Lo;0;L;;;;;N;;p *;;; +11C2;HANGUL JONGSEONG HIEUH;Lo;0;L;;;;;N;;h *;;; +11C3;HANGUL JONGSEONG KIYEOK-RIEUL;Lo;0;L;;;;;N;;;;; +11C4;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +11C5;HANGUL JONGSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; +11C6;HANGUL JONGSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; +11C7;HANGUL JONGSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; +11C8;HANGUL JONGSEONG NIEUN-PANSIOS;Lo;0;L;;;;;N;;;;; +11C9;HANGUL JONGSEONG NIEUN-THIEUTH;Lo;0;L;;;;;N;;;;; +11CA;HANGUL JONGSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; +11CB;HANGUL JONGSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; +11CC;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; +11CD;HANGUL JONGSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; +11CE;HANGUL JONGSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; +11CF;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH;Lo;0;L;;;;;N;;;;; +11D0;HANGUL JONGSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; +11D1;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +11D2;HANGUL JONGSEONG RIEUL-MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +11D3;HANGUL JONGSEONG RIEUL-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +11D4;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +11D5;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +11D6;HANGUL JONGSEONG RIEUL-SSANGSIOS;Lo;0;L;;;;;N;;;;; +11D7;HANGUL JONGSEONG RIEUL-PANSIOS;Lo;0;L;;;;;N;;;;; +11D8;HANGUL JONGSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +11D9;HANGUL JONGSEONG RIEUL-YEORINHIEUH;Lo;0;L;;;;;N;;;;; +11DA;HANGUL JONGSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +11DB;HANGUL JONGSEONG MIEUM-RIEUL;Lo;0;L;;;;;N;;;;; +11DC;HANGUL JONGSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; +11DD;HANGUL JONGSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +11DE;HANGUL JONGSEONG MIEUM-SSANGSIOS;Lo;0;L;;;;;N;;;;; +11DF;HANGUL JONGSEONG MIEUM-PANSIOS;Lo;0;L;;;;;N;;;;; +11E0;HANGUL JONGSEONG MIEUM-CHIEUCH;Lo;0;L;;;;;N;;;;; +11E1;HANGUL JONGSEONG MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; +11E2;HANGUL JONGSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; +11E3;HANGUL JONGSEONG PIEUP-RIEUL;Lo;0;L;;;;;N;;;;; +11E4;HANGUL JONGSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +11E5;HANGUL JONGSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +11E6;HANGUL JONGSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +11E7;HANGUL JONGSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +11E8;HANGUL JONGSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +11E9;HANGUL JONGSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; +11EA;HANGUL JONGSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +11EB;HANGUL JONGSEONG PANSIOS;Lo;0;L;;;;;N;;;;; +11EC;HANGUL JONGSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; +11ED;HANGUL JONGSEONG IEUNG-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +11EE;HANGUL JONGSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; +11EF;HANGUL JONGSEONG IEUNG-KHIEUKH;Lo;0;L;;;;;N;;;;; +11F0;HANGUL JONGSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; +11F1;HANGUL JONGSEONG YESIEUNG-SIOS;Lo;0;L;;;;;N;;;;; +11F2;HANGUL JONGSEONG YESIEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; +11F3;HANGUL JONGSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; +11F4;HANGUL JONGSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; +11F5;HANGUL JONGSEONG HIEUH-NIEUN;Lo;0;L;;;;;N;;;;; +11F6;HANGUL JONGSEONG HIEUH-RIEUL;Lo;0;L;;;;;N;;;;; +11F7;HANGUL JONGSEONG HIEUH-MIEUM;Lo;0;L;;;;;N;;;;; +11F8;HANGUL JONGSEONG HIEUH-PIEUP;Lo;0;L;;;;;N;;;;; +11F9;HANGUL JONGSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; +1200;ETHIOPIC SYLLABLE HA;Lo;0;L;;;;;N;;;;; +1201;ETHIOPIC SYLLABLE HU;Lo;0;L;;;;;N;;;;; +1202;ETHIOPIC SYLLABLE HI;Lo;0;L;;;;;N;;;;; +1203;ETHIOPIC SYLLABLE HAA;Lo;0;L;;;;;N;;;;; +1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;; +1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;; +1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;; +1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;; +1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;; +120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;; +120B;ETHIOPIC SYLLABLE LAA;Lo;0;L;;;;;N;;;;; +120C;ETHIOPIC SYLLABLE LEE;Lo;0;L;;;;;N;;;;; +120D;ETHIOPIC SYLLABLE LE;Lo;0;L;;;;;N;;;;; +120E;ETHIOPIC SYLLABLE LO;Lo;0;L;;;;;N;;;;; +120F;ETHIOPIC SYLLABLE LWA;Lo;0;L;;;;;N;;;;; +1210;ETHIOPIC SYLLABLE HHA;Lo;0;L;;;;;N;;;;; +1211;ETHIOPIC SYLLABLE HHU;Lo;0;L;;;;;N;;;;; +1212;ETHIOPIC SYLLABLE HHI;Lo;0;L;;;;;N;;;;; +1213;ETHIOPIC SYLLABLE HHAA;Lo;0;L;;;;;N;;;;; +1214;ETHIOPIC SYLLABLE HHEE;Lo;0;L;;;;;N;;;;; +1215;ETHIOPIC SYLLABLE HHE;Lo;0;L;;;;;N;;;;; +1216;ETHIOPIC SYLLABLE HHO;Lo;0;L;;;;;N;;;;; +1217;ETHIOPIC SYLLABLE HHWA;Lo;0;L;;;;;N;;;;; +1218;ETHIOPIC SYLLABLE MA;Lo;0;L;;;;;N;;;;; +1219;ETHIOPIC SYLLABLE MU;Lo;0;L;;;;;N;;;;; +121A;ETHIOPIC SYLLABLE MI;Lo;0;L;;;;;N;;;;; +121B;ETHIOPIC SYLLABLE MAA;Lo;0;L;;;;;N;;;;; +121C;ETHIOPIC SYLLABLE MEE;Lo;0;L;;;;;N;;;;; +121D;ETHIOPIC SYLLABLE ME;Lo;0;L;;;;;N;;;;; +121E;ETHIOPIC SYLLABLE MO;Lo;0;L;;;;;N;;;;; +121F;ETHIOPIC SYLLABLE MWA;Lo;0;L;;;;;N;;;;; +1220;ETHIOPIC SYLLABLE SZA;Lo;0;L;;;;;N;;;;; +1221;ETHIOPIC SYLLABLE SZU;Lo;0;L;;;;;N;;;;; +1222;ETHIOPIC SYLLABLE SZI;Lo;0;L;;;;;N;;;;; +1223;ETHIOPIC SYLLABLE SZAA;Lo;0;L;;;;;N;;;;; +1224;ETHIOPIC SYLLABLE SZEE;Lo;0;L;;;;;N;;;;; +1225;ETHIOPIC SYLLABLE SZE;Lo;0;L;;;;;N;;;;; +1226;ETHIOPIC SYLLABLE SZO;Lo;0;L;;;;;N;;;;; +1227;ETHIOPIC SYLLABLE SZWA;Lo;0;L;;;;;N;;;;; +1228;ETHIOPIC SYLLABLE RA;Lo;0;L;;;;;N;;;;; +1229;ETHIOPIC SYLLABLE RU;Lo;0;L;;;;;N;;;;; +122A;ETHIOPIC SYLLABLE RI;Lo;0;L;;;;;N;;;;; +122B;ETHIOPIC SYLLABLE RAA;Lo;0;L;;;;;N;;;;; +122C;ETHIOPIC SYLLABLE REE;Lo;0;L;;;;;N;;;;; +122D;ETHIOPIC SYLLABLE RE;Lo;0;L;;;;;N;;;;; +122E;ETHIOPIC SYLLABLE RO;Lo;0;L;;;;;N;;;;; +122F;ETHIOPIC SYLLABLE RWA;Lo;0;L;;;;;N;;;;; +1230;ETHIOPIC SYLLABLE SA;Lo;0;L;;;;;N;;;;; +1231;ETHIOPIC SYLLABLE SU;Lo;0;L;;;;;N;;;;; +1232;ETHIOPIC SYLLABLE SI;Lo;0;L;;;;;N;;;;; +1233;ETHIOPIC SYLLABLE SAA;Lo;0;L;;;;;N;;;;; +1234;ETHIOPIC SYLLABLE SEE;Lo;0;L;;;;;N;;;;; +1235;ETHIOPIC SYLLABLE SE;Lo;0;L;;;;;N;;;;; +1236;ETHIOPIC SYLLABLE SO;Lo;0;L;;;;;N;;;;; +1237;ETHIOPIC SYLLABLE SWA;Lo;0;L;;;;;N;;;;; +1238;ETHIOPIC SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +1239;ETHIOPIC SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +123A;ETHIOPIC SYLLABLE SHI;Lo;0;L;;;;;N;;;;; +123B;ETHIOPIC SYLLABLE SHAA;Lo;0;L;;;;;N;;;;; +123C;ETHIOPIC SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; +123D;ETHIOPIC SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +123E;ETHIOPIC SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +123F;ETHIOPIC SYLLABLE SHWA;Lo;0;L;;;;;N;;;;; +1240;ETHIOPIC SYLLABLE QA;Lo;0;L;;;;;N;;;;; +1241;ETHIOPIC SYLLABLE QU;Lo;0;L;;;;;N;;;;; +1242;ETHIOPIC SYLLABLE QI;Lo;0;L;;;;;N;;;;; +1243;ETHIOPIC SYLLABLE QAA;Lo;0;L;;;;;N;;;;; +1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;; +1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;; +1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;; +1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;; +124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;; +124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;; +124C;ETHIOPIC SYLLABLE QWEE;Lo;0;L;;;;;N;;;;; +124D;ETHIOPIC SYLLABLE QWE;Lo;0;L;;;;;N;;;;; +1250;ETHIOPIC SYLLABLE QHA;Lo;0;L;;;;;N;;;;; +1251;ETHIOPIC SYLLABLE QHU;Lo;0;L;;;;;N;;;;; +1252;ETHIOPIC SYLLABLE QHI;Lo;0;L;;;;;N;;;;; +1253;ETHIOPIC SYLLABLE QHAA;Lo;0;L;;;;;N;;;;; +1254;ETHIOPIC SYLLABLE QHEE;Lo;0;L;;;;;N;;;;; +1255;ETHIOPIC SYLLABLE QHE;Lo;0;L;;;;;N;;;;; +1256;ETHIOPIC SYLLABLE QHO;Lo;0;L;;;;;N;;;;; +1258;ETHIOPIC SYLLABLE QHWA;Lo;0;L;;;;;N;;;;; +125A;ETHIOPIC SYLLABLE QHWI;Lo;0;L;;;;;N;;;;; +125B;ETHIOPIC SYLLABLE QHWAA;Lo;0;L;;;;;N;;;;; +125C;ETHIOPIC SYLLABLE QHWEE;Lo;0;L;;;;;N;;;;; +125D;ETHIOPIC SYLLABLE QHWE;Lo;0;L;;;;;N;;;;; +1260;ETHIOPIC SYLLABLE BA;Lo;0;L;;;;;N;;;;; +1261;ETHIOPIC SYLLABLE BU;Lo;0;L;;;;;N;;;;; +1262;ETHIOPIC SYLLABLE BI;Lo;0;L;;;;;N;;;;; +1263;ETHIOPIC SYLLABLE BAA;Lo;0;L;;;;;N;;;;; +1264;ETHIOPIC SYLLABLE BEE;Lo;0;L;;;;;N;;;;; +1265;ETHIOPIC SYLLABLE BE;Lo;0;L;;;;;N;;;;; +1266;ETHIOPIC SYLLABLE BO;Lo;0;L;;;;;N;;;;; +1267;ETHIOPIC SYLLABLE BWA;Lo;0;L;;;;;N;;;;; +1268;ETHIOPIC SYLLABLE VA;Lo;0;L;;;;;N;;;;; +1269;ETHIOPIC SYLLABLE VU;Lo;0;L;;;;;N;;;;; +126A;ETHIOPIC SYLLABLE VI;Lo;0;L;;;;;N;;;;; +126B;ETHIOPIC SYLLABLE VAA;Lo;0;L;;;;;N;;;;; +126C;ETHIOPIC SYLLABLE VEE;Lo;0;L;;;;;N;;;;; +126D;ETHIOPIC SYLLABLE VE;Lo;0;L;;;;;N;;;;; +126E;ETHIOPIC SYLLABLE VO;Lo;0;L;;;;;N;;;;; +126F;ETHIOPIC SYLLABLE VWA;Lo;0;L;;;;;N;;;;; +1270;ETHIOPIC SYLLABLE TA;Lo;0;L;;;;;N;;;;; +1271;ETHIOPIC SYLLABLE TU;Lo;0;L;;;;;N;;;;; +1272;ETHIOPIC SYLLABLE TI;Lo;0;L;;;;;N;;;;; +1273;ETHIOPIC SYLLABLE TAA;Lo;0;L;;;;;N;;;;; +1274;ETHIOPIC SYLLABLE TEE;Lo;0;L;;;;;N;;;;; +1275;ETHIOPIC SYLLABLE TE;Lo;0;L;;;;;N;;;;; +1276;ETHIOPIC SYLLABLE TO;Lo;0;L;;;;;N;;;;; +1277;ETHIOPIC SYLLABLE TWA;Lo;0;L;;;;;N;;;;; +1278;ETHIOPIC SYLLABLE CA;Lo;0;L;;;;;N;;;;; +1279;ETHIOPIC SYLLABLE CU;Lo;0;L;;;;;N;;;;; +127A;ETHIOPIC SYLLABLE CI;Lo;0;L;;;;;N;;;;; +127B;ETHIOPIC SYLLABLE CAA;Lo;0;L;;;;;N;;;;; +127C;ETHIOPIC SYLLABLE CEE;Lo;0;L;;;;;N;;;;; +127D;ETHIOPIC SYLLABLE CE;Lo;0;L;;;;;N;;;;; +127E;ETHIOPIC SYLLABLE CO;Lo;0;L;;;;;N;;;;; +127F;ETHIOPIC SYLLABLE CWA;Lo;0;L;;;;;N;;;;; +1280;ETHIOPIC SYLLABLE XA;Lo;0;L;;;;;N;;;;; +1281;ETHIOPIC SYLLABLE XU;Lo;0;L;;;;;N;;;;; +1282;ETHIOPIC SYLLABLE XI;Lo;0;L;;;;;N;;;;; +1283;ETHIOPIC SYLLABLE XAA;Lo;0;L;;;;;N;;;;; +1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;; +1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;; +1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;; +1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;; +128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;; +128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;; +128C;ETHIOPIC SYLLABLE XWEE;Lo;0;L;;;;;N;;;;; +128D;ETHIOPIC SYLLABLE XWE;Lo;0;L;;;;;N;;;;; +1290;ETHIOPIC SYLLABLE NA;Lo;0;L;;;;;N;;;;; +1291;ETHIOPIC SYLLABLE NU;Lo;0;L;;;;;N;;;;; +1292;ETHIOPIC SYLLABLE NI;Lo;0;L;;;;;N;;;;; +1293;ETHIOPIC SYLLABLE NAA;Lo;0;L;;;;;N;;;;; +1294;ETHIOPIC SYLLABLE NEE;Lo;0;L;;;;;N;;;;; +1295;ETHIOPIC SYLLABLE NE;Lo;0;L;;;;;N;;;;; +1296;ETHIOPIC SYLLABLE NO;Lo;0;L;;;;;N;;;;; +1297;ETHIOPIC SYLLABLE NWA;Lo;0;L;;;;;N;;;;; +1298;ETHIOPIC SYLLABLE NYA;Lo;0;L;;;;;N;;;;; +1299;ETHIOPIC SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +129A;ETHIOPIC SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +129B;ETHIOPIC SYLLABLE NYAA;Lo;0;L;;;;;N;;;;; +129C;ETHIOPIC SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; +129D;ETHIOPIC SYLLABLE NYE;Lo;0;L;;;;;N;;;;; +129E;ETHIOPIC SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +129F;ETHIOPIC SYLLABLE NYWA;Lo;0;L;;;;;N;;;;; +12A0;ETHIOPIC SYLLABLE GLOTTAL A;Lo;0;L;;;;;N;;;;; +12A1;ETHIOPIC SYLLABLE GLOTTAL U;Lo;0;L;;;;;N;;;;; +12A2;ETHIOPIC SYLLABLE GLOTTAL I;Lo;0;L;;;;;N;;;;; +12A3;ETHIOPIC SYLLABLE GLOTTAL AA;Lo;0;L;;;;;N;;;;; +12A4;ETHIOPIC SYLLABLE GLOTTAL EE;Lo;0;L;;;;;N;;;;; +12A5;ETHIOPIC SYLLABLE GLOTTAL E;Lo;0;L;;;;;N;;;;; +12A6;ETHIOPIC SYLLABLE GLOTTAL O;Lo;0;L;;;;;N;;;;; +12A7;ETHIOPIC SYLLABLE GLOTTAL WA;Lo;0;L;;;;;N;;;;; +12A8;ETHIOPIC SYLLABLE KA;Lo;0;L;;;;;N;;;;; +12A9;ETHIOPIC SYLLABLE KU;Lo;0;L;;;;;N;;;;; +12AA;ETHIOPIC SYLLABLE KI;Lo;0;L;;;;;N;;;;; +12AB;ETHIOPIC SYLLABLE KAA;Lo;0;L;;;;;N;;;;; +12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;; +12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;; +12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;; +12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;; +12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;; +12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;; +12B4;ETHIOPIC SYLLABLE KWEE;Lo;0;L;;;;;N;;;;; +12B5;ETHIOPIC SYLLABLE KWE;Lo;0;L;;;;;N;;;;; +12B8;ETHIOPIC SYLLABLE KXA;Lo;0;L;;;;;N;;;;; +12B9;ETHIOPIC SYLLABLE KXU;Lo;0;L;;;;;N;;;;; +12BA;ETHIOPIC SYLLABLE KXI;Lo;0;L;;;;;N;;;;; +12BB;ETHIOPIC SYLLABLE KXAA;Lo;0;L;;;;;N;;;;; +12BC;ETHIOPIC SYLLABLE KXEE;Lo;0;L;;;;;N;;;;; +12BD;ETHIOPIC SYLLABLE KXE;Lo;0;L;;;;;N;;;;; +12BE;ETHIOPIC SYLLABLE KXO;Lo;0;L;;;;;N;;;;; +12C0;ETHIOPIC SYLLABLE KXWA;Lo;0;L;;;;;N;;;;; +12C2;ETHIOPIC SYLLABLE KXWI;Lo;0;L;;;;;N;;;;; +12C3;ETHIOPIC SYLLABLE KXWAA;Lo;0;L;;;;;N;;;;; +12C4;ETHIOPIC SYLLABLE KXWEE;Lo;0;L;;;;;N;;;;; +12C5;ETHIOPIC SYLLABLE KXWE;Lo;0;L;;;;;N;;;;; +12C8;ETHIOPIC SYLLABLE WA;Lo;0;L;;;;;N;;;;; +12C9;ETHIOPIC SYLLABLE WU;Lo;0;L;;;;;N;;;;; +12CA;ETHIOPIC SYLLABLE WI;Lo;0;L;;;;;N;;;;; +12CB;ETHIOPIC SYLLABLE WAA;Lo;0;L;;;;;N;;;;; +12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;; +12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;; +12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;; +12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;; +12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;; +12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;; +12D3;ETHIOPIC SYLLABLE PHARYNGEAL AA;Lo;0;L;;;;;N;;;;; +12D4;ETHIOPIC SYLLABLE PHARYNGEAL EE;Lo;0;L;;;;;N;;;;; +12D5;ETHIOPIC SYLLABLE PHARYNGEAL E;Lo;0;L;;;;;N;;;;; +12D6;ETHIOPIC SYLLABLE PHARYNGEAL O;Lo;0;L;;;;;N;;;;; +12D8;ETHIOPIC SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +12D9;ETHIOPIC SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +12DA;ETHIOPIC SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +12DB;ETHIOPIC SYLLABLE ZAA;Lo;0;L;;;;;N;;;;; +12DC;ETHIOPIC SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; +12DD;ETHIOPIC SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +12DE;ETHIOPIC SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +12DF;ETHIOPIC SYLLABLE ZWA;Lo;0;L;;;;;N;;;;; +12E0;ETHIOPIC SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +12E1;ETHIOPIC SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +12E2;ETHIOPIC SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; +12E3;ETHIOPIC SYLLABLE ZHAA;Lo;0;L;;;;;N;;;;; +12E4;ETHIOPIC SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; +12E5;ETHIOPIC SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +12E6;ETHIOPIC SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +12E7;ETHIOPIC SYLLABLE ZHWA;Lo;0;L;;;;;N;;;;; +12E8;ETHIOPIC SYLLABLE YA;Lo;0;L;;;;;N;;;;; +12E9;ETHIOPIC SYLLABLE YU;Lo;0;L;;;;;N;;;;; +12EA;ETHIOPIC SYLLABLE YI;Lo;0;L;;;;;N;;;;; +12EB;ETHIOPIC SYLLABLE YAA;Lo;0;L;;;;;N;;;;; +12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;; +12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;; +12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;; +12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;; +12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;; +12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;; +12F3;ETHIOPIC SYLLABLE DAA;Lo;0;L;;;;;N;;;;; +12F4;ETHIOPIC SYLLABLE DEE;Lo;0;L;;;;;N;;;;; +12F5;ETHIOPIC SYLLABLE DE;Lo;0;L;;;;;N;;;;; +12F6;ETHIOPIC SYLLABLE DO;Lo;0;L;;;;;N;;;;; +12F7;ETHIOPIC SYLLABLE DWA;Lo;0;L;;;;;N;;;;; +12F8;ETHIOPIC SYLLABLE DDA;Lo;0;L;;;;;N;;;;; +12F9;ETHIOPIC SYLLABLE DDU;Lo;0;L;;;;;N;;;;; +12FA;ETHIOPIC SYLLABLE DDI;Lo;0;L;;;;;N;;;;; +12FB;ETHIOPIC SYLLABLE DDAA;Lo;0;L;;;;;N;;;;; +12FC;ETHIOPIC SYLLABLE DDEE;Lo;0;L;;;;;N;;;;; +12FD;ETHIOPIC SYLLABLE DDE;Lo;0;L;;;;;N;;;;; +12FE;ETHIOPIC SYLLABLE DDO;Lo;0;L;;;;;N;;;;; +12FF;ETHIOPIC SYLLABLE DDWA;Lo;0;L;;;;;N;;;;; +1300;ETHIOPIC SYLLABLE JA;Lo;0;L;;;;;N;;;;; +1301;ETHIOPIC SYLLABLE JU;Lo;0;L;;;;;N;;;;; +1302;ETHIOPIC SYLLABLE JI;Lo;0;L;;;;;N;;;;; +1303;ETHIOPIC SYLLABLE JAA;Lo;0;L;;;;;N;;;;; +1304;ETHIOPIC SYLLABLE JEE;Lo;0;L;;;;;N;;;;; +1305;ETHIOPIC SYLLABLE JE;Lo;0;L;;;;;N;;;;; +1306;ETHIOPIC SYLLABLE JO;Lo;0;L;;;;;N;;;;; +1307;ETHIOPIC SYLLABLE JWA;Lo;0;L;;;;;N;;;;; +1308;ETHIOPIC SYLLABLE GA;Lo;0;L;;;;;N;;;;; +1309;ETHIOPIC SYLLABLE GU;Lo;0;L;;;;;N;;;;; +130A;ETHIOPIC SYLLABLE GI;Lo;0;L;;;;;N;;;;; +130B;ETHIOPIC SYLLABLE GAA;Lo;0;L;;;;;N;;;;; +130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;; +130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;; +130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;; +1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;; +1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;; +1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;; +1314;ETHIOPIC SYLLABLE GWEE;Lo;0;L;;;;;N;;;;; +1315;ETHIOPIC SYLLABLE GWE;Lo;0;L;;;;;N;;;;; +1318;ETHIOPIC SYLLABLE GGA;Lo;0;L;;;;;N;;;;; +1319;ETHIOPIC SYLLABLE GGU;Lo;0;L;;;;;N;;;;; +131A;ETHIOPIC SYLLABLE GGI;Lo;0;L;;;;;N;;;;; +131B;ETHIOPIC SYLLABLE GGAA;Lo;0;L;;;;;N;;;;; +131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;; +131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;; +131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;; +1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;; +1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;; +1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;; +1323;ETHIOPIC SYLLABLE THAA;Lo;0;L;;;;;N;;;;; +1324;ETHIOPIC SYLLABLE THEE;Lo;0;L;;;;;N;;;;; +1325;ETHIOPIC SYLLABLE THE;Lo;0;L;;;;;N;;;;; +1326;ETHIOPIC SYLLABLE THO;Lo;0;L;;;;;N;;;;; +1327;ETHIOPIC SYLLABLE THWA;Lo;0;L;;;;;N;;;;; +1328;ETHIOPIC SYLLABLE CHA;Lo;0;L;;;;;N;;;;; +1329;ETHIOPIC SYLLABLE CHU;Lo;0;L;;;;;N;;;;; +132A;ETHIOPIC SYLLABLE CHI;Lo;0;L;;;;;N;;;;; +132B;ETHIOPIC SYLLABLE CHAA;Lo;0;L;;;;;N;;;;; +132C;ETHIOPIC SYLLABLE CHEE;Lo;0;L;;;;;N;;;;; +132D;ETHIOPIC SYLLABLE CHE;Lo;0;L;;;;;N;;;;; +132E;ETHIOPIC SYLLABLE CHO;Lo;0;L;;;;;N;;;;; +132F;ETHIOPIC SYLLABLE CHWA;Lo;0;L;;;;;N;;;;; +1330;ETHIOPIC SYLLABLE PHA;Lo;0;L;;;;;N;;;;; +1331;ETHIOPIC SYLLABLE PHU;Lo;0;L;;;;;N;;;;; +1332;ETHIOPIC SYLLABLE PHI;Lo;0;L;;;;;N;;;;; +1333;ETHIOPIC SYLLABLE PHAA;Lo;0;L;;;;;N;;;;; +1334;ETHIOPIC SYLLABLE PHEE;Lo;0;L;;;;;N;;;;; +1335;ETHIOPIC SYLLABLE PHE;Lo;0;L;;;;;N;;;;; +1336;ETHIOPIC SYLLABLE PHO;Lo;0;L;;;;;N;;;;; +1337;ETHIOPIC SYLLABLE PHWA;Lo;0;L;;;;;N;;;;; +1338;ETHIOPIC SYLLABLE TSA;Lo;0;L;;;;;N;;;;; +1339;ETHIOPIC SYLLABLE TSU;Lo;0;L;;;;;N;;;;; +133A;ETHIOPIC SYLLABLE TSI;Lo;0;L;;;;;N;;;;; +133B;ETHIOPIC SYLLABLE TSAA;Lo;0;L;;;;;N;;;;; +133C;ETHIOPIC SYLLABLE TSEE;Lo;0;L;;;;;N;;;;; +133D;ETHIOPIC SYLLABLE TSE;Lo;0;L;;;;;N;;;;; +133E;ETHIOPIC SYLLABLE TSO;Lo;0;L;;;;;N;;;;; +133F;ETHIOPIC SYLLABLE TSWA;Lo;0;L;;;;;N;;;;; +1340;ETHIOPIC SYLLABLE TZA;Lo;0;L;;;;;N;;;;; +1341;ETHIOPIC SYLLABLE TZU;Lo;0;L;;;;;N;;;;; +1342;ETHIOPIC SYLLABLE TZI;Lo;0;L;;;;;N;;;;; +1343;ETHIOPIC SYLLABLE TZAA;Lo;0;L;;;;;N;;;;; +1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;; +1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;; +1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;; +1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;; +1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;; +134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;; +134B;ETHIOPIC SYLLABLE FAA;Lo;0;L;;;;;N;;;;; +134C;ETHIOPIC SYLLABLE FEE;Lo;0;L;;;;;N;;;;; +134D;ETHIOPIC SYLLABLE FE;Lo;0;L;;;;;N;;;;; +134E;ETHIOPIC SYLLABLE FO;Lo;0;L;;;;;N;;;;; +134F;ETHIOPIC SYLLABLE FWA;Lo;0;L;;;;;N;;;;; +1350;ETHIOPIC SYLLABLE PA;Lo;0;L;;;;;N;;;;; +1351;ETHIOPIC SYLLABLE PU;Lo;0;L;;;;;N;;;;; +1352;ETHIOPIC SYLLABLE PI;Lo;0;L;;;;;N;;;;; +1353;ETHIOPIC SYLLABLE PAA;Lo;0;L;;;;;N;;;;; +1354;ETHIOPIC SYLLABLE PEE;Lo;0;L;;;;;N;;;;; +1355;ETHIOPIC SYLLABLE PE;Lo;0;L;;;;;N;;;;; +1356;ETHIOPIC SYLLABLE PO;Lo;0;L;;;;;N;;;;; +1357;ETHIOPIC SYLLABLE PWA;Lo;0;L;;;;;N;;;;; +1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;; +1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;; +135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;; +1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;; +1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;; +1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;; +1364;ETHIOPIC SEMICOLON;Po;0;L;;;;;N;;;;; +1365;ETHIOPIC COLON;Po;0;L;;;;;N;;;;; +1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;; +1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;; +1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; +1369;ETHIOPIC DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +136A;ETHIOPIC DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +136B;ETHIOPIC DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +136C;ETHIOPIC DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +136D;ETHIOPIC DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +136E;ETHIOPIC DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +136F;ETHIOPIC DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1370;ETHIOPIC DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1371;ETHIOPIC DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;; +1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; +1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; +1375;ETHIOPIC NUMBER FORTY;No;0;L;;;;40;N;;;;; +1376;ETHIOPIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; +1377;ETHIOPIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; +1378;ETHIOPIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +1379;ETHIOPIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;; +137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;; +137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; +13A0;CHEROKEE LETTER A;Lo;0;L;;;;;N;;;;; +13A1;CHEROKEE LETTER E;Lo;0;L;;;;;N;;;;; +13A2;CHEROKEE LETTER I;Lo;0;L;;;;;N;;;;; +13A3;CHEROKEE LETTER O;Lo;0;L;;;;;N;;;;; +13A4;CHEROKEE LETTER U;Lo;0;L;;;;;N;;;;; +13A5;CHEROKEE LETTER V;Lo;0;L;;;;;N;;;;; +13A6;CHEROKEE LETTER GA;Lo;0;L;;;;;N;;;;; +13A7;CHEROKEE LETTER KA;Lo;0;L;;;;;N;;;;; +13A8;CHEROKEE LETTER GE;Lo;0;L;;;;;N;;;;; +13A9;CHEROKEE LETTER GI;Lo;0;L;;;;;N;;;;; +13AA;CHEROKEE LETTER GO;Lo;0;L;;;;;N;;;;; +13AB;CHEROKEE LETTER GU;Lo;0;L;;;;;N;;;;; +13AC;CHEROKEE LETTER GV;Lo;0;L;;;;;N;;;;; +13AD;CHEROKEE LETTER HA;Lo;0;L;;;;;N;;;;; +13AE;CHEROKEE LETTER HE;Lo;0;L;;;;;N;;;;; +13AF;CHEROKEE LETTER HI;Lo;0;L;;;;;N;;;;; +13B0;CHEROKEE LETTER HO;Lo;0;L;;;;;N;;;;; +13B1;CHEROKEE LETTER HU;Lo;0;L;;;;;N;;;;; +13B2;CHEROKEE LETTER HV;Lo;0;L;;;;;N;;;;; +13B3;CHEROKEE LETTER LA;Lo;0;L;;;;;N;;;;; +13B4;CHEROKEE LETTER LE;Lo;0;L;;;;;N;;;;; +13B5;CHEROKEE LETTER LI;Lo;0;L;;;;;N;;;;; +13B6;CHEROKEE LETTER LO;Lo;0;L;;;;;N;;;;; +13B7;CHEROKEE LETTER LU;Lo;0;L;;;;;N;;;;; +13B8;CHEROKEE LETTER LV;Lo;0;L;;;;;N;;;;; +13B9;CHEROKEE LETTER MA;Lo;0;L;;;;;N;;;;; +13BA;CHEROKEE LETTER ME;Lo;0;L;;;;;N;;;;; +13BB;CHEROKEE LETTER MI;Lo;0;L;;;;;N;;;;; +13BC;CHEROKEE LETTER MO;Lo;0;L;;;;;N;;;;; +13BD;CHEROKEE LETTER MU;Lo;0;L;;;;;N;;;;; +13BE;CHEROKEE LETTER NA;Lo;0;L;;;;;N;;;;; +13BF;CHEROKEE LETTER HNA;Lo;0;L;;;;;N;;;;; +13C0;CHEROKEE LETTER NAH;Lo;0;L;;;;;N;;;;; +13C1;CHEROKEE LETTER NE;Lo;0;L;;;;;N;;;;; +13C2;CHEROKEE LETTER NI;Lo;0;L;;;;;N;;;;; +13C3;CHEROKEE LETTER NO;Lo;0;L;;;;;N;;;;; +13C4;CHEROKEE LETTER NU;Lo;0;L;;;;;N;;;;; +13C5;CHEROKEE LETTER NV;Lo;0;L;;;;;N;;;;; +13C6;CHEROKEE LETTER QUA;Lo;0;L;;;;;N;;;;; +13C7;CHEROKEE LETTER QUE;Lo;0;L;;;;;N;;;;; +13C8;CHEROKEE LETTER QUI;Lo;0;L;;;;;N;;;;; +13C9;CHEROKEE LETTER QUO;Lo;0;L;;;;;N;;;;; +13CA;CHEROKEE LETTER QUU;Lo;0;L;;;;;N;;;;; +13CB;CHEROKEE LETTER QUV;Lo;0;L;;;;;N;;;;; +13CC;CHEROKEE LETTER SA;Lo;0;L;;;;;N;;;;; +13CD;CHEROKEE LETTER S;Lo;0;L;;;;;N;;;;; +13CE;CHEROKEE LETTER SE;Lo;0;L;;;;;N;;;;; +13CF;CHEROKEE LETTER SI;Lo;0;L;;;;;N;;;;; +13D0;CHEROKEE LETTER SO;Lo;0;L;;;;;N;;;;; +13D1;CHEROKEE LETTER SU;Lo;0;L;;;;;N;;;;; +13D2;CHEROKEE LETTER SV;Lo;0;L;;;;;N;;;;; +13D3;CHEROKEE LETTER DA;Lo;0;L;;;;;N;;;;; +13D4;CHEROKEE LETTER TA;Lo;0;L;;;;;N;;;;; +13D5;CHEROKEE LETTER DE;Lo;0;L;;;;;N;;;;; +13D6;CHEROKEE LETTER TE;Lo;0;L;;;;;N;;;;; +13D7;CHEROKEE LETTER DI;Lo;0;L;;;;;N;;;;; +13D8;CHEROKEE LETTER TI;Lo;0;L;;;;;N;;;;; +13D9;CHEROKEE LETTER DO;Lo;0;L;;;;;N;;;;; +13DA;CHEROKEE LETTER DU;Lo;0;L;;;;;N;;;;; +13DB;CHEROKEE LETTER DV;Lo;0;L;;;;;N;;;;; +13DC;CHEROKEE LETTER DLA;Lo;0;L;;;;;N;;;;; +13DD;CHEROKEE LETTER TLA;Lo;0;L;;;;;N;;;;; +13DE;CHEROKEE LETTER TLE;Lo;0;L;;;;;N;;;;; +13DF;CHEROKEE LETTER TLI;Lo;0;L;;;;;N;;;;; +13E0;CHEROKEE LETTER TLO;Lo;0;L;;;;;N;;;;; +13E1;CHEROKEE LETTER TLU;Lo;0;L;;;;;N;;;;; +13E2;CHEROKEE LETTER TLV;Lo;0;L;;;;;N;;;;; +13E3;CHEROKEE LETTER TSA;Lo;0;L;;;;;N;;;;; +13E4;CHEROKEE LETTER TSE;Lo;0;L;;;;;N;;;;; +13E5;CHEROKEE LETTER TSI;Lo;0;L;;;;;N;;;;; +13E6;CHEROKEE LETTER TSO;Lo;0;L;;;;;N;;;;; +13E7;CHEROKEE LETTER TSU;Lo;0;L;;;;;N;;;;; +13E8;CHEROKEE LETTER TSV;Lo;0;L;;;;;N;;;;; +13E9;CHEROKEE LETTER WA;Lo;0;L;;;;;N;;;;; +13EA;CHEROKEE LETTER WE;Lo;0;L;;;;;N;;;;; +13EB;CHEROKEE LETTER WI;Lo;0;L;;;;;N;;;;; +13EC;CHEROKEE LETTER WO;Lo;0;L;;;;;N;;;;; +13ED;CHEROKEE LETTER WU;Lo;0;L;;;;;N;;;;; +13EE;CHEROKEE LETTER WV;Lo;0;L;;;;;N;;;;; +13EF;CHEROKEE LETTER YA;Lo;0;L;;;;;N;;;;; +13F0;CHEROKEE LETTER YE;Lo;0;L;;;;;N;;;;; +13F1;CHEROKEE LETTER YI;Lo;0;L;;;;;N;;;;; +13F2;CHEROKEE LETTER YO;Lo;0;L;;;;;N;;;;; +13F3;CHEROKEE LETTER YU;Lo;0;L;;;;;N;;;;; +13F4;CHEROKEE LETTER YV;Lo;0;L;;;;;N;;;;; +1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;; +1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;; +1403;CANADIAN SYLLABICS I;Lo;0;L;;;;;N;;;;; +1404;CANADIAN SYLLABICS II;Lo;0;L;;;;;N;;;;; +1405;CANADIAN SYLLABICS O;Lo;0;L;;;;;N;;;;; +1406;CANADIAN SYLLABICS OO;Lo;0;L;;;;;N;;;;; +1407;CANADIAN SYLLABICS Y-CREE OO;Lo;0;L;;;;;N;;;;; +1408;CANADIAN SYLLABICS CARRIER EE;Lo;0;L;;;;;N;;;;; +1409;CANADIAN SYLLABICS CARRIER I;Lo;0;L;;;;;N;;;;; +140A;CANADIAN SYLLABICS A;Lo;0;L;;;;;N;;;;; +140B;CANADIAN SYLLABICS AA;Lo;0;L;;;;;N;;;;; +140C;CANADIAN SYLLABICS WE;Lo;0;L;;;;;N;;;;; +140D;CANADIAN SYLLABICS WEST-CREE WE;Lo;0;L;;;;;N;;;;; +140E;CANADIAN SYLLABICS WI;Lo;0;L;;;;;N;;;;; +140F;CANADIAN SYLLABICS WEST-CREE WI;Lo;0;L;;;;;N;;;;; +1410;CANADIAN SYLLABICS WII;Lo;0;L;;;;;N;;;;; +1411;CANADIAN SYLLABICS WEST-CREE WII;Lo;0;L;;;;;N;;;;; +1412;CANADIAN SYLLABICS WO;Lo;0;L;;;;;N;;;;; +1413;CANADIAN SYLLABICS WEST-CREE WO;Lo;0;L;;;;;N;;;;; +1414;CANADIAN SYLLABICS WOO;Lo;0;L;;;;;N;;;;; +1415;CANADIAN SYLLABICS WEST-CREE WOO;Lo;0;L;;;;;N;;;;; +1416;CANADIAN SYLLABICS NASKAPI WOO;Lo;0;L;;;;;N;;;;; +1417;CANADIAN SYLLABICS WA;Lo;0;L;;;;;N;;;;; +1418;CANADIAN SYLLABICS WEST-CREE WA;Lo;0;L;;;;;N;;;;; +1419;CANADIAN SYLLABICS WAA;Lo;0;L;;;;;N;;;;; +141A;CANADIAN SYLLABICS WEST-CREE WAA;Lo;0;L;;;;;N;;;;; +141B;CANADIAN SYLLABICS NASKAPI WAA;Lo;0;L;;;;;N;;;;; +141C;CANADIAN SYLLABICS AI;Lo;0;L;;;;;N;;;;; +141D;CANADIAN SYLLABICS Y-CREE W;Lo;0;L;;;;;N;;;;; +141E;CANADIAN SYLLABICS GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +141F;CANADIAN SYLLABICS FINAL ACUTE;Lo;0;L;;;;;N;;;;; +1420;CANADIAN SYLLABICS FINAL GRAVE;Lo;0;L;;;;;N;;;;; +1421;CANADIAN SYLLABICS FINAL BOTTOM HALF RING;Lo;0;L;;;;;N;;;;; +1422;CANADIAN SYLLABICS FINAL TOP HALF RING;Lo;0;L;;;;;N;;;;; +1423;CANADIAN SYLLABICS FINAL RIGHT HALF RING;Lo;0;L;;;;;N;;;;; +1424;CANADIAN SYLLABICS FINAL RING;Lo;0;L;;;;;N;;;;; +1425;CANADIAN SYLLABICS FINAL DOUBLE ACUTE;Lo;0;L;;;;;N;;;;; +1426;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES;Lo;0;L;;;;;N;;;;; +1427;CANADIAN SYLLABICS FINAL MIDDLE DOT;Lo;0;L;;;;;N;;;;; +1428;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE;Lo;0;L;;;;;N;;;;; +1429;CANADIAN SYLLABICS FINAL PLUS;Lo;0;L;;;;;N;;;;; +142A;CANADIAN SYLLABICS FINAL DOWN TACK;Lo;0;L;;;;;N;;;;; +142B;CANADIAN SYLLABICS EN;Lo;0;L;;;;;N;;;;; +142C;CANADIAN SYLLABICS IN;Lo;0;L;;;;;N;;;;; +142D;CANADIAN SYLLABICS ON;Lo;0;L;;;;;N;;;;; +142E;CANADIAN SYLLABICS AN;Lo;0;L;;;;;N;;;;; +142F;CANADIAN SYLLABICS PE;Lo;0;L;;;;;N;;;;; +1430;CANADIAN SYLLABICS PAAI;Lo;0;L;;;;;N;;;;; +1431;CANADIAN SYLLABICS PI;Lo;0;L;;;;;N;;;;; +1432;CANADIAN SYLLABICS PII;Lo;0;L;;;;;N;;;;; +1433;CANADIAN SYLLABICS PO;Lo;0;L;;;;;N;;;;; +1434;CANADIAN SYLLABICS POO;Lo;0;L;;;;;N;;;;; +1435;CANADIAN SYLLABICS Y-CREE POO;Lo;0;L;;;;;N;;;;; +1436;CANADIAN SYLLABICS CARRIER HEE;Lo;0;L;;;;;N;;;;; +1437;CANADIAN SYLLABICS CARRIER HI;Lo;0;L;;;;;N;;;;; +1438;CANADIAN SYLLABICS PA;Lo;0;L;;;;;N;;;;; +1439;CANADIAN SYLLABICS PAA;Lo;0;L;;;;;N;;;;; +143A;CANADIAN SYLLABICS PWE;Lo;0;L;;;;;N;;;;; +143B;CANADIAN SYLLABICS WEST-CREE PWE;Lo;0;L;;;;;N;;;;; +143C;CANADIAN SYLLABICS PWI;Lo;0;L;;;;;N;;;;; +143D;CANADIAN SYLLABICS WEST-CREE PWI;Lo;0;L;;;;;N;;;;; +143E;CANADIAN SYLLABICS PWII;Lo;0;L;;;;;N;;;;; +143F;CANADIAN SYLLABICS WEST-CREE PWII;Lo;0;L;;;;;N;;;;; +1440;CANADIAN SYLLABICS PWO;Lo;0;L;;;;;N;;;;; +1441;CANADIAN SYLLABICS WEST-CREE PWO;Lo;0;L;;;;;N;;;;; +1442;CANADIAN SYLLABICS PWOO;Lo;0;L;;;;;N;;;;; +1443;CANADIAN SYLLABICS WEST-CREE PWOO;Lo;0;L;;;;;N;;;;; +1444;CANADIAN SYLLABICS PWA;Lo;0;L;;;;;N;;;;; +1445;CANADIAN SYLLABICS WEST-CREE PWA;Lo;0;L;;;;;N;;;;; +1446;CANADIAN SYLLABICS PWAA;Lo;0;L;;;;;N;;;;; +1447;CANADIAN SYLLABICS WEST-CREE PWAA;Lo;0;L;;;;;N;;;;; +1448;CANADIAN SYLLABICS Y-CREE PWAA;Lo;0;L;;;;;N;;;;; +1449;CANADIAN SYLLABICS P;Lo;0;L;;;;;N;;;;; +144A;CANADIAN SYLLABICS WEST-CREE P;Lo;0;L;;;;;N;;;;; +144B;CANADIAN SYLLABICS CARRIER H;Lo;0;L;;;;;N;;;;; +144C;CANADIAN SYLLABICS TE;Lo;0;L;;;;;N;;;;; +144D;CANADIAN SYLLABICS TAAI;Lo;0;L;;;;;N;;;;; +144E;CANADIAN SYLLABICS TI;Lo;0;L;;;;;N;;;;; +144F;CANADIAN SYLLABICS TII;Lo;0;L;;;;;N;;;;; +1450;CANADIAN SYLLABICS TO;Lo;0;L;;;;;N;;;;; +1451;CANADIAN SYLLABICS TOO;Lo;0;L;;;;;N;;;;; +1452;CANADIAN SYLLABICS Y-CREE TOO;Lo;0;L;;;;;N;;;;; +1453;CANADIAN SYLLABICS CARRIER DEE;Lo;0;L;;;;;N;;;;; +1454;CANADIAN SYLLABICS CARRIER DI;Lo;0;L;;;;;N;;;;; +1455;CANADIAN SYLLABICS TA;Lo;0;L;;;;;N;;;;; +1456;CANADIAN SYLLABICS TAA;Lo;0;L;;;;;N;;;;; +1457;CANADIAN SYLLABICS TWE;Lo;0;L;;;;;N;;;;; +1458;CANADIAN SYLLABICS WEST-CREE TWE;Lo;0;L;;;;;N;;;;; +1459;CANADIAN SYLLABICS TWI;Lo;0;L;;;;;N;;;;; +145A;CANADIAN SYLLABICS WEST-CREE TWI;Lo;0;L;;;;;N;;;;; +145B;CANADIAN SYLLABICS TWII;Lo;0;L;;;;;N;;;;; +145C;CANADIAN SYLLABICS WEST-CREE TWII;Lo;0;L;;;;;N;;;;; +145D;CANADIAN SYLLABICS TWO;Lo;0;L;;;;;N;;;;; +145E;CANADIAN SYLLABICS WEST-CREE TWO;Lo;0;L;;;;;N;;;;; +145F;CANADIAN SYLLABICS TWOO;Lo;0;L;;;;;N;;;;; +1460;CANADIAN SYLLABICS WEST-CREE TWOO;Lo;0;L;;;;;N;;;;; +1461;CANADIAN SYLLABICS TWA;Lo;0;L;;;;;N;;;;; +1462;CANADIAN SYLLABICS WEST-CREE TWA;Lo;0;L;;;;;N;;;;; +1463;CANADIAN SYLLABICS TWAA;Lo;0;L;;;;;N;;;;; +1464;CANADIAN SYLLABICS WEST-CREE TWAA;Lo;0;L;;;;;N;;;;; +1465;CANADIAN SYLLABICS NASKAPI TWAA;Lo;0;L;;;;;N;;;;; +1466;CANADIAN SYLLABICS T;Lo;0;L;;;;;N;;;;; +1467;CANADIAN SYLLABICS TTE;Lo;0;L;;;;;N;;;;; +1468;CANADIAN SYLLABICS TTI;Lo;0;L;;;;;N;;;;; +1469;CANADIAN SYLLABICS TTO;Lo;0;L;;;;;N;;;;; +146A;CANADIAN SYLLABICS TTA;Lo;0;L;;;;;N;;;;; +146B;CANADIAN SYLLABICS KE;Lo;0;L;;;;;N;;;;; +146C;CANADIAN SYLLABICS KAAI;Lo;0;L;;;;;N;;;;; +146D;CANADIAN SYLLABICS KI;Lo;0;L;;;;;N;;;;; +146E;CANADIAN SYLLABICS KII;Lo;0;L;;;;;N;;;;; +146F;CANADIAN SYLLABICS KO;Lo;0;L;;;;;N;;;;; +1470;CANADIAN SYLLABICS KOO;Lo;0;L;;;;;N;;;;; +1471;CANADIAN SYLLABICS Y-CREE KOO;Lo;0;L;;;;;N;;;;; +1472;CANADIAN SYLLABICS KA;Lo;0;L;;;;;N;;;;; +1473;CANADIAN SYLLABICS KAA;Lo;0;L;;;;;N;;;;; +1474;CANADIAN SYLLABICS KWE;Lo;0;L;;;;;N;;;;; +1475;CANADIAN SYLLABICS WEST-CREE KWE;Lo;0;L;;;;;N;;;;; +1476;CANADIAN SYLLABICS KWI;Lo;0;L;;;;;N;;;;; +1477;CANADIAN SYLLABICS WEST-CREE KWI;Lo;0;L;;;;;N;;;;; +1478;CANADIAN SYLLABICS KWII;Lo;0;L;;;;;N;;;;; +1479;CANADIAN SYLLABICS WEST-CREE KWII;Lo;0;L;;;;;N;;;;; +147A;CANADIAN SYLLABICS KWO;Lo;0;L;;;;;N;;;;; +147B;CANADIAN SYLLABICS WEST-CREE KWO;Lo;0;L;;;;;N;;;;; +147C;CANADIAN SYLLABICS KWOO;Lo;0;L;;;;;N;;;;; +147D;CANADIAN SYLLABICS WEST-CREE KWOO;Lo;0;L;;;;;N;;;;; +147E;CANADIAN SYLLABICS KWA;Lo;0;L;;;;;N;;;;; +147F;CANADIAN SYLLABICS WEST-CREE KWA;Lo;0;L;;;;;N;;;;; +1480;CANADIAN SYLLABICS KWAA;Lo;0;L;;;;;N;;;;; +1481;CANADIAN SYLLABICS WEST-CREE KWAA;Lo;0;L;;;;;N;;;;; +1482;CANADIAN SYLLABICS NASKAPI KWAA;Lo;0;L;;;;;N;;;;; +1483;CANADIAN SYLLABICS K;Lo;0;L;;;;;N;;;;; +1484;CANADIAN SYLLABICS KW;Lo;0;L;;;;;N;;;;; +1485;CANADIAN SYLLABICS SOUTH-SLAVEY KEH;Lo;0;L;;;;;N;;;;; +1486;CANADIAN SYLLABICS SOUTH-SLAVEY KIH;Lo;0;L;;;;;N;;;;; +1487;CANADIAN SYLLABICS SOUTH-SLAVEY KOH;Lo;0;L;;;;;N;;;;; +1488;CANADIAN SYLLABICS SOUTH-SLAVEY KAH;Lo;0;L;;;;;N;;;;; +1489;CANADIAN SYLLABICS CE;Lo;0;L;;;;;N;;;;; +148A;CANADIAN SYLLABICS CAAI;Lo;0;L;;;;;N;;;;; +148B;CANADIAN SYLLABICS CI;Lo;0;L;;;;;N;;;;; +148C;CANADIAN SYLLABICS CII;Lo;0;L;;;;;N;;;;; +148D;CANADIAN SYLLABICS CO;Lo;0;L;;;;;N;;;;; +148E;CANADIAN SYLLABICS COO;Lo;0;L;;;;;N;;;;; +148F;CANADIAN SYLLABICS Y-CREE COO;Lo;0;L;;;;;N;;;;; +1490;CANADIAN SYLLABICS CA;Lo;0;L;;;;;N;;;;; +1491;CANADIAN SYLLABICS CAA;Lo;0;L;;;;;N;;;;; +1492;CANADIAN SYLLABICS CWE;Lo;0;L;;;;;N;;;;; +1493;CANADIAN SYLLABICS WEST-CREE CWE;Lo;0;L;;;;;N;;;;; +1494;CANADIAN SYLLABICS CWI;Lo;0;L;;;;;N;;;;; +1495;CANADIAN SYLLABICS WEST-CREE CWI;Lo;0;L;;;;;N;;;;; +1496;CANADIAN SYLLABICS CWII;Lo;0;L;;;;;N;;;;; +1497;CANADIAN SYLLABICS WEST-CREE CWII;Lo;0;L;;;;;N;;;;; +1498;CANADIAN SYLLABICS CWO;Lo;0;L;;;;;N;;;;; +1499;CANADIAN SYLLABICS WEST-CREE CWO;Lo;0;L;;;;;N;;;;; +149A;CANADIAN SYLLABICS CWOO;Lo;0;L;;;;;N;;;;; +149B;CANADIAN SYLLABICS WEST-CREE CWOO;Lo;0;L;;;;;N;;;;; +149C;CANADIAN SYLLABICS CWA;Lo;0;L;;;;;N;;;;; +149D;CANADIAN SYLLABICS WEST-CREE CWA;Lo;0;L;;;;;N;;;;; +149E;CANADIAN SYLLABICS CWAA;Lo;0;L;;;;;N;;;;; +149F;CANADIAN SYLLABICS WEST-CREE CWAA;Lo;0;L;;;;;N;;;;; +14A0;CANADIAN SYLLABICS NASKAPI CWAA;Lo;0;L;;;;;N;;;;; +14A1;CANADIAN SYLLABICS C;Lo;0;L;;;;;N;;;;; +14A2;CANADIAN SYLLABICS SAYISI TH;Lo;0;L;;;;;N;;;;; +14A3;CANADIAN SYLLABICS ME;Lo;0;L;;;;;N;;;;; +14A4;CANADIAN SYLLABICS MAAI;Lo;0;L;;;;;N;;;;; +14A5;CANADIAN SYLLABICS MI;Lo;0;L;;;;;N;;;;; +14A6;CANADIAN SYLLABICS MII;Lo;0;L;;;;;N;;;;; +14A7;CANADIAN SYLLABICS MO;Lo;0;L;;;;;N;;;;; +14A8;CANADIAN SYLLABICS MOO;Lo;0;L;;;;;N;;;;; +14A9;CANADIAN SYLLABICS Y-CREE MOO;Lo;0;L;;;;;N;;;;; +14AA;CANADIAN SYLLABICS MA;Lo;0;L;;;;;N;;;;; +14AB;CANADIAN SYLLABICS MAA;Lo;0;L;;;;;N;;;;; +14AC;CANADIAN SYLLABICS MWE;Lo;0;L;;;;;N;;;;; +14AD;CANADIAN SYLLABICS WEST-CREE MWE;Lo;0;L;;;;;N;;;;; +14AE;CANADIAN SYLLABICS MWI;Lo;0;L;;;;;N;;;;; +14AF;CANADIAN SYLLABICS WEST-CREE MWI;Lo;0;L;;;;;N;;;;; +14B0;CANADIAN SYLLABICS MWII;Lo;0;L;;;;;N;;;;; +14B1;CANADIAN SYLLABICS WEST-CREE MWII;Lo;0;L;;;;;N;;;;; +14B2;CANADIAN SYLLABICS MWO;Lo;0;L;;;;;N;;;;; +14B3;CANADIAN SYLLABICS WEST-CREE MWO;Lo;0;L;;;;;N;;;;; +14B4;CANADIAN SYLLABICS MWOO;Lo;0;L;;;;;N;;;;; +14B5;CANADIAN SYLLABICS WEST-CREE MWOO;Lo;0;L;;;;;N;;;;; +14B6;CANADIAN SYLLABICS MWA;Lo;0;L;;;;;N;;;;; +14B7;CANADIAN SYLLABICS WEST-CREE MWA;Lo;0;L;;;;;N;;;;; +14B8;CANADIAN SYLLABICS MWAA;Lo;0;L;;;;;N;;;;; +14B9;CANADIAN SYLLABICS WEST-CREE MWAA;Lo;0;L;;;;;N;;;;; +14BA;CANADIAN SYLLABICS NASKAPI MWAA;Lo;0;L;;;;;N;;;;; +14BB;CANADIAN SYLLABICS M;Lo;0;L;;;;;N;;;;; +14BC;CANADIAN SYLLABICS WEST-CREE M;Lo;0;L;;;;;N;;;;; +14BD;CANADIAN SYLLABICS MH;Lo;0;L;;;;;N;;;;; +14BE;CANADIAN SYLLABICS ATHAPASCAN M;Lo;0;L;;;;;N;;;;; +14BF;CANADIAN SYLLABICS SAYISI M;Lo;0;L;;;;;N;;;;; +14C0;CANADIAN SYLLABICS NE;Lo;0;L;;;;;N;;;;; +14C1;CANADIAN SYLLABICS NAAI;Lo;0;L;;;;;N;;;;; +14C2;CANADIAN SYLLABICS NI;Lo;0;L;;;;;N;;;;; +14C3;CANADIAN SYLLABICS NII;Lo;0;L;;;;;N;;;;; +14C4;CANADIAN SYLLABICS NO;Lo;0;L;;;;;N;;;;; +14C5;CANADIAN SYLLABICS NOO;Lo;0;L;;;;;N;;;;; +14C6;CANADIAN SYLLABICS Y-CREE NOO;Lo;0;L;;;;;N;;;;; +14C7;CANADIAN SYLLABICS NA;Lo;0;L;;;;;N;;;;; +14C8;CANADIAN SYLLABICS NAA;Lo;0;L;;;;;N;;;;; +14C9;CANADIAN SYLLABICS NWE;Lo;0;L;;;;;N;;;;; +14CA;CANADIAN SYLLABICS WEST-CREE NWE;Lo;0;L;;;;;N;;;;; +14CB;CANADIAN SYLLABICS NWA;Lo;0;L;;;;;N;;;;; +14CC;CANADIAN SYLLABICS WEST-CREE NWA;Lo;0;L;;;;;N;;;;; +14CD;CANADIAN SYLLABICS NWAA;Lo;0;L;;;;;N;;;;; +14CE;CANADIAN SYLLABICS WEST-CREE NWAA;Lo;0;L;;;;;N;;;;; +14CF;CANADIAN SYLLABICS NASKAPI NWAA;Lo;0;L;;;;;N;;;;; +14D0;CANADIAN SYLLABICS N;Lo;0;L;;;;;N;;;;; +14D1;CANADIAN SYLLABICS CARRIER NG;Lo;0;L;;;;;N;;;;; +14D2;CANADIAN SYLLABICS NH;Lo;0;L;;;;;N;;;;; +14D3;CANADIAN SYLLABICS LE;Lo;0;L;;;;;N;;;;; +14D4;CANADIAN SYLLABICS LAAI;Lo;0;L;;;;;N;;;;; +14D5;CANADIAN SYLLABICS LI;Lo;0;L;;;;;N;;;;; +14D6;CANADIAN SYLLABICS LII;Lo;0;L;;;;;N;;;;; +14D7;CANADIAN SYLLABICS LO;Lo;0;L;;;;;N;;;;; +14D8;CANADIAN SYLLABICS LOO;Lo;0;L;;;;;N;;;;; +14D9;CANADIAN SYLLABICS Y-CREE LOO;Lo;0;L;;;;;N;;;;; +14DA;CANADIAN SYLLABICS LA;Lo;0;L;;;;;N;;;;; +14DB;CANADIAN SYLLABICS LAA;Lo;0;L;;;;;N;;;;; +14DC;CANADIAN SYLLABICS LWE;Lo;0;L;;;;;N;;;;; +14DD;CANADIAN SYLLABICS WEST-CREE LWE;Lo;0;L;;;;;N;;;;; +14DE;CANADIAN SYLLABICS LWI;Lo;0;L;;;;;N;;;;; +14DF;CANADIAN SYLLABICS WEST-CREE LWI;Lo;0;L;;;;;N;;;;; +14E0;CANADIAN SYLLABICS LWII;Lo;0;L;;;;;N;;;;; +14E1;CANADIAN SYLLABICS WEST-CREE LWII;Lo;0;L;;;;;N;;;;; +14E2;CANADIAN SYLLABICS LWO;Lo;0;L;;;;;N;;;;; +14E3;CANADIAN SYLLABICS WEST-CREE LWO;Lo;0;L;;;;;N;;;;; +14E4;CANADIAN SYLLABICS LWOO;Lo;0;L;;;;;N;;;;; +14E5;CANADIAN SYLLABICS WEST-CREE LWOO;Lo;0;L;;;;;N;;;;; +14E6;CANADIAN SYLLABICS LWA;Lo;0;L;;;;;N;;;;; +14E7;CANADIAN SYLLABICS WEST-CREE LWA;Lo;0;L;;;;;N;;;;; +14E8;CANADIAN SYLLABICS LWAA;Lo;0;L;;;;;N;;;;; +14E9;CANADIAN SYLLABICS WEST-CREE LWAA;Lo;0;L;;;;;N;;;;; +14EA;CANADIAN SYLLABICS L;Lo;0;L;;;;;N;;;;; +14EB;CANADIAN SYLLABICS WEST-CREE L;Lo;0;L;;;;;N;;;;; +14EC;CANADIAN SYLLABICS MEDIAL L;Lo;0;L;;;;;N;;;;; +14ED;CANADIAN SYLLABICS SE;Lo;0;L;;;;;N;;;;; +14EE;CANADIAN SYLLABICS SAAI;Lo;0;L;;;;;N;;;;; +14EF;CANADIAN SYLLABICS SI;Lo;0;L;;;;;N;;;;; +14F0;CANADIAN SYLLABICS SII;Lo;0;L;;;;;N;;;;; +14F1;CANADIAN SYLLABICS SO;Lo;0;L;;;;;N;;;;; +14F2;CANADIAN SYLLABICS SOO;Lo;0;L;;;;;N;;;;; +14F3;CANADIAN SYLLABICS Y-CREE SOO;Lo;0;L;;;;;N;;;;; +14F4;CANADIAN SYLLABICS SA;Lo;0;L;;;;;N;;;;; +14F5;CANADIAN SYLLABICS SAA;Lo;0;L;;;;;N;;;;; +14F6;CANADIAN SYLLABICS SWE;Lo;0;L;;;;;N;;;;; +14F7;CANADIAN SYLLABICS WEST-CREE SWE;Lo;0;L;;;;;N;;;;; +14F8;CANADIAN SYLLABICS SWI;Lo;0;L;;;;;N;;;;; +14F9;CANADIAN SYLLABICS WEST-CREE SWI;Lo;0;L;;;;;N;;;;; +14FA;CANADIAN SYLLABICS SWII;Lo;0;L;;;;;N;;;;; +14FB;CANADIAN SYLLABICS WEST-CREE SWII;Lo;0;L;;;;;N;;;;; +14FC;CANADIAN SYLLABICS SWO;Lo;0;L;;;;;N;;;;; +14FD;CANADIAN SYLLABICS WEST-CREE SWO;Lo;0;L;;;;;N;;;;; +14FE;CANADIAN SYLLABICS SWOO;Lo;0;L;;;;;N;;;;; +14FF;CANADIAN SYLLABICS WEST-CREE SWOO;Lo;0;L;;;;;N;;;;; +1500;CANADIAN SYLLABICS SWA;Lo;0;L;;;;;N;;;;; +1501;CANADIAN SYLLABICS WEST-CREE SWA;Lo;0;L;;;;;N;;;;; +1502;CANADIAN SYLLABICS SWAA;Lo;0;L;;;;;N;;;;; +1503;CANADIAN SYLLABICS WEST-CREE SWAA;Lo;0;L;;;;;N;;;;; +1504;CANADIAN SYLLABICS NASKAPI SWAA;Lo;0;L;;;;;N;;;;; +1505;CANADIAN SYLLABICS S;Lo;0;L;;;;;N;;;;; +1506;CANADIAN SYLLABICS ATHAPASCAN S;Lo;0;L;;;;;N;;;;; +1507;CANADIAN SYLLABICS SW;Lo;0;L;;;;;N;;;;; +1508;CANADIAN SYLLABICS BLACKFOOT S;Lo;0;L;;;;;N;;;;; +1509;CANADIAN SYLLABICS MOOSE-CREE SK;Lo;0;L;;;;;N;;;;; +150A;CANADIAN SYLLABICS NASKAPI SKW;Lo;0;L;;;;;N;;;;; +150B;CANADIAN SYLLABICS NASKAPI S-W;Lo;0;L;;;;;N;;;;; +150C;CANADIAN SYLLABICS NASKAPI SPWA;Lo;0;L;;;;;N;;;;; +150D;CANADIAN SYLLABICS NASKAPI STWA;Lo;0;L;;;;;N;;;;; +150E;CANADIAN SYLLABICS NASKAPI SKWA;Lo;0;L;;;;;N;;;;; +150F;CANADIAN SYLLABICS NASKAPI SCWA;Lo;0;L;;;;;N;;;;; +1510;CANADIAN SYLLABICS SHE;Lo;0;L;;;;;N;;;;; +1511;CANADIAN SYLLABICS SHI;Lo;0;L;;;;;N;;;;; +1512;CANADIAN SYLLABICS SHII;Lo;0;L;;;;;N;;;;; +1513;CANADIAN SYLLABICS SHO;Lo;0;L;;;;;N;;;;; +1514;CANADIAN SYLLABICS SHOO;Lo;0;L;;;;;N;;;;; +1515;CANADIAN SYLLABICS SHA;Lo;0;L;;;;;N;;;;; +1516;CANADIAN SYLLABICS SHAA;Lo;0;L;;;;;N;;;;; +1517;CANADIAN SYLLABICS SHWE;Lo;0;L;;;;;N;;;;; +1518;CANADIAN SYLLABICS WEST-CREE SHWE;Lo;0;L;;;;;N;;;;; +1519;CANADIAN SYLLABICS SHWI;Lo;0;L;;;;;N;;;;; +151A;CANADIAN SYLLABICS WEST-CREE SHWI;Lo;0;L;;;;;N;;;;; +151B;CANADIAN SYLLABICS SHWII;Lo;0;L;;;;;N;;;;; +151C;CANADIAN SYLLABICS WEST-CREE SHWII;Lo;0;L;;;;;N;;;;; +151D;CANADIAN SYLLABICS SHWO;Lo;0;L;;;;;N;;;;; +151E;CANADIAN SYLLABICS WEST-CREE SHWO;Lo;0;L;;;;;N;;;;; +151F;CANADIAN SYLLABICS SHWOO;Lo;0;L;;;;;N;;;;; +1520;CANADIAN SYLLABICS WEST-CREE SHWOO;Lo;0;L;;;;;N;;;;; +1521;CANADIAN SYLLABICS SHWA;Lo;0;L;;;;;N;;;;; +1522;CANADIAN SYLLABICS WEST-CREE SHWA;Lo;0;L;;;;;N;;;;; +1523;CANADIAN SYLLABICS SHWAA;Lo;0;L;;;;;N;;;;; +1524;CANADIAN SYLLABICS WEST-CREE SHWAA;Lo;0;L;;;;;N;;;;; +1525;CANADIAN SYLLABICS SH;Lo;0;L;;;;;N;;;;; +1526;CANADIAN SYLLABICS YE;Lo;0;L;;;;;N;;;;; +1527;CANADIAN SYLLABICS YAAI;Lo;0;L;;;;;N;;;;; +1528;CANADIAN SYLLABICS YI;Lo;0;L;;;;;N;;;;; +1529;CANADIAN SYLLABICS YII;Lo;0;L;;;;;N;;;;; +152A;CANADIAN SYLLABICS YO;Lo;0;L;;;;;N;;;;; +152B;CANADIAN SYLLABICS YOO;Lo;0;L;;;;;N;;;;; +152C;CANADIAN SYLLABICS Y-CREE YOO;Lo;0;L;;;;;N;;;;; +152D;CANADIAN SYLLABICS YA;Lo;0;L;;;;;N;;;;; +152E;CANADIAN SYLLABICS YAA;Lo;0;L;;;;;N;;;;; +152F;CANADIAN SYLLABICS YWE;Lo;0;L;;;;;N;;;;; +1530;CANADIAN SYLLABICS WEST-CREE YWE;Lo;0;L;;;;;N;;;;; +1531;CANADIAN SYLLABICS YWI;Lo;0;L;;;;;N;;;;; +1532;CANADIAN SYLLABICS WEST-CREE YWI;Lo;0;L;;;;;N;;;;; +1533;CANADIAN SYLLABICS YWII;Lo;0;L;;;;;N;;;;; +1534;CANADIAN SYLLABICS WEST-CREE YWII;Lo;0;L;;;;;N;;;;; +1535;CANADIAN SYLLABICS YWO;Lo;0;L;;;;;N;;;;; +1536;CANADIAN SYLLABICS WEST-CREE YWO;Lo;0;L;;;;;N;;;;; +1537;CANADIAN SYLLABICS YWOO;Lo;0;L;;;;;N;;;;; +1538;CANADIAN SYLLABICS WEST-CREE YWOO;Lo;0;L;;;;;N;;;;; +1539;CANADIAN SYLLABICS YWA;Lo;0;L;;;;;N;;;;; +153A;CANADIAN SYLLABICS WEST-CREE YWA;Lo;0;L;;;;;N;;;;; +153B;CANADIAN SYLLABICS YWAA;Lo;0;L;;;;;N;;;;; +153C;CANADIAN SYLLABICS WEST-CREE YWAA;Lo;0;L;;;;;N;;;;; +153D;CANADIAN SYLLABICS NASKAPI YWAA;Lo;0;L;;;;;N;;;;; +153E;CANADIAN SYLLABICS Y;Lo;0;L;;;;;N;;;;; +153F;CANADIAN SYLLABICS BIBLE-CREE Y;Lo;0;L;;;;;N;;;;; +1540;CANADIAN SYLLABICS WEST-CREE Y;Lo;0;L;;;;;N;;;;; +1541;CANADIAN SYLLABICS SAYISI YI;Lo;0;L;;;;;N;;;;; +1542;CANADIAN SYLLABICS RE;Lo;0;L;;;;;N;;;;; +1543;CANADIAN SYLLABICS R-CREE RE;Lo;0;L;;;;;N;;;;; +1544;CANADIAN SYLLABICS WEST-CREE LE;Lo;0;L;;;;;N;;;;; +1545;CANADIAN SYLLABICS RAAI;Lo;0;L;;;;;N;;;;; +1546;CANADIAN SYLLABICS RI;Lo;0;L;;;;;N;;;;; +1547;CANADIAN SYLLABICS RII;Lo;0;L;;;;;N;;;;; +1548;CANADIAN SYLLABICS RO;Lo;0;L;;;;;N;;;;; +1549;CANADIAN SYLLABICS ROO;Lo;0;L;;;;;N;;;;; +154A;CANADIAN SYLLABICS WEST-CREE LO;Lo;0;L;;;;;N;;;;; +154B;CANADIAN SYLLABICS RA;Lo;0;L;;;;;N;;;;; +154C;CANADIAN SYLLABICS RAA;Lo;0;L;;;;;N;;;;; +154D;CANADIAN SYLLABICS WEST-CREE LA;Lo;0;L;;;;;N;;;;; +154E;CANADIAN SYLLABICS RWAA;Lo;0;L;;;;;N;;;;; +154F;CANADIAN SYLLABICS WEST-CREE RWAA;Lo;0;L;;;;;N;;;;; +1550;CANADIAN SYLLABICS R;Lo;0;L;;;;;N;;;;; +1551;CANADIAN SYLLABICS WEST-CREE R;Lo;0;L;;;;;N;;;;; +1552;CANADIAN SYLLABICS MEDIAL R;Lo;0;L;;;;;N;;;;; +1553;CANADIAN SYLLABICS FE;Lo;0;L;;;;;N;;;;; +1554;CANADIAN SYLLABICS FAAI;Lo;0;L;;;;;N;;;;; +1555;CANADIAN SYLLABICS FI;Lo;0;L;;;;;N;;;;; +1556;CANADIAN SYLLABICS FII;Lo;0;L;;;;;N;;;;; +1557;CANADIAN SYLLABICS FO;Lo;0;L;;;;;N;;;;; +1558;CANADIAN SYLLABICS FOO;Lo;0;L;;;;;N;;;;; +1559;CANADIAN SYLLABICS FA;Lo;0;L;;;;;N;;;;; +155A;CANADIAN SYLLABICS FAA;Lo;0;L;;;;;N;;;;; +155B;CANADIAN SYLLABICS FWAA;Lo;0;L;;;;;N;;;;; +155C;CANADIAN SYLLABICS WEST-CREE FWAA;Lo;0;L;;;;;N;;;;; +155D;CANADIAN SYLLABICS F;Lo;0;L;;;;;N;;;;; +155E;CANADIAN SYLLABICS THE;Lo;0;L;;;;;N;;;;; +155F;CANADIAN SYLLABICS N-CREE THE;Lo;0;L;;;;;N;;;;; +1560;CANADIAN SYLLABICS THI;Lo;0;L;;;;;N;;;;; +1561;CANADIAN SYLLABICS N-CREE THI;Lo;0;L;;;;;N;;;;; +1562;CANADIAN SYLLABICS THII;Lo;0;L;;;;;N;;;;; +1563;CANADIAN SYLLABICS N-CREE THII;Lo;0;L;;;;;N;;;;; +1564;CANADIAN SYLLABICS THO;Lo;0;L;;;;;N;;;;; +1565;CANADIAN SYLLABICS THOO;Lo;0;L;;;;;N;;;;; +1566;CANADIAN SYLLABICS THA;Lo;0;L;;;;;N;;;;; +1567;CANADIAN SYLLABICS THAA;Lo;0;L;;;;;N;;;;; +1568;CANADIAN SYLLABICS THWAA;Lo;0;L;;;;;N;;;;; +1569;CANADIAN SYLLABICS WEST-CREE THWAA;Lo;0;L;;;;;N;;;;; +156A;CANADIAN SYLLABICS TH;Lo;0;L;;;;;N;;;;; +156B;CANADIAN SYLLABICS TTHE;Lo;0;L;;;;;N;;;;; +156C;CANADIAN SYLLABICS TTHI;Lo;0;L;;;;;N;;;;; +156D;CANADIAN SYLLABICS TTHO;Lo;0;L;;;;;N;;;;; +156E;CANADIAN SYLLABICS TTHA;Lo;0;L;;;;;N;;;;; +156F;CANADIAN SYLLABICS TTH;Lo;0;L;;;;;N;;;;; +1570;CANADIAN SYLLABICS TYE;Lo;0;L;;;;;N;;;;; +1571;CANADIAN SYLLABICS TYI;Lo;0;L;;;;;N;;;;; +1572;CANADIAN SYLLABICS TYO;Lo;0;L;;;;;N;;;;; +1573;CANADIAN SYLLABICS TYA;Lo;0;L;;;;;N;;;;; +1574;CANADIAN SYLLABICS NUNAVIK HE;Lo;0;L;;;;;N;;;;; +1575;CANADIAN SYLLABICS NUNAVIK HI;Lo;0;L;;;;;N;;;;; +1576;CANADIAN SYLLABICS NUNAVIK HII;Lo;0;L;;;;;N;;;;; +1577;CANADIAN SYLLABICS NUNAVIK HO;Lo;0;L;;;;;N;;;;; +1578;CANADIAN SYLLABICS NUNAVIK HOO;Lo;0;L;;;;;N;;;;; +1579;CANADIAN SYLLABICS NUNAVIK HA;Lo;0;L;;;;;N;;;;; +157A;CANADIAN SYLLABICS NUNAVIK HAA;Lo;0;L;;;;;N;;;;; +157B;CANADIAN SYLLABICS NUNAVIK H;Lo;0;L;;;;;N;;;;; +157C;CANADIAN SYLLABICS NUNAVUT H;Lo;0;L;;;;;N;;;;; +157D;CANADIAN SYLLABICS HK;Lo;0;L;;;;;N;;;;; +157E;CANADIAN SYLLABICS QAAI;Lo;0;L;;;;;N;;;;; +157F;CANADIAN SYLLABICS QI;Lo;0;L;;;;;N;;;;; +1580;CANADIAN SYLLABICS QII;Lo;0;L;;;;;N;;;;; +1581;CANADIAN SYLLABICS QO;Lo;0;L;;;;;N;;;;; +1582;CANADIAN SYLLABICS QOO;Lo;0;L;;;;;N;;;;; +1583;CANADIAN SYLLABICS QA;Lo;0;L;;;;;N;;;;; +1584;CANADIAN SYLLABICS QAA;Lo;0;L;;;;;N;;;;; +1585;CANADIAN SYLLABICS Q;Lo;0;L;;;;;N;;;;; +1586;CANADIAN SYLLABICS TLHE;Lo;0;L;;;;;N;;;;; +1587;CANADIAN SYLLABICS TLHI;Lo;0;L;;;;;N;;;;; +1588;CANADIAN SYLLABICS TLHO;Lo;0;L;;;;;N;;;;; +1589;CANADIAN SYLLABICS TLHA;Lo;0;L;;;;;N;;;;; +158A;CANADIAN SYLLABICS WEST-CREE RE;Lo;0;L;;;;;N;;;;; +158B;CANADIAN SYLLABICS WEST-CREE RI;Lo;0;L;;;;;N;;;;; +158C;CANADIAN SYLLABICS WEST-CREE RO;Lo;0;L;;;;;N;;;;; +158D;CANADIAN SYLLABICS WEST-CREE RA;Lo;0;L;;;;;N;;;;; +158E;CANADIAN SYLLABICS NGAAI;Lo;0;L;;;;;N;;;;; +158F;CANADIAN SYLLABICS NGI;Lo;0;L;;;;;N;;;;; +1590;CANADIAN SYLLABICS NGII;Lo;0;L;;;;;N;;;;; +1591;CANADIAN SYLLABICS NGO;Lo;0;L;;;;;N;;;;; +1592;CANADIAN SYLLABICS NGOO;Lo;0;L;;;;;N;;;;; +1593;CANADIAN SYLLABICS NGA;Lo;0;L;;;;;N;;;;; +1594;CANADIAN SYLLABICS NGAA;Lo;0;L;;;;;N;;;;; +1595;CANADIAN SYLLABICS NG;Lo;0;L;;;;;N;;;;; +1596;CANADIAN SYLLABICS NNG;Lo;0;L;;;;;N;;;;; +1597;CANADIAN SYLLABICS SAYISI SHE;Lo;0;L;;;;;N;;;;; +1598;CANADIAN SYLLABICS SAYISI SHI;Lo;0;L;;;;;N;;;;; +1599;CANADIAN SYLLABICS SAYISI SHO;Lo;0;L;;;;;N;;;;; +159A;CANADIAN SYLLABICS SAYISI SHA;Lo;0;L;;;;;N;;;;; +159B;CANADIAN SYLLABICS WOODS-CREE THE;Lo;0;L;;;;;N;;;;; +159C;CANADIAN SYLLABICS WOODS-CREE THI;Lo;0;L;;;;;N;;;;; +159D;CANADIAN SYLLABICS WOODS-CREE THO;Lo;0;L;;;;;N;;;;; +159E;CANADIAN SYLLABICS WOODS-CREE THA;Lo;0;L;;;;;N;;;;; +159F;CANADIAN SYLLABICS WOODS-CREE TH;Lo;0;L;;;;;N;;;;; +15A0;CANADIAN SYLLABICS LHI;Lo;0;L;;;;;N;;;;; +15A1;CANADIAN SYLLABICS LHII;Lo;0;L;;;;;N;;;;; +15A2;CANADIAN SYLLABICS LHO;Lo;0;L;;;;;N;;;;; +15A3;CANADIAN SYLLABICS LHOO;Lo;0;L;;;;;N;;;;; +15A4;CANADIAN SYLLABICS LHA;Lo;0;L;;;;;N;;;;; +15A5;CANADIAN SYLLABICS LHAA;Lo;0;L;;;;;N;;;;; +15A6;CANADIAN SYLLABICS LH;Lo;0;L;;;;;N;;;;; +15A7;CANADIAN SYLLABICS TH-CREE THE;Lo;0;L;;;;;N;;;;; +15A8;CANADIAN SYLLABICS TH-CREE THI;Lo;0;L;;;;;N;;;;; +15A9;CANADIAN SYLLABICS TH-CREE THII;Lo;0;L;;;;;N;;;;; +15AA;CANADIAN SYLLABICS TH-CREE THO;Lo;0;L;;;;;N;;;;; +15AB;CANADIAN SYLLABICS TH-CREE THOO;Lo;0;L;;;;;N;;;;; +15AC;CANADIAN SYLLABICS TH-CREE THA;Lo;0;L;;;;;N;;;;; +15AD;CANADIAN SYLLABICS TH-CREE THAA;Lo;0;L;;;;;N;;;;; +15AE;CANADIAN SYLLABICS TH-CREE TH;Lo;0;L;;;;;N;;;;; +15AF;CANADIAN SYLLABICS AIVILIK B;Lo;0;L;;;;;N;;;;; +15B0;CANADIAN SYLLABICS BLACKFOOT E;Lo;0;L;;;;;N;;;;; +15B1;CANADIAN SYLLABICS BLACKFOOT I;Lo;0;L;;;;;N;;;;; +15B2;CANADIAN SYLLABICS BLACKFOOT O;Lo;0;L;;;;;N;;;;; +15B3;CANADIAN SYLLABICS BLACKFOOT A;Lo;0;L;;;;;N;;;;; +15B4;CANADIAN SYLLABICS BLACKFOOT WE;Lo;0;L;;;;;N;;;;; +15B5;CANADIAN SYLLABICS BLACKFOOT WI;Lo;0;L;;;;;N;;;;; +15B6;CANADIAN SYLLABICS BLACKFOOT WO;Lo;0;L;;;;;N;;;;; +15B7;CANADIAN SYLLABICS BLACKFOOT WA;Lo;0;L;;;;;N;;;;; +15B8;CANADIAN SYLLABICS BLACKFOOT NE;Lo;0;L;;;;;N;;;;; +15B9;CANADIAN SYLLABICS BLACKFOOT NI;Lo;0;L;;;;;N;;;;; +15BA;CANADIAN SYLLABICS BLACKFOOT NO;Lo;0;L;;;;;N;;;;; +15BB;CANADIAN SYLLABICS BLACKFOOT NA;Lo;0;L;;;;;N;;;;; +15BC;CANADIAN SYLLABICS BLACKFOOT KE;Lo;0;L;;;;;N;;;;; +15BD;CANADIAN SYLLABICS BLACKFOOT KI;Lo;0;L;;;;;N;;;;; +15BE;CANADIAN SYLLABICS BLACKFOOT KO;Lo;0;L;;;;;N;;;;; +15BF;CANADIAN SYLLABICS BLACKFOOT KA;Lo;0;L;;;;;N;;;;; +15C0;CANADIAN SYLLABICS SAYISI HE;Lo;0;L;;;;;N;;;;; +15C1;CANADIAN SYLLABICS SAYISI HI;Lo;0;L;;;;;N;;;;; +15C2;CANADIAN SYLLABICS SAYISI HO;Lo;0;L;;;;;N;;;;; +15C3;CANADIAN SYLLABICS SAYISI HA;Lo;0;L;;;;;N;;;;; +15C4;CANADIAN SYLLABICS CARRIER GHU;Lo;0;L;;;;;N;;;;; +15C5;CANADIAN SYLLABICS CARRIER GHO;Lo;0;L;;;;;N;;;;; +15C6;CANADIAN SYLLABICS CARRIER GHE;Lo;0;L;;;;;N;;;;; +15C7;CANADIAN SYLLABICS CARRIER GHEE;Lo;0;L;;;;;N;;;;; +15C8;CANADIAN SYLLABICS CARRIER GHI;Lo;0;L;;;;;N;;;;; +15C9;CANADIAN SYLLABICS CARRIER GHA;Lo;0;L;;;;;N;;;;; +15CA;CANADIAN SYLLABICS CARRIER RU;Lo;0;L;;;;;N;;;;; +15CB;CANADIAN SYLLABICS CARRIER RO;Lo;0;L;;;;;N;;;;; +15CC;CANADIAN SYLLABICS CARRIER RE;Lo;0;L;;;;;N;;;;; +15CD;CANADIAN SYLLABICS CARRIER REE;Lo;0;L;;;;;N;;;;; +15CE;CANADIAN SYLLABICS CARRIER RI;Lo;0;L;;;;;N;;;;; +15CF;CANADIAN SYLLABICS CARRIER RA;Lo;0;L;;;;;N;;;;; +15D0;CANADIAN SYLLABICS CARRIER WU;Lo;0;L;;;;;N;;;;; +15D1;CANADIAN SYLLABICS CARRIER WO;Lo;0;L;;;;;N;;;;; +15D2;CANADIAN SYLLABICS CARRIER WE;Lo;0;L;;;;;N;;;;; +15D3;CANADIAN SYLLABICS CARRIER WEE;Lo;0;L;;;;;N;;;;; +15D4;CANADIAN SYLLABICS CARRIER WI;Lo;0;L;;;;;N;;;;; +15D5;CANADIAN SYLLABICS CARRIER WA;Lo;0;L;;;;;N;;;;; +15D6;CANADIAN SYLLABICS CARRIER HWU;Lo;0;L;;;;;N;;;;; +15D7;CANADIAN SYLLABICS CARRIER HWO;Lo;0;L;;;;;N;;;;; +15D8;CANADIAN SYLLABICS CARRIER HWE;Lo;0;L;;;;;N;;;;; +15D9;CANADIAN SYLLABICS CARRIER HWEE;Lo;0;L;;;;;N;;;;; +15DA;CANADIAN SYLLABICS CARRIER HWI;Lo;0;L;;;;;N;;;;; +15DB;CANADIAN SYLLABICS CARRIER HWA;Lo;0;L;;;;;N;;;;; +15DC;CANADIAN SYLLABICS CARRIER THU;Lo;0;L;;;;;N;;;;; +15DD;CANADIAN SYLLABICS CARRIER THO;Lo;0;L;;;;;N;;;;; +15DE;CANADIAN SYLLABICS CARRIER THE;Lo;0;L;;;;;N;;;;; +15DF;CANADIAN SYLLABICS CARRIER THEE;Lo;0;L;;;;;N;;;;; +15E0;CANADIAN SYLLABICS CARRIER THI;Lo;0;L;;;;;N;;;;; +15E1;CANADIAN SYLLABICS CARRIER THA;Lo;0;L;;;;;N;;;;; +15E2;CANADIAN SYLLABICS CARRIER TTU;Lo;0;L;;;;;N;;;;; +15E3;CANADIAN SYLLABICS CARRIER TTO;Lo;0;L;;;;;N;;;;; +15E4;CANADIAN SYLLABICS CARRIER TTE;Lo;0;L;;;;;N;;;;; +15E5;CANADIAN SYLLABICS CARRIER TTEE;Lo;0;L;;;;;N;;;;; +15E6;CANADIAN SYLLABICS CARRIER TTI;Lo;0;L;;;;;N;;;;; +15E7;CANADIAN SYLLABICS CARRIER TTA;Lo;0;L;;;;;N;;;;; +15E8;CANADIAN SYLLABICS CARRIER PU;Lo;0;L;;;;;N;;;;; +15E9;CANADIAN SYLLABICS CARRIER PO;Lo;0;L;;;;;N;;;;; +15EA;CANADIAN SYLLABICS CARRIER PE;Lo;0;L;;;;;N;;;;; +15EB;CANADIAN SYLLABICS CARRIER PEE;Lo;0;L;;;;;N;;;;; +15EC;CANADIAN SYLLABICS CARRIER PI;Lo;0;L;;;;;N;;;;; +15ED;CANADIAN SYLLABICS CARRIER PA;Lo;0;L;;;;;N;;;;; +15EE;CANADIAN SYLLABICS CARRIER P;Lo;0;L;;;;;N;;;;; +15EF;CANADIAN SYLLABICS CARRIER GU;Lo;0;L;;;;;N;;;;; +15F0;CANADIAN SYLLABICS CARRIER GO;Lo;0;L;;;;;N;;;;; +15F1;CANADIAN SYLLABICS CARRIER GE;Lo;0;L;;;;;N;;;;; +15F2;CANADIAN SYLLABICS CARRIER GEE;Lo;0;L;;;;;N;;;;; +15F3;CANADIAN SYLLABICS CARRIER GI;Lo;0;L;;;;;N;;;;; +15F4;CANADIAN SYLLABICS CARRIER GA;Lo;0;L;;;;;N;;;;; +15F5;CANADIAN SYLLABICS CARRIER KHU;Lo;0;L;;;;;N;;;;; +15F6;CANADIAN SYLLABICS CARRIER KHO;Lo;0;L;;;;;N;;;;; +15F7;CANADIAN SYLLABICS CARRIER KHE;Lo;0;L;;;;;N;;;;; +15F8;CANADIAN SYLLABICS CARRIER KHEE;Lo;0;L;;;;;N;;;;; +15F9;CANADIAN SYLLABICS CARRIER KHI;Lo;0;L;;;;;N;;;;; +15FA;CANADIAN SYLLABICS CARRIER KHA;Lo;0;L;;;;;N;;;;; +15FB;CANADIAN SYLLABICS CARRIER KKU;Lo;0;L;;;;;N;;;;; +15FC;CANADIAN SYLLABICS CARRIER KKO;Lo;0;L;;;;;N;;;;; +15FD;CANADIAN SYLLABICS CARRIER KKE;Lo;0;L;;;;;N;;;;; +15FE;CANADIAN SYLLABICS CARRIER KKEE;Lo;0;L;;;;;N;;;;; +15FF;CANADIAN SYLLABICS CARRIER KKI;Lo;0;L;;;;;N;;;;; +1600;CANADIAN SYLLABICS CARRIER KKA;Lo;0;L;;;;;N;;;;; +1601;CANADIAN SYLLABICS CARRIER KK;Lo;0;L;;;;;N;;;;; +1602;CANADIAN SYLLABICS CARRIER NU;Lo;0;L;;;;;N;;;;; +1603;CANADIAN SYLLABICS CARRIER NO;Lo;0;L;;;;;N;;;;; +1604;CANADIAN SYLLABICS CARRIER NE;Lo;0;L;;;;;N;;;;; +1605;CANADIAN SYLLABICS CARRIER NEE;Lo;0;L;;;;;N;;;;; +1606;CANADIAN SYLLABICS CARRIER NI;Lo;0;L;;;;;N;;;;; +1607;CANADIAN SYLLABICS CARRIER NA;Lo;0;L;;;;;N;;;;; +1608;CANADIAN SYLLABICS CARRIER MU;Lo;0;L;;;;;N;;;;; +1609;CANADIAN SYLLABICS CARRIER MO;Lo;0;L;;;;;N;;;;; +160A;CANADIAN SYLLABICS CARRIER ME;Lo;0;L;;;;;N;;;;; +160B;CANADIAN SYLLABICS CARRIER MEE;Lo;0;L;;;;;N;;;;; +160C;CANADIAN SYLLABICS CARRIER MI;Lo;0;L;;;;;N;;;;; +160D;CANADIAN SYLLABICS CARRIER MA;Lo;0;L;;;;;N;;;;; +160E;CANADIAN SYLLABICS CARRIER YU;Lo;0;L;;;;;N;;;;; +160F;CANADIAN SYLLABICS CARRIER YO;Lo;0;L;;;;;N;;;;; +1610;CANADIAN SYLLABICS CARRIER YE;Lo;0;L;;;;;N;;;;; +1611;CANADIAN SYLLABICS CARRIER YEE;Lo;0;L;;;;;N;;;;; +1612;CANADIAN SYLLABICS CARRIER YI;Lo;0;L;;;;;N;;;;; +1613;CANADIAN SYLLABICS CARRIER YA;Lo;0;L;;;;;N;;;;; +1614;CANADIAN SYLLABICS CARRIER JU;Lo;0;L;;;;;N;;;;; +1615;CANADIAN SYLLABICS SAYISI JU;Lo;0;L;;;;;N;;;;; +1616;CANADIAN SYLLABICS CARRIER JO;Lo;0;L;;;;;N;;;;; +1617;CANADIAN SYLLABICS CARRIER JE;Lo;0;L;;;;;N;;;;; +1618;CANADIAN SYLLABICS CARRIER JEE;Lo;0;L;;;;;N;;;;; +1619;CANADIAN SYLLABICS CARRIER JI;Lo;0;L;;;;;N;;;;; +161A;CANADIAN SYLLABICS SAYISI JI;Lo;0;L;;;;;N;;;;; +161B;CANADIAN SYLLABICS CARRIER JA;Lo;0;L;;;;;N;;;;; +161C;CANADIAN SYLLABICS CARRIER JJU;Lo;0;L;;;;;N;;;;; +161D;CANADIAN SYLLABICS CARRIER JJO;Lo;0;L;;;;;N;;;;; +161E;CANADIAN SYLLABICS CARRIER JJE;Lo;0;L;;;;;N;;;;; +161F;CANADIAN SYLLABICS CARRIER JJEE;Lo;0;L;;;;;N;;;;; +1620;CANADIAN SYLLABICS CARRIER JJI;Lo;0;L;;;;;N;;;;; +1621;CANADIAN SYLLABICS CARRIER JJA;Lo;0;L;;;;;N;;;;; +1622;CANADIAN SYLLABICS CARRIER LU;Lo;0;L;;;;;N;;;;; +1623;CANADIAN SYLLABICS CARRIER LO;Lo;0;L;;;;;N;;;;; +1624;CANADIAN SYLLABICS CARRIER LE;Lo;0;L;;;;;N;;;;; +1625;CANADIAN SYLLABICS CARRIER LEE;Lo;0;L;;;;;N;;;;; +1626;CANADIAN SYLLABICS CARRIER LI;Lo;0;L;;;;;N;;;;; +1627;CANADIAN SYLLABICS CARRIER LA;Lo;0;L;;;;;N;;;;; +1628;CANADIAN SYLLABICS CARRIER DLU;Lo;0;L;;;;;N;;;;; +1629;CANADIAN SYLLABICS CARRIER DLO;Lo;0;L;;;;;N;;;;; +162A;CANADIAN SYLLABICS CARRIER DLE;Lo;0;L;;;;;N;;;;; +162B;CANADIAN SYLLABICS CARRIER DLEE;Lo;0;L;;;;;N;;;;; +162C;CANADIAN SYLLABICS CARRIER DLI;Lo;0;L;;;;;N;;;;; +162D;CANADIAN SYLLABICS CARRIER DLA;Lo;0;L;;;;;N;;;;; +162E;CANADIAN SYLLABICS CARRIER LHU;Lo;0;L;;;;;N;;;;; +162F;CANADIAN SYLLABICS CARRIER LHO;Lo;0;L;;;;;N;;;;; +1630;CANADIAN SYLLABICS CARRIER LHE;Lo;0;L;;;;;N;;;;; +1631;CANADIAN SYLLABICS CARRIER LHEE;Lo;0;L;;;;;N;;;;; +1632;CANADIAN SYLLABICS CARRIER LHI;Lo;0;L;;;;;N;;;;; +1633;CANADIAN SYLLABICS CARRIER LHA;Lo;0;L;;;;;N;;;;; +1634;CANADIAN SYLLABICS CARRIER TLHU;Lo;0;L;;;;;N;;;;; +1635;CANADIAN SYLLABICS CARRIER TLHO;Lo;0;L;;;;;N;;;;; +1636;CANADIAN SYLLABICS CARRIER TLHE;Lo;0;L;;;;;N;;;;; +1637;CANADIAN SYLLABICS CARRIER TLHEE;Lo;0;L;;;;;N;;;;; +1638;CANADIAN SYLLABICS CARRIER TLHI;Lo;0;L;;;;;N;;;;; +1639;CANADIAN SYLLABICS CARRIER TLHA;Lo;0;L;;;;;N;;;;; +163A;CANADIAN SYLLABICS CARRIER TLU;Lo;0;L;;;;;N;;;;; +163B;CANADIAN SYLLABICS CARRIER TLO;Lo;0;L;;;;;N;;;;; +163C;CANADIAN SYLLABICS CARRIER TLE;Lo;0;L;;;;;N;;;;; +163D;CANADIAN SYLLABICS CARRIER TLEE;Lo;0;L;;;;;N;;;;; +163E;CANADIAN SYLLABICS CARRIER TLI;Lo;0;L;;;;;N;;;;; +163F;CANADIAN SYLLABICS CARRIER TLA;Lo;0;L;;;;;N;;;;; +1640;CANADIAN SYLLABICS CARRIER ZU;Lo;0;L;;;;;N;;;;; +1641;CANADIAN SYLLABICS CARRIER ZO;Lo;0;L;;;;;N;;;;; +1642;CANADIAN SYLLABICS CARRIER ZE;Lo;0;L;;;;;N;;;;; +1643;CANADIAN SYLLABICS CARRIER ZEE;Lo;0;L;;;;;N;;;;; +1644;CANADIAN SYLLABICS CARRIER ZI;Lo;0;L;;;;;N;;;;; +1645;CANADIAN SYLLABICS CARRIER ZA;Lo;0;L;;;;;N;;;;; +1646;CANADIAN SYLLABICS CARRIER Z;Lo;0;L;;;;;N;;;;; +1647;CANADIAN SYLLABICS CARRIER INITIAL Z;Lo;0;L;;;;;N;;;;; +1648;CANADIAN SYLLABICS CARRIER DZU;Lo;0;L;;;;;N;;;;; +1649;CANADIAN SYLLABICS CARRIER DZO;Lo;0;L;;;;;N;;;;; +164A;CANADIAN SYLLABICS CARRIER DZE;Lo;0;L;;;;;N;;;;; +164B;CANADIAN SYLLABICS CARRIER DZEE;Lo;0;L;;;;;N;;;;; +164C;CANADIAN SYLLABICS CARRIER DZI;Lo;0;L;;;;;N;;;;; +164D;CANADIAN SYLLABICS CARRIER DZA;Lo;0;L;;;;;N;;;;; +164E;CANADIAN SYLLABICS CARRIER SU;Lo;0;L;;;;;N;;;;; +164F;CANADIAN SYLLABICS CARRIER SO;Lo;0;L;;;;;N;;;;; +1650;CANADIAN SYLLABICS CARRIER SE;Lo;0;L;;;;;N;;;;; +1651;CANADIAN SYLLABICS CARRIER SEE;Lo;0;L;;;;;N;;;;; +1652;CANADIAN SYLLABICS CARRIER SI;Lo;0;L;;;;;N;;;;; +1653;CANADIAN SYLLABICS CARRIER SA;Lo;0;L;;;;;N;;;;; +1654;CANADIAN SYLLABICS CARRIER SHU;Lo;0;L;;;;;N;;;;; +1655;CANADIAN SYLLABICS CARRIER SHO;Lo;0;L;;;;;N;;;;; +1656;CANADIAN SYLLABICS CARRIER SHE;Lo;0;L;;;;;N;;;;; +1657;CANADIAN SYLLABICS CARRIER SHEE;Lo;0;L;;;;;N;;;;; +1658;CANADIAN SYLLABICS CARRIER SHI;Lo;0;L;;;;;N;;;;; +1659;CANADIAN SYLLABICS CARRIER SHA;Lo;0;L;;;;;N;;;;; +165A;CANADIAN SYLLABICS CARRIER SH;Lo;0;L;;;;;N;;;;; +165B;CANADIAN SYLLABICS CARRIER TSU;Lo;0;L;;;;;N;;;;; +165C;CANADIAN SYLLABICS CARRIER TSO;Lo;0;L;;;;;N;;;;; +165D;CANADIAN SYLLABICS CARRIER TSE;Lo;0;L;;;;;N;;;;; +165E;CANADIAN SYLLABICS CARRIER TSEE;Lo;0;L;;;;;N;;;;; +165F;CANADIAN SYLLABICS CARRIER TSI;Lo;0;L;;;;;N;;;;; +1660;CANADIAN SYLLABICS CARRIER TSA;Lo;0;L;;;;;N;;;;; +1661;CANADIAN SYLLABICS CARRIER CHU;Lo;0;L;;;;;N;;;;; +1662;CANADIAN SYLLABICS CARRIER CHO;Lo;0;L;;;;;N;;;;; +1663;CANADIAN SYLLABICS CARRIER CHE;Lo;0;L;;;;;N;;;;; +1664;CANADIAN SYLLABICS CARRIER CHEE;Lo;0;L;;;;;N;;;;; +1665;CANADIAN SYLLABICS CARRIER CHI;Lo;0;L;;;;;N;;;;; +1666;CANADIAN SYLLABICS CARRIER CHA;Lo;0;L;;;;;N;;;;; +1667;CANADIAN SYLLABICS CARRIER TTSU;Lo;0;L;;;;;N;;;;; +1668;CANADIAN SYLLABICS CARRIER TTSO;Lo;0;L;;;;;N;;;;; +1669;CANADIAN SYLLABICS CARRIER TTSE;Lo;0;L;;;;;N;;;;; +166A;CANADIAN SYLLABICS CARRIER TTSEE;Lo;0;L;;;;;N;;;;; +166B;CANADIAN SYLLABICS CARRIER TTSI;Lo;0;L;;;;;N;;;;; +166C;CANADIAN SYLLABICS CARRIER TTSA;Lo;0;L;;;;;N;;;;; +166D;CANADIAN SYLLABICS CHI SIGN;Po;0;L;;;;;N;;;;; +166E;CANADIAN SYLLABICS FULL STOP;Po;0;L;;;;;N;;;;; +166F;CANADIAN SYLLABICS QAI;Lo;0;L;;;;;N;;;;; +1670;CANADIAN SYLLABICS NGAI;Lo;0;L;;;;;N;;;;; +1671;CANADIAN SYLLABICS NNGI;Lo;0;L;;;;;N;;;;; +1672;CANADIAN SYLLABICS NNGII;Lo;0;L;;;;;N;;;;; +1673;CANADIAN SYLLABICS NNGO;Lo;0;L;;;;;N;;;;; +1674;CANADIAN SYLLABICS NNGOO;Lo;0;L;;;;;N;;;;; +1675;CANADIAN SYLLABICS NNGA;Lo;0;L;;;;;N;;;;; +1676;CANADIAN SYLLABICS NNGAA;Lo;0;L;;;;;N;;;;; +1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;; +1681;OGHAM LETTER BEITH;Lo;0;L;;;;;N;;;;; +1682;OGHAM LETTER LUIS;Lo;0;L;;;;;N;;;;; +1683;OGHAM LETTER FEARN;Lo;0;L;;;;;N;;;;; +1684;OGHAM LETTER SAIL;Lo;0;L;;;;;N;;;;; +1685;OGHAM LETTER NION;Lo;0;L;;;;;N;;;;; +1686;OGHAM LETTER UATH;Lo;0;L;;;;;N;;;;; +1687;OGHAM LETTER DAIR;Lo;0;L;;;;;N;;;;; +1688;OGHAM LETTER TINNE;Lo;0;L;;;;;N;;;;; +1689;OGHAM LETTER COLL;Lo;0;L;;;;;N;;;;; +168A;OGHAM LETTER CEIRT;Lo;0;L;;;;;N;;;;; +168B;OGHAM LETTER MUIN;Lo;0;L;;;;;N;;;;; +168C;OGHAM LETTER GORT;Lo;0;L;;;;;N;;;;; +168D;OGHAM LETTER NGEADAL;Lo;0;L;;;;;N;;;;; +168E;OGHAM LETTER STRAIF;Lo;0;L;;;;;N;;;;; +168F;OGHAM LETTER RUIS;Lo;0;L;;;;;N;;;;; +1690;OGHAM LETTER AILM;Lo;0;L;;;;;N;;;;; +1691;OGHAM LETTER ONN;Lo;0;L;;;;;N;;;;; +1692;OGHAM LETTER UR;Lo;0;L;;;;;N;;;;; +1693;OGHAM LETTER EADHADH;Lo;0;L;;;;;N;;;;; +1694;OGHAM LETTER IODHADH;Lo;0;L;;;;;N;;;;; +1695;OGHAM LETTER EABHADH;Lo;0;L;;;;;N;;;;; +1696;OGHAM LETTER OR;Lo;0;L;;;;;N;;;;; +1697;OGHAM LETTER UILLEANN;Lo;0;L;;;;;N;;;;; +1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;; +1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;; +169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;; +169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;N;;;;; +169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;N;;;;; +16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;; +16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;; +16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;; +16A3;RUNIC LETTER YR;Lo;0;L;;;;;N;;;;; +16A4;RUNIC LETTER Y;Lo;0;L;;;;;N;;;;; +16A5;RUNIC LETTER W;Lo;0;L;;;;;N;;;;; +16A6;RUNIC LETTER THURISAZ THURS THORN;Lo;0;L;;;;;N;;;;; +16A7;RUNIC LETTER ETH;Lo;0;L;;;;;N;;;;; +16A8;RUNIC LETTER ANSUZ A;Lo;0;L;;;;;N;;;;; +16A9;RUNIC LETTER OS O;Lo;0;L;;;;;N;;;;; +16AA;RUNIC LETTER AC A;Lo;0;L;;;;;N;;;;; +16AB;RUNIC LETTER AESC;Lo;0;L;;;;;N;;;;; +16AC;RUNIC LETTER LONG-BRANCH-OSS O;Lo;0;L;;;;;N;;;;; +16AD;RUNIC LETTER SHORT-TWIG-OSS O;Lo;0;L;;;;;N;;;;; +16AE;RUNIC LETTER O;Lo;0;L;;;;;N;;;;; +16AF;RUNIC LETTER OE;Lo;0;L;;;;;N;;;;; +16B0;RUNIC LETTER ON;Lo;0;L;;;;;N;;;;; +16B1;RUNIC LETTER RAIDO RAD REID R;Lo;0;L;;;;;N;;;;; +16B2;RUNIC LETTER KAUNA;Lo;0;L;;;;;N;;;;; +16B3;RUNIC LETTER CEN;Lo;0;L;;;;;N;;;;; +16B4;RUNIC LETTER KAUN K;Lo;0;L;;;;;N;;;;; +16B5;RUNIC LETTER G;Lo;0;L;;;;;N;;;;; +16B6;RUNIC LETTER ENG;Lo;0;L;;;;;N;;;;; +16B7;RUNIC LETTER GEBO GYFU G;Lo;0;L;;;;;N;;;;; +16B8;RUNIC LETTER GAR;Lo;0;L;;;;;N;;;;; +16B9;RUNIC LETTER WUNJO WYNN W;Lo;0;L;;;;;N;;;;; +16BA;RUNIC LETTER HAGLAZ H;Lo;0;L;;;;;N;;;;; +16BB;RUNIC LETTER HAEGL H;Lo;0;L;;;;;N;;;;; +16BC;RUNIC LETTER LONG-BRANCH-HAGALL H;Lo;0;L;;;;;N;;;;; +16BD;RUNIC LETTER SHORT-TWIG-HAGALL H;Lo;0;L;;;;;N;;;;; +16BE;RUNIC LETTER NAUDIZ NYD NAUD N;Lo;0;L;;;;;N;;;;; +16BF;RUNIC LETTER SHORT-TWIG-NAUD N;Lo;0;L;;;;;N;;;;; +16C0;RUNIC LETTER DOTTED-N;Lo;0;L;;;;;N;;;;; +16C1;RUNIC LETTER ISAZ IS ISS I;Lo;0;L;;;;;N;;;;; +16C2;RUNIC LETTER E;Lo;0;L;;;;;N;;;;; +16C3;RUNIC LETTER JERAN J;Lo;0;L;;;;;N;;;;; +16C4;RUNIC LETTER GER;Lo;0;L;;;;;N;;;;; +16C5;RUNIC LETTER LONG-BRANCH-AR AE;Lo;0;L;;;;;N;;;;; +16C6;RUNIC LETTER SHORT-TWIG-AR A;Lo;0;L;;;;;N;;;;; +16C7;RUNIC LETTER IWAZ EOH;Lo;0;L;;;;;N;;;;; +16C8;RUNIC LETTER PERTHO PEORTH P;Lo;0;L;;;;;N;;;;; +16C9;RUNIC LETTER ALGIZ EOLHX;Lo;0;L;;;;;N;;;;; +16CA;RUNIC LETTER SOWILO S;Lo;0;L;;;;;N;;;;; +16CB;RUNIC LETTER SIGEL LONG-BRANCH-SOL S;Lo;0;L;;;;;N;;;;; +16CC;RUNIC LETTER SHORT-TWIG-SOL S;Lo;0;L;;;;;N;;;;; +16CD;RUNIC LETTER C;Lo;0;L;;;;;N;;;;; +16CE;RUNIC LETTER Z;Lo;0;L;;;;;N;;;;; +16CF;RUNIC LETTER TIWAZ TIR TYR T;Lo;0;L;;;;;N;;;;; +16D0;RUNIC LETTER SHORT-TWIG-TYR T;Lo;0;L;;;;;N;;;;; +16D1;RUNIC LETTER D;Lo;0;L;;;;;N;;;;; +16D2;RUNIC LETTER BERKANAN BEORC BJARKAN B;Lo;0;L;;;;;N;;;;; +16D3;RUNIC LETTER SHORT-TWIG-BJARKAN B;Lo;0;L;;;;;N;;;;; +16D4;RUNIC LETTER DOTTED-P;Lo;0;L;;;;;N;;;;; +16D5;RUNIC LETTER OPEN-P;Lo;0;L;;;;;N;;;;; +16D6;RUNIC LETTER EHWAZ EH E;Lo;0;L;;;;;N;;;;; +16D7;RUNIC LETTER MANNAZ MAN M;Lo;0;L;;;;;N;;;;; +16D8;RUNIC LETTER LONG-BRANCH-MADR M;Lo;0;L;;;;;N;;;;; +16D9;RUNIC LETTER SHORT-TWIG-MADR M;Lo;0;L;;;;;N;;;;; +16DA;RUNIC LETTER LAUKAZ LAGU LOGR L;Lo;0;L;;;;;N;;;;; +16DB;RUNIC LETTER DOTTED-L;Lo;0;L;;;;;N;;;;; +16DC;RUNIC LETTER INGWAZ;Lo;0;L;;;;;N;;;;; +16DD;RUNIC LETTER ING;Lo;0;L;;;;;N;;;;; +16DE;RUNIC LETTER DAGAZ DAEG D;Lo;0;L;;;;;N;;;;; +16DF;RUNIC LETTER OTHALAN ETHEL O;Lo;0;L;;;;;N;;;;; +16E0;RUNIC LETTER EAR;Lo;0;L;;;;;N;;;;; +16E1;RUNIC LETTER IOR;Lo;0;L;;;;;N;;;;; +16E2;RUNIC LETTER CWEORTH;Lo;0;L;;;;;N;;;;; +16E3;RUNIC LETTER CALC;Lo;0;L;;;;;N;;;;; +16E4;RUNIC LETTER CEALC;Lo;0;L;;;;;N;;;;; +16E5;RUNIC LETTER STAN;Lo;0;L;;;;;N;;;;; +16E6;RUNIC LETTER LONG-BRANCH-YR;Lo;0;L;;;;;N;;;;; +16E7;RUNIC LETTER SHORT-TWIG-YR;Lo;0;L;;;;;N;;;;; +16E8;RUNIC LETTER ICELANDIC-YR;Lo;0;L;;;;;N;;;;; +16E9;RUNIC LETTER Q;Lo;0;L;;;;;N;;;;; +16EA;RUNIC LETTER X;Lo;0;L;;;;;N;;;;; +16EB;RUNIC SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; +16EC;RUNIC MULTIPLE PUNCTUATION;Po;0;L;;;;;N;;;;; +16ED;RUNIC CROSS PUNCTUATION;Po;0;L;;;;;N;;;;; +16EE;RUNIC ARLAUG SYMBOL;Nl;0;L;;;;17;N;;golden number 17;;; +16EF;RUNIC TVIMADUR SYMBOL;Nl;0;L;;;;18;N;;golden number 18;;; +16F0;RUNIC BELGTHOR SYMBOL;Nl;0;L;;;;19;N;;golden number 19;;; +1700;TAGALOG LETTER A;Lo;0;L;;;;;N;;;;; +1701;TAGALOG LETTER I;Lo;0;L;;;;;N;;;;; +1702;TAGALOG LETTER U;Lo;0;L;;;;;N;;;;; +1703;TAGALOG LETTER KA;Lo;0;L;;;;;N;;;;; +1704;TAGALOG LETTER GA;Lo;0;L;;;;;N;;;;; +1705;TAGALOG LETTER NGA;Lo;0;L;;;;;N;;;;; +1706;TAGALOG LETTER TA;Lo;0;L;;;;;N;;;;; +1707;TAGALOG LETTER DA;Lo;0;L;;;;;N;;;;; +1708;TAGALOG LETTER NA;Lo;0;L;;;;;N;;;;; +1709;TAGALOG LETTER PA;Lo;0;L;;;;;N;;;;; +170A;TAGALOG LETTER BA;Lo;0;L;;;;;N;;;;; +170B;TAGALOG LETTER MA;Lo;0;L;;;;;N;;;;; +170C;TAGALOG LETTER YA;Lo;0;L;;;;;N;;;;; +170E;TAGALOG LETTER LA;Lo;0;L;;;;;N;;;;; +170F;TAGALOG LETTER WA;Lo;0;L;;;;;N;;;;; +1710;TAGALOG LETTER SA;Lo;0;L;;;;;N;;;;; +1711;TAGALOG LETTER HA;Lo;0;L;;;;;N;;;;; +1712;TAGALOG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1713;TAGALOG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1714;TAGALOG SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +1720;HANUNOO LETTER A;Lo;0;L;;;;;N;;;;; +1721;HANUNOO LETTER I;Lo;0;L;;;;;N;;;;; +1722;HANUNOO LETTER U;Lo;0;L;;;;;N;;;;; +1723;HANUNOO LETTER KA;Lo;0;L;;;;;N;;;;; +1724;HANUNOO LETTER GA;Lo;0;L;;;;;N;;;;; +1725;HANUNOO LETTER NGA;Lo;0;L;;;;;N;;;;; +1726;HANUNOO LETTER TA;Lo;0;L;;;;;N;;;;; +1727;HANUNOO LETTER DA;Lo;0;L;;;;;N;;;;; +1728;HANUNOO LETTER NA;Lo;0;L;;;;;N;;;;; +1729;HANUNOO LETTER PA;Lo;0;L;;;;;N;;;;; +172A;HANUNOO LETTER BA;Lo;0;L;;;;;N;;;;; +172B;HANUNOO LETTER MA;Lo;0;L;;;;;N;;;;; +172C;HANUNOO LETTER YA;Lo;0;L;;;;;N;;;;; +172D;HANUNOO LETTER RA;Lo;0;L;;;;;N;;;;; +172E;HANUNOO LETTER LA;Lo;0;L;;;;;N;;;;; +172F;HANUNOO LETTER WA;Lo;0;L;;;;;N;;;;; +1730;HANUNOO LETTER SA;Lo;0;L;;;;;N;;;;; +1731;HANUNOO LETTER HA;Lo;0;L;;;;;N;;;;; +1732;HANUNOO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1733;HANUNOO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1734;HANUNOO SIGN PAMUDPOD;Mn;9;NSM;;;;;N;;;;; +1735;PHILIPPINE SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; +1736;PHILIPPINE DOUBLE PUNCTUATION;Po;0;L;;;;;N;;;;; +1740;BUHID LETTER A;Lo;0;L;;;;;N;;;;; +1741;BUHID LETTER I;Lo;0;L;;;;;N;;;;; +1742;BUHID LETTER U;Lo;0;L;;;;;N;;;;; +1743;BUHID LETTER KA;Lo;0;L;;;;;N;;;;; +1744;BUHID LETTER GA;Lo;0;L;;;;;N;;;;; +1745;BUHID LETTER NGA;Lo;0;L;;;;;N;;;;; +1746;BUHID LETTER TA;Lo;0;L;;;;;N;;;;; +1747;BUHID LETTER DA;Lo;0;L;;;;;N;;;;; +1748;BUHID LETTER NA;Lo;0;L;;;;;N;;;;; +1749;BUHID LETTER PA;Lo;0;L;;;;;N;;;;; +174A;BUHID LETTER BA;Lo;0;L;;;;;N;;;;; +174B;BUHID LETTER MA;Lo;0;L;;;;;N;;;;; +174C;BUHID LETTER YA;Lo;0;L;;;;;N;;;;; +174D;BUHID LETTER RA;Lo;0;L;;;;;N;;;;; +174E;BUHID LETTER LA;Lo;0;L;;;;;N;;;;; +174F;BUHID LETTER WA;Lo;0;L;;;;;N;;;;; +1750;BUHID LETTER SA;Lo;0;L;;;;;N;;;;; +1751;BUHID LETTER HA;Lo;0;L;;;;;N;;;;; +1752;BUHID VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1753;BUHID VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1760;TAGBANWA LETTER A;Lo;0;L;;;;;N;;;;; +1761;TAGBANWA LETTER I;Lo;0;L;;;;;N;;;;; +1762;TAGBANWA LETTER U;Lo;0;L;;;;;N;;;;; +1763;TAGBANWA LETTER KA;Lo;0;L;;;;;N;;;;; +1764;TAGBANWA LETTER GA;Lo;0;L;;;;;N;;;;; +1765;TAGBANWA LETTER NGA;Lo;0;L;;;;;N;;;;; +1766;TAGBANWA LETTER TA;Lo;0;L;;;;;N;;;;; +1767;TAGBANWA LETTER DA;Lo;0;L;;;;;N;;;;; +1768;TAGBANWA LETTER NA;Lo;0;L;;;;;N;;;;; +1769;TAGBANWA LETTER PA;Lo;0;L;;;;;N;;;;; +176A;TAGBANWA LETTER BA;Lo;0;L;;;;;N;;;;; +176B;TAGBANWA LETTER MA;Lo;0;L;;;;;N;;;;; +176C;TAGBANWA LETTER YA;Lo;0;L;;;;;N;;;;; +176E;TAGBANWA LETTER LA;Lo;0;L;;;;;N;;;;; +176F;TAGBANWA LETTER WA;Lo;0;L;;;;;N;;;;; +1770;TAGBANWA LETTER SA;Lo;0;L;;;;;N;;;;; +1772;TAGBANWA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1773;TAGBANWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1780;KHMER LETTER KA;Lo;0;L;;;;;N;;;;; +1781;KHMER LETTER KHA;Lo;0;L;;;;;N;;;;; +1782;KHMER LETTER KO;Lo;0;L;;;;;N;;;;; +1783;KHMER LETTER KHO;Lo;0;L;;;;;N;;;;; +1784;KHMER LETTER NGO;Lo;0;L;;;;;N;;;;; +1785;KHMER LETTER CA;Lo;0;L;;;;;N;;;;; +1786;KHMER LETTER CHA;Lo;0;L;;;;;N;;;;; +1787;KHMER LETTER CO;Lo;0;L;;;;;N;;;;; +1788;KHMER LETTER CHO;Lo;0;L;;;;;N;;;;; +1789;KHMER LETTER NYO;Lo;0;L;;;;;N;;;;; +178A;KHMER LETTER DA;Lo;0;L;;;;;N;;;;; +178B;KHMER LETTER TTHA;Lo;0;L;;;;;N;;;;; +178C;KHMER LETTER DO;Lo;0;L;;;;;N;;;;; +178D;KHMER LETTER TTHO;Lo;0;L;;;;;N;;;;; +178E;KHMER LETTER NNO;Lo;0;L;;;;;N;;;;; +178F;KHMER LETTER TA;Lo;0;L;;;;;N;;;;; +1790;KHMER LETTER THA;Lo;0;L;;;;;N;;;;; +1791;KHMER LETTER TO;Lo;0;L;;;;;N;;;;; +1792;KHMER LETTER THO;Lo;0;L;;;;;N;;;;; +1793;KHMER LETTER NO;Lo;0;L;;;;;N;;;;; +1794;KHMER LETTER BA;Lo;0;L;;;;;N;;;;; +1795;KHMER LETTER PHA;Lo;0;L;;;;;N;;;;; +1796;KHMER LETTER PO;Lo;0;L;;;;;N;;;;; +1797;KHMER LETTER PHO;Lo;0;L;;;;;N;;;;; +1798;KHMER LETTER MO;Lo;0;L;;;;;N;;;;; +1799;KHMER LETTER YO;Lo;0;L;;;;;N;;;;; +179A;KHMER LETTER RO;Lo;0;L;;;;;N;;;;; +179B;KHMER LETTER LO;Lo;0;L;;;;;N;;;;; +179C;KHMER LETTER VO;Lo;0;L;;;;;N;;;;; +179D;KHMER LETTER SHA;Lo;0;L;;;;;N;;;;; +179E;KHMER LETTER SSO;Lo;0;L;;;;;N;;;;; +179F;KHMER LETTER SA;Lo;0;L;;;;;N;;;;; +17A0;KHMER LETTER HA;Lo;0;L;;;;;N;;;;; +17A1;KHMER LETTER LA;Lo;0;L;;;;;N;;;;; +17A2;KHMER LETTER QA;Lo;0;L;;;;;N;;;;; +17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;;;; +17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;;;; +17A5;KHMER INDEPENDENT VOWEL QI;Lo;0;L;;;;;N;;;;; +17A6;KHMER INDEPENDENT VOWEL QII;Lo;0;L;;;;;N;;;;; +17A7;KHMER INDEPENDENT VOWEL QU;Lo;0;L;;;;;N;;;;; +17A8;KHMER INDEPENDENT VOWEL QUK;Lo;0;L;;;;;N;;;;; +17A9;KHMER INDEPENDENT VOWEL QUU;Lo;0;L;;;;;N;;;;; +17AA;KHMER INDEPENDENT VOWEL QUUV;Lo;0;L;;;;;N;;;;; +17AB;KHMER INDEPENDENT VOWEL RY;Lo;0;L;;;;;N;;;;; +17AC;KHMER INDEPENDENT VOWEL RYY;Lo;0;L;;;;;N;;;;; +17AD;KHMER INDEPENDENT VOWEL LY;Lo;0;L;;;;;N;;;;; +17AE;KHMER INDEPENDENT VOWEL LYY;Lo;0;L;;;;;N;;;;; +17AF;KHMER INDEPENDENT VOWEL QE;Lo;0;L;;;;;N;;;;; +17B0;KHMER INDEPENDENT VOWEL QAI;Lo;0;L;;;;;N;;;;; +17B1;KHMER INDEPENDENT VOWEL QOO TYPE ONE;Lo;0;L;;;;;N;;;;; +17B2;KHMER INDEPENDENT VOWEL QOO TYPE TWO;Lo;0;L;;;;;N;;;;; +17B3;KHMER INDEPENDENT VOWEL QAU;Lo;0;L;;;;;N;;;;; +17B4;KHMER VOWEL INHERENT AQ;Mc;0;L;;;;;N;;;;; +17B5;KHMER VOWEL INHERENT AA;Mc;0;L;;;;;N;;;;; +17B6;KHMER VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +17B7;KHMER VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +17B8;KHMER VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +17B9;KHMER VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; +17BA;KHMER VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; +17BB;KHMER VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +17BC;KHMER VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +17BD;KHMER VOWEL SIGN UA;Mn;0;NSM;;;;;N;;;;; +17BE;KHMER VOWEL SIGN OE;Mc;0;L;;;;;N;;;;; +17BF;KHMER VOWEL SIGN YA;Mc;0;L;;;;;N;;;;; +17C0;KHMER VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; +17C1;KHMER VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +17C2;KHMER VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +17C3;KHMER VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +17C4;KHMER VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +17C5;KHMER VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +17C6;KHMER SIGN NIKAHIT;Mn;0;NSM;;;;;N;;;;; +17C7;KHMER SIGN REAHMUK;Mc;0;L;;;;;N;;;;; +17C8;KHMER SIGN YUUKALEAPINTU;Mc;0;L;;;;;N;;;;; +17C9;KHMER SIGN MUUSIKATOAN;Mn;0;NSM;;;;;N;;;;; +17CA;KHMER SIGN TRIISAP;Mn;0;NSM;;;;;N;;;;; +17CB;KHMER SIGN BANTOC;Mn;0;NSM;;;;;N;;;;; +17CC;KHMER SIGN ROBAT;Mn;0;NSM;;;;;N;;;;; +17CD;KHMER SIGN TOANDAKHIAT;Mn;0;NSM;;;;;N;;;;; +17CE;KHMER SIGN KAKABAT;Mn;0;NSM;;;;;N;;;;; +17CF;KHMER SIGN AHSDA;Mn;0;NSM;;;;;N;;;;; +17D0;KHMER SIGN SAMYOK SANNYA;Mn;0;NSM;;;;;N;;;;; +17D1;KHMER SIGN VIRIAM;Mn;0;NSM;;;;;N;;;;; +17D2;KHMER SIGN COENG;Mn;9;NSM;;;;;N;;;;; +17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;;;; +17D4;KHMER SIGN KHAN;Po;0;L;;;;;N;;;;; +17D5;KHMER SIGN BARIYOOSAN;Po;0;L;;;;;N;;;;; +17D6;KHMER SIGN CAMNUC PII KUUH;Po;0;L;;;;;N;;;;; +17D7;KHMER SIGN LEK TOO;Lm;0;L;;;;;N;;;;; +17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;;;; +17D9;KHMER SIGN PHNAEK MUAN;Po;0;L;;;;;N;;;;; +17DA;KHMER SIGN KOOMUUT;Po;0;L;;;;;N;;;;; +17DB;KHMER CURRENCY SYMBOL RIEL;Sc;0;ET;;;;;N;;;;; +17DC;KHMER SIGN AVAKRAHASANYA;Lo;0;L;;;;;N;;;;; +17E0;KHMER DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +17E1;KHMER DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +17E2;KHMER DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +17E3;KHMER DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +17E4;KHMER DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +17E5;KHMER DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +17E6;KHMER DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +17E7;KHMER DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +17E8;KHMER DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +17E9;KHMER DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1800;MONGOLIAN BIRGA;Po;0;ON;;;;;N;;;;; +1801;MONGOLIAN ELLIPSIS;Po;0;ON;;;;;N;;;;; +1802;MONGOLIAN COMMA;Po;0;ON;;;;;N;;;;; +1803;MONGOLIAN FULL STOP;Po;0;ON;;;;;N;;;;; +1804;MONGOLIAN COLON;Po;0;ON;;;;;N;;;;; +1805;MONGOLIAN FOUR DOTS;Po;0;ON;;;;;N;;;;; +1806;MONGOLIAN TODO SOFT HYPHEN;Pd;0;ON;;;;;N;;;;; +1807;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER;Po;0;ON;;;;;N;;;;; +1808;MONGOLIAN MANCHU COMMA;Po;0;ON;;;;;N;;;;; +1809;MONGOLIAN MANCHU FULL STOP;Po;0;ON;;;;;N;;;;; +180A;MONGOLIAN NIRUGU;Po;0;ON;;;;;N;;;;; +180B;MONGOLIAN FREE VARIATION SELECTOR ONE;Mn;0;NSM;;;;;N;;;;; +180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Mn;0;NSM;;;;;N;;;;; +180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Mn;0;NSM;;;;;N;;;;; +180E;MONGOLIAN VOWEL SEPARATOR;Cf;0;BN;;;;;N;;;;; +1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1813;MONGOLIAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1814;MONGOLIAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1815;MONGOLIAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1816;MONGOLIAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1817;MONGOLIAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1818;MONGOLIAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1819;MONGOLIAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1820;MONGOLIAN LETTER A;Lo;0;L;;;;;N;;;;; +1821;MONGOLIAN LETTER E;Lo;0;L;;;;;N;;;;; +1822;MONGOLIAN LETTER I;Lo;0;L;;;;;N;;;;; +1823;MONGOLIAN LETTER O;Lo;0;L;;;;;N;;;;; +1824;MONGOLIAN LETTER U;Lo;0;L;;;;;N;;;;; +1825;MONGOLIAN LETTER OE;Lo;0;L;;;;;N;;;;; +1826;MONGOLIAN LETTER UE;Lo;0;L;;;;;N;;;;; +1827;MONGOLIAN LETTER EE;Lo;0;L;;;;;N;;;;; +1828;MONGOLIAN LETTER NA;Lo;0;L;;;;;N;;;;; +1829;MONGOLIAN LETTER ANG;Lo;0;L;;;;;N;;;;; +182A;MONGOLIAN LETTER BA;Lo;0;L;;;;;N;;;;; +182B;MONGOLIAN LETTER PA;Lo;0;L;;;;;N;;;;; +182C;MONGOLIAN LETTER QA;Lo;0;L;;;;;N;;;;; +182D;MONGOLIAN LETTER GA;Lo;0;L;;;;;N;;;;; +182E;MONGOLIAN LETTER MA;Lo;0;L;;;;;N;;;;; +182F;MONGOLIAN LETTER LA;Lo;0;L;;;;;N;;;;; +1830;MONGOLIAN LETTER SA;Lo;0;L;;;;;N;;;;; +1831;MONGOLIAN LETTER SHA;Lo;0;L;;;;;N;;;;; +1832;MONGOLIAN LETTER TA;Lo;0;L;;;;;N;;;;; +1833;MONGOLIAN LETTER DA;Lo;0;L;;;;;N;;;;; +1834;MONGOLIAN LETTER CHA;Lo;0;L;;;;;N;;;;; +1835;MONGOLIAN LETTER JA;Lo;0;L;;;;;N;;;;; +1836;MONGOLIAN LETTER YA;Lo;0;L;;;;;N;;;;; +1837;MONGOLIAN LETTER RA;Lo;0;L;;;;;N;;;;; +1838;MONGOLIAN LETTER WA;Lo;0;L;;;;;N;;;;; +1839;MONGOLIAN LETTER FA;Lo;0;L;;;;;N;;;;; +183A;MONGOLIAN LETTER KA;Lo;0;L;;;;;N;;;;; +183B;MONGOLIAN LETTER KHA;Lo;0;L;;;;;N;;;;; +183C;MONGOLIAN LETTER TSA;Lo;0;L;;;;;N;;;;; +183D;MONGOLIAN LETTER ZA;Lo;0;L;;;;;N;;;;; +183E;MONGOLIAN LETTER HAA;Lo;0;L;;;;;N;;;;; +183F;MONGOLIAN LETTER ZRA;Lo;0;L;;;;;N;;;;; +1840;MONGOLIAN LETTER LHA;Lo;0;L;;;;;N;;;;; +1841;MONGOLIAN LETTER ZHI;Lo;0;L;;;;;N;;;;; +1842;MONGOLIAN LETTER CHI;Lo;0;L;;;;;N;;;;; +1843;MONGOLIAN LETTER TODO LONG VOWEL SIGN;Lm;0;L;;;;;N;;;;; +1844;MONGOLIAN LETTER TODO E;Lo;0;L;;;;;N;;;;; +1845;MONGOLIAN LETTER TODO I;Lo;0;L;;;;;N;;;;; +1846;MONGOLIAN LETTER TODO O;Lo;0;L;;;;;N;;;;; +1847;MONGOLIAN LETTER TODO U;Lo;0;L;;;;;N;;;;; +1848;MONGOLIAN LETTER TODO OE;Lo;0;L;;;;;N;;;;; +1849;MONGOLIAN LETTER TODO UE;Lo;0;L;;;;;N;;;;; +184A;MONGOLIAN LETTER TODO ANG;Lo;0;L;;;;;N;;;;; +184B;MONGOLIAN LETTER TODO BA;Lo;0;L;;;;;N;;;;; +184C;MONGOLIAN LETTER TODO PA;Lo;0;L;;;;;N;;;;; +184D;MONGOLIAN LETTER TODO QA;Lo;0;L;;;;;N;;;;; +184E;MONGOLIAN LETTER TODO GA;Lo;0;L;;;;;N;;;;; +184F;MONGOLIAN LETTER TODO MA;Lo;0;L;;;;;N;;;;; +1850;MONGOLIAN LETTER TODO TA;Lo;0;L;;;;;N;;;;; +1851;MONGOLIAN LETTER TODO DA;Lo;0;L;;;;;N;;;;; +1852;MONGOLIAN LETTER TODO CHA;Lo;0;L;;;;;N;;;;; +1853;MONGOLIAN LETTER TODO JA;Lo;0;L;;;;;N;;;;; +1854;MONGOLIAN LETTER TODO TSA;Lo;0;L;;;;;N;;;;; +1855;MONGOLIAN LETTER TODO YA;Lo;0;L;;;;;N;;;;; +1856;MONGOLIAN LETTER TODO WA;Lo;0;L;;;;;N;;;;; +1857;MONGOLIAN LETTER TODO KA;Lo;0;L;;;;;N;;;;; +1858;MONGOLIAN LETTER TODO GAA;Lo;0;L;;;;;N;;;;; +1859;MONGOLIAN LETTER TODO HAA;Lo;0;L;;;;;N;;;;; +185A;MONGOLIAN LETTER TODO JIA;Lo;0;L;;;;;N;;;;; +185B;MONGOLIAN LETTER TODO NIA;Lo;0;L;;;;;N;;;;; +185C;MONGOLIAN LETTER TODO DZA;Lo;0;L;;;;;N;;;;; +185D;MONGOLIAN LETTER SIBE E;Lo;0;L;;;;;N;;;;; +185E;MONGOLIAN LETTER SIBE I;Lo;0;L;;;;;N;;;;; +185F;MONGOLIAN LETTER SIBE IY;Lo;0;L;;;;;N;;;;; +1860;MONGOLIAN LETTER SIBE UE;Lo;0;L;;;;;N;;;;; +1861;MONGOLIAN LETTER SIBE U;Lo;0;L;;;;;N;;;;; +1862;MONGOLIAN LETTER SIBE ANG;Lo;0;L;;;;;N;;;;; +1863;MONGOLIAN LETTER SIBE KA;Lo;0;L;;;;;N;;;;; +1864;MONGOLIAN LETTER SIBE GA;Lo;0;L;;;;;N;;;;; +1865;MONGOLIAN LETTER SIBE HA;Lo;0;L;;;;;N;;;;; +1866;MONGOLIAN LETTER SIBE PA;Lo;0;L;;;;;N;;;;; +1867;MONGOLIAN LETTER SIBE SHA;Lo;0;L;;;;;N;;;;; +1868;MONGOLIAN LETTER SIBE TA;Lo;0;L;;;;;N;;;;; +1869;MONGOLIAN LETTER SIBE DA;Lo;0;L;;;;;N;;;;; +186A;MONGOLIAN LETTER SIBE JA;Lo;0;L;;;;;N;;;;; +186B;MONGOLIAN LETTER SIBE FA;Lo;0;L;;;;;N;;;;; +186C;MONGOLIAN LETTER SIBE GAA;Lo;0;L;;;;;N;;;;; +186D;MONGOLIAN LETTER SIBE HAA;Lo;0;L;;;;;N;;;;; +186E;MONGOLIAN LETTER SIBE TSA;Lo;0;L;;;;;N;;;;; +186F;MONGOLIAN LETTER SIBE ZA;Lo;0;L;;;;;N;;;;; +1870;MONGOLIAN LETTER SIBE RAA;Lo;0;L;;;;;N;;;;; +1871;MONGOLIAN LETTER SIBE CHA;Lo;0;L;;;;;N;;;;; +1872;MONGOLIAN LETTER SIBE ZHA;Lo;0;L;;;;;N;;;;; +1873;MONGOLIAN LETTER MANCHU I;Lo;0;L;;;;;N;;;;; +1874;MONGOLIAN LETTER MANCHU KA;Lo;0;L;;;;;N;;;;; +1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;; +1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;; +1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;; +1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;; +1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;; +1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;; +1883;MONGOLIAN LETTER ALI GALI UBADAMA;Lo;0;L;;;;;N;;;;; +1884;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA;Lo;0;L;;;;;N;;;;; +1885;MONGOLIAN LETTER ALI GALI BALUDA;Lo;0;L;;;;;N;;;;; +1886;MONGOLIAN LETTER ALI GALI THREE BALUDA;Lo;0;L;;;;;N;;;;; +1887;MONGOLIAN LETTER ALI GALI A;Lo;0;L;;;;;N;;;;; +1888;MONGOLIAN LETTER ALI GALI I;Lo;0;L;;;;;N;;;;; +1889;MONGOLIAN LETTER ALI GALI KA;Lo;0;L;;;;;N;;;;; +188A;MONGOLIAN LETTER ALI GALI NGA;Lo;0;L;;;;;N;;;;; +188B;MONGOLIAN LETTER ALI GALI CA;Lo;0;L;;;;;N;;;;; +188C;MONGOLIAN LETTER ALI GALI TTA;Lo;0;L;;;;;N;;;;; +188D;MONGOLIAN LETTER ALI GALI TTHA;Lo;0;L;;;;;N;;;;; +188E;MONGOLIAN LETTER ALI GALI DDA;Lo;0;L;;;;;N;;;;; +188F;MONGOLIAN LETTER ALI GALI NNA;Lo;0;L;;;;;N;;;;; +1890;MONGOLIAN LETTER ALI GALI TA;Lo;0;L;;;;;N;;;;; +1891;MONGOLIAN LETTER ALI GALI DA;Lo;0;L;;;;;N;;;;; +1892;MONGOLIAN LETTER ALI GALI PA;Lo;0;L;;;;;N;;;;; +1893;MONGOLIAN LETTER ALI GALI PHA;Lo;0;L;;;;;N;;;;; +1894;MONGOLIAN LETTER ALI GALI SSA;Lo;0;L;;;;;N;;;;; +1895;MONGOLIAN LETTER ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +1896;MONGOLIAN LETTER ALI GALI ZA;Lo;0;L;;;;;N;;;;; +1897;MONGOLIAN LETTER ALI GALI AH;Lo;0;L;;;;;N;;;;; +1898;MONGOLIAN LETTER TODO ALI GALI TA;Lo;0;L;;;;;N;;;;; +1899;MONGOLIAN LETTER TODO ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +189A;MONGOLIAN LETTER MANCHU ALI GALI GHA;Lo;0;L;;;;;N;;;;; +189B;MONGOLIAN LETTER MANCHU ALI GALI NGA;Lo;0;L;;;;;N;;;;; +189C;MONGOLIAN LETTER MANCHU ALI GALI CA;Lo;0;L;;;;;N;;;;; +189D;MONGOLIAN LETTER MANCHU ALI GALI JHA;Lo;0;L;;;;;N;;;;; +189E;MONGOLIAN LETTER MANCHU ALI GALI TTA;Lo;0;L;;;;;N;;;;; +189F;MONGOLIAN LETTER MANCHU ALI GALI DDHA;Lo;0;L;;;;;N;;;;; +18A0;MONGOLIAN LETTER MANCHU ALI GALI TA;Lo;0;L;;;;;N;;;;; +18A1;MONGOLIAN LETTER MANCHU ALI GALI DHA;Lo;0;L;;;;;N;;;;; +18A2;MONGOLIAN LETTER MANCHU ALI GALI SSA;Lo;0;L;;;;;N;;;;; +18A3;MONGOLIAN LETTER MANCHU ALI GALI CYA;Lo;0;L;;;;;N;;;;; +18A4;MONGOLIAN LETTER MANCHU ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +18A5;MONGOLIAN LETTER MANCHU ALI GALI ZA;Lo;0;L;;;;;N;;;;; +18A6;MONGOLIAN LETTER ALI GALI HALF U;Lo;0;L;;;;;N;;;;; +18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;; +18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;; +18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;; +1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01; +1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00 +1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03; +1E03;LATIN SMALL LETTER B WITH DOT ABOVE;Ll;0;L;0062 0307;;;;N;;;1E02;;1E02 +1E04;LATIN CAPITAL LETTER B WITH DOT BELOW;Lu;0;L;0042 0323;;;;N;;;;1E05; +1E05;LATIN SMALL LETTER B WITH DOT BELOW;Ll;0;L;0062 0323;;;;N;;;1E04;;1E04 +1E06;LATIN CAPITAL LETTER B WITH LINE BELOW;Lu;0;L;0042 0331;;;;N;;;;1E07; +1E07;LATIN SMALL LETTER B WITH LINE BELOW;Ll;0;L;0062 0331;;;;N;;;1E06;;1E06 +1E08;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE;Lu;0;L;00C7 0301;;;;N;;;;1E09; +1E09;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE;Ll;0;L;00E7 0301;;;;N;;;1E08;;1E08 +1E0A;LATIN CAPITAL LETTER D WITH DOT ABOVE;Lu;0;L;0044 0307;;;;N;;;;1E0B; +1E0B;LATIN SMALL LETTER D WITH DOT ABOVE;Ll;0;L;0064 0307;;;;N;;;1E0A;;1E0A +1E0C;LATIN CAPITAL LETTER D WITH DOT BELOW;Lu;0;L;0044 0323;;;;N;;;;1E0D; +1E0D;LATIN SMALL LETTER D WITH DOT BELOW;Ll;0;L;0064 0323;;;;N;;;1E0C;;1E0C +1E0E;LATIN CAPITAL LETTER D WITH LINE BELOW;Lu;0;L;0044 0331;;;;N;;;;1E0F; +1E0F;LATIN SMALL LETTER D WITH LINE BELOW;Ll;0;L;0064 0331;;;;N;;;1E0E;;1E0E +1E10;LATIN CAPITAL LETTER D WITH CEDILLA;Lu;0;L;0044 0327;;;;N;;;;1E11; +1E11;LATIN SMALL LETTER D WITH CEDILLA;Ll;0;L;0064 0327;;;;N;;;1E10;;1E10 +1E12;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW;Lu;0;L;0044 032D;;;;N;;;;1E13; +1E13;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW;Ll;0;L;0064 032D;;;;N;;;1E12;;1E12 +1E14;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE;Lu;0;L;0112 0300;;;;N;;;;1E15; +1E15;LATIN SMALL LETTER E WITH MACRON AND GRAVE;Ll;0;L;0113 0300;;;;N;;;1E14;;1E14 +1E16;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE;Lu;0;L;0112 0301;;;;N;;;;1E17; +1E17;LATIN SMALL LETTER E WITH MACRON AND ACUTE;Ll;0;L;0113 0301;;;;N;;;1E16;;1E16 +1E18;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW;Lu;0;L;0045 032D;;;;N;;;;1E19; +1E19;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW;Ll;0;L;0065 032D;;;;N;;;1E18;;1E18 +1E1A;LATIN CAPITAL LETTER E WITH TILDE BELOW;Lu;0;L;0045 0330;;;;N;;;;1E1B; +1E1B;LATIN SMALL LETTER E WITH TILDE BELOW;Ll;0;L;0065 0330;;;;N;;;1E1A;;1E1A +1E1C;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE;Lu;0;L;0228 0306;;;;N;;;;1E1D; +1E1D;LATIN SMALL LETTER E WITH CEDILLA AND BREVE;Ll;0;L;0229 0306;;;;N;;;1E1C;;1E1C +1E1E;LATIN CAPITAL LETTER F WITH DOT ABOVE;Lu;0;L;0046 0307;;;;N;;;;1E1F; +1E1F;LATIN SMALL LETTER F WITH DOT ABOVE;Ll;0;L;0066 0307;;;;N;;;1E1E;;1E1E +1E20;LATIN CAPITAL LETTER G WITH MACRON;Lu;0;L;0047 0304;;;;N;;;;1E21; +1E21;LATIN SMALL LETTER G WITH MACRON;Ll;0;L;0067 0304;;;;N;;;1E20;;1E20 +1E22;LATIN CAPITAL LETTER H WITH DOT ABOVE;Lu;0;L;0048 0307;;;;N;;;;1E23; +1E23;LATIN SMALL LETTER H WITH DOT ABOVE;Ll;0;L;0068 0307;;;;N;;;1E22;;1E22 +1E24;LATIN CAPITAL LETTER H WITH DOT BELOW;Lu;0;L;0048 0323;;;;N;;;;1E25; +1E25;LATIN SMALL LETTER H WITH DOT BELOW;Ll;0;L;0068 0323;;;;N;;;1E24;;1E24 +1E26;LATIN CAPITAL LETTER H WITH DIAERESIS;Lu;0;L;0048 0308;;;;N;;;;1E27; +1E27;LATIN SMALL LETTER H WITH DIAERESIS;Ll;0;L;0068 0308;;;;N;;;1E26;;1E26 +1E28;LATIN CAPITAL LETTER H WITH CEDILLA;Lu;0;L;0048 0327;;;;N;;;;1E29; +1E29;LATIN SMALL LETTER H WITH CEDILLA;Ll;0;L;0068 0327;;;;N;;;1E28;;1E28 +1E2A;LATIN CAPITAL LETTER H WITH BREVE BELOW;Lu;0;L;0048 032E;;;;N;;;;1E2B; +1E2B;LATIN SMALL LETTER H WITH BREVE BELOW;Ll;0;L;0068 032E;;;;N;;;1E2A;;1E2A +1E2C;LATIN CAPITAL LETTER I WITH TILDE BELOW;Lu;0;L;0049 0330;;;;N;;;;1E2D; +1E2D;LATIN SMALL LETTER I WITH TILDE BELOW;Ll;0;L;0069 0330;;;;N;;;1E2C;;1E2C +1E2E;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE;Lu;0;L;00CF 0301;;;;N;;;;1E2F; +1E2F;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE;Ll;0;L;00EF 0301;;;;N;;;1E2E;;1E2E +1E30;LATIN CAPITAL LETTER K WITH ACUTE;Lu;0;L;004B 0301;;;;N;;;;1E31; +1E31;LATIN SMALL LETTER K WITH ACUTE;Ll;0;L;006B 0301;;;;N;;;1E30;;1E30 +1E32;LATIN CAPITAL LETTER K WITH DOT BELOW;Lu;0;L;004B 0323;;;;N;;;;1E33; +1E33;LATIN SMALL LETTER K WITH DOT BELOW;Ll;0;L;006B 0323;;;;N;;;1E32;;1E32 +1E34;LATIN CAPITAL LETTER K WITH LINE BELOW;Lu;0;L;004B 0331;;;;N;;;;1E35; +1E35;LATIN SMALL LETTER K WITH LINE BELOW;Ll;0;L;006B 0331;;;;N;;;1E34;;1E34 +1E36;LATIN CAPITAL LETTER L WITH DOT BELOW;Lu;0;L;004C 0323;;;;N;;;;1E37; +1E37;LATIN SMALL LETTER L WITH DOT BELOW;Ll;0;L;006C 0323;;;;N;;;1E36;;1E36 +1E38;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON;Lu;0;L;1E36 0304;;;;N;;;;1E39; +1E39;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON;Ll;0;L;1E37 0304;;;;N;;;1E38;;1E38 +1E3A;LATIN CAPITAL LETTER L WITH LINE BELOW;Lu;0;L;004C 0331;;;;N;;;;1E3B; +1E3B;LATIN SMALL LETTER L WITH LINE BELOW;Ll;0;L;006C 0331;;;;N;;;1E3A;;1E3A +1E3C;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW;Lu;0;L;004C 032D;;;;N;;;;1E3D; +1E3D;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW;Ll;0;L;006C 032D;;;;N;;;1E3C;;1E3C +1E3E;LATIN CAPITAL LETTER M WITH ACUTE;Lu;0;L;004D 0301;;;;N;;;;1E3F; +1E3F;LATIN SMALL LETTER M WITH ACUTE;Ll;0;L;006D 0301;;;;N;;;1E3E;;1E3E +1E40;LATIN CAPITAL LETTER M WITH DOT ABOVE;Lu;0;L;004D 0307;;;;N;;;;1E41; +1E41;LATIN SMALL LETTER M WITH DOT ABOVE;Ll;0;L;006D 0307;;;;N;;;1E40;;1E40 +1E42;LATIN CAPITAL LETTER M WITH DOT BELOW;Lu;0;L;004D 0323;;;;N;;;;1E43; +1E43;LATIN SMALL LETTER M WITH DOT BELOW;Ll;0;L;006D 0323;;;;N;;;1E42;;1E42 +1E44;LATIN CAPITAL LETTER N WITH DOT ABOVE;Lu;0;L;004E 0307;;;;N;;;;1E45; +1E45;LATIN SMALL LETTER N WITH DOT ABOVE;Ll;0;L;006E 0307;;;;N;;;1E44;;1E44 +1E46;LATIN CAPITAL LETTER N WITH DOT BELOW;Lu;0;L;004E 0323;;;;N;;;;1E47; +1E47;LATIN SMALL LETTER N WITH DOT BELOW;Ll;0;L;006E 0323;;;;N;;;1E46;;1E46 +1E48;LATIN CAPITAL LETTER N WITH LINE BELOW;Lu;0;L;004E 0331;;;;N;;;;1E49; +1E49;LATIN SMALL LETTER N WITH LINE BELOW;Ll;0;L;006E 0331;;;;N;;;1E48;;1E48 +1E4A;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW;Lu;0;L;004E 032D;;;;N;;;;1E4B; +1E4B;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW;Ll;0;L;006E 032D;;;;N;;;1E4A;;1E4A +1E4C;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE;Lu;0;L;00D5 0301;;;;N;;;;1E4D; +1E4D;LATIN SMALL LETTER O WITH TILDE AND ACUTE;Ll;0;L;00F5 0301;;;;N;;;1E4C;;1E4C +1E4E;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS;Lu;0;L;00D5 0308;;;;N;;;;1E4F; +1E4F;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS;Ll;0;L;00F5 0308;;;;N;;;1E4E;;1E4E +1E50;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE;Lu;0;L;014C 0300;;;;N;;;;1E51; +1E51;LATIN SMALL LETTER O WITH MACRON AND GRAVE;Ll;0;L;014D 0300;;;;N;;;1E50;;1E50 +1E52;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE;Lu;0;L;014C 0301;;;;N;;;;1E53; +1E53;LATIN SMALL LETTER O WITH MACRON AND ACUTE;Ll;0;L;014D 0301;;;;N;;;1E52;;1E52 +1E54;LATIN CAPITAL LETTER P WITH ACUTE;Lu;0;L;0050 0301;;;;N;;;;1E55; +1E55;LATIN SMALL LETTER P WITH ACUTE;Ll;0;L;0070 0301;;;;N;;;1E54;;1E54 +1E56;LATIN CAPITAL LETTER P WITH DOT ABOVE;Lu;0;L;0050 0307;;;;N;;;;1E57; +1E57;LATIN SMALL LETTER P WITH DOT ABOVE;Ll;0;L;0070 0307;;;;N;;;1E56;;1E56 +1E58;LATIN CAPITAL LETTER R WITH DOT ABOVE;Lu;0;L;0052 0307;;;;N;;;;1E59; +1E59;LATIN SMALL LETTER R WITH DOT ABOVE;Ll;0;L;0072 0307;;;;N;;;1E58;;1E58 +1E5A;LATIN CAPITAL LETTER R WITH DOT BELOW;Lu;0;L;0052 0323;;;;N;;;;1E5B; +1E5B;LATIN SMALL LETTER R WITH DOT BELOW;Ll;0;L;0072 0323;;;;N;;;1E5A;;1E5A +1E5C;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON;Lu;0;L;1E5A 0304;;;;N;;;;1E5D; +1E5D;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON;Ll;0;L;1E5B 0304;;;;N;;;1E5C;;1E5C +1E5E;LATIN CAPITAL LETTER R WITH LINE BELOW;Lu;0;L;0052 0331;;;;N;;;;1E5F; +1E5F;LATIN SMALL LETTER R WITH LINE BELOW;Ll;0;L;0072 0331;;;;N;;;1E5E;;1E5E +1E60;LATIN CAPITAL LETTER S WITH DOT ABOVE;Lu;0;L;0053 0307;;;;N;;;;1E61; +1E61;LATIN SMALL LETTER S WITH DOT ABOVE;Ll;0;L;0073 0307;;;;N;;;1E60;;1E60 +1E62;LATIN CAPITAL LETTER S WITH DOT BELOW;Lu;0;L;0053 0323;;;;N;;;;1E63; +1E63;LATIN SMALL LETTER S WITH DOT BELOW;Ll;0;L;0073 0323;;;;N;;;1E62;;1E62 +1E64;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE;Lu;0;L;015A 0307;;;;N;;;;1E65; +1E65;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE;Ll;0;L;015B 0307;;;;N;;;1E64;;1E64 +1E66;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE;Lu;0;L;0160 0307;;;;N;;;;1E67; +1E67;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE;Ll;0;L;0161 0307;;;;N;;;1E66;;1E66 +1E68;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE;Lu;0;L;1E62 0307;;;;N;;;;1E69; +1E69;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE;Ll;0;L;1E63 0307;;;;N;;;1E68;;1E68 +1E6A;LATIN CAPITAL LETTER T WITH DOT ABOVE;Lu;0;L;0054 0307;;;;N;;;;1E6B; +1E6B;LATIN SMALL LETTER T WITH DOT ABOVE;Ll;0;L;0074 0307;;;;N;;;1E6A;;1E6A +1E6C;LATIN CAPITAL LETTER T WITH DOT BELOW;Lu;0;L;0054 0323;;;;N;;;;1E6D; +1E6D;LATIN SMALL LETTER T WITH DOT BELOW;Ll;0;L;0074 0323;;;;N;;;1E6C;;1E6C +1E6E;LATIN CAPITAL LETTER T WITH LINE BELOW;Lu;0;L;0054 0331;;;;N;;;;1E6F; +1E6F;LATIN SMALL LETTER T WITH LINE BELOW;Ll;0;L;0074 0331;;;;N;;;1E6E;;1E6E +1E70;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW;Lu;0;L;0054 032D;;;;N;;;;1E71; +1E71;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW;Ll;0;L;0074 032D;;;;N;;;1E70;;1E70 +1E72;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW;Lu;0;L;0055 0324;;;;N;;;;1E73; +1E73;LATIN SMALL LETTER U WITH DIAERESIS BELOW;Ll;0;L;0075 0324;;;;N;;;1E72;;1E72 +1E74;LATIN CAPITAL LETTER U WITH TILDE BELOW;Lu;0;L;0055 0330;;;;N;;;;1E75; +1E75;LATIN SMALL LETTER U WITH TILDE BELOW;Ll;0;L;0075 0330;;;;N;;;1E74;;1E74 +1E76;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW;Lu;0;L;0055 032D;;;;N;;;;1E77; +1E77;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW;Ll;0;L;0075 032D;;;;N;;;1E76;;1E76 +1E78;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE;Lu;0;L;0168 0301;;;;N;;;;1E79; +1E79;LATIN SMALL LETTER U WITH TILDE AND ACUTE;Ll;0;L;0169 0301;;;;N;;;1E78;;1E78 +1E7A;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS;Lu;0;L;016A 0308;;;;N;;;;1E7B; +1E7B;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS;Ll;0;L;016B 0308;;;;N;;;1E7A;;1E7A +1E7C;LATIN CAPITAL LETTER V WITH TILDE;Lu;0;L;0056 0303;;;;N;;;;1E7D; +1E7D;LATIN SMALL LETTER V WITH TILDE;Ll;0;L;0076 0303;;;;N;;;1E7C;;1E7C +1E7E;LATIN CAPITAL LETTER V WITH DOT BELOW;Lu;0;L;0056 0323;;;;N;;;;1E7F; +1E7F;LATIN SMALL LETTER V WITH DOT BELOW;Ll;0;L;0076 0323;;;;N;;;1E7E;;1E7E +1E80;LATIN CAPITAL LETTER W WITH GRAVE;Lu;0;L;0057 0300;;;;N;;;;1E81; +1E81;LATIN SMALL LETTER W WITH GRAVE;Ll;0;L;0077 0300;;;;N;;;1E80;;1E80 +1E82;LATIN CAPITAL LETTER W WITH ACUTE;Lu;0;L;0057 0301;;;;N;;;;1E83; +1E83;LATIN SMALL LETTER W WITH ACUTE;Ll;0;L;0077 0301;;;;N;;;1E82;;1E82 +1E84;LATIN CAPITAL LETTER W WITH DIAERESIS;Lu;0;L;0057 0308;;;;N;;;;1E85; +1E85;LATIN SMALL LETTER W WITH DIAERESIS;Ll;0;L;0077 0308;;;;N;;;1E84;;1E84 +1E86;LATIN CAPITAL LETTER W WITH DOT ABOVE;Lu;0;L;0057 0307;;;;N;;;;1E87; +1E87;LATIN SMALL LETTER W WITH DOT ABOVE;Ll;0;L;0077 0307;;;;N;;;1E86;;1E86 +1E88;LATIN CAPITAL LETTER W WITH DOT BELOW;Lu;0;L;0057 0323;;;;N;;;;1E89; +1E89;LATIN SMALL LETTER W WITH DOT BELOW;Ll;0;L;0077 0323;;;;N;;;1E88;;1E88 +1E8A;LATIN CAPITAL LETTER X WITH DOT ABOVE;Lu;0;L;0058 0307;;;;N;;;;1E8B; +1E8B;LATIN SMALL LETTER X WITH DOT ABOVE;Ll;0;L;0078 0307;;;;N;;;1E8A;;1E8A +1E8C;LATIN CAPITAL LETTER X WITH DIAERESIS;Lu;0;L;0058 0308;;;;N;;;;1E8D; +1E8D;LATIN SMALL LETTER X WITH DIAERESIS;Ll;0;L;0078 0308;;;;N;;;1E8C;;1E8C +1E8E;LATIN CAPITAL LETTER Y WITH DOT ABOVE;Lu;0;L;0059 0307;;;;N;;;;1E8F; +1E8F;LATIN SMALL LETTER Y WITH DOT ABOVE;Ll;0;L;0079 0307;;;;N;;;1E8E;;1E8E +1E90;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX;Lu;0;L;005A 0302;;;;N;;;;1E91; +1E91;LATIN SMALL LETTER Z WITH CIRCUMFLEX;Ll;0;L;007A 0302;;;;N;;;1E90;;1E90 +1E92;LATIN CAPITAL LETTER Z WITH DOT BELOW;Lu;0;L;005A 0323;;;;N;;;;1E93; +1E93;LATIN SMALL LETTER Z WITH DOT BELOW;Ll;0;L;007A 0323;;;;N;;;1E92;;1E92 +1E94;LATIN CAPITAL LETTER Z WITH LINE BELOW;Lu;0;L;005A 0331;;;;N;;;;1E95; +1E95;LATIN SMALL LETTER Z WITH LINE BELOW;Ll;0;L;007A 0331;;;;N;;;1E94;;1E94 +1E96;LATIN SMALL LETTER H WITH LINE BELOW;Ll;0;L;0068 0331;;;;N;;;;; +1E97;LATIN SMALL LETTER T WITH DIAERESIS;Ll;0;L;0074 0308;;;;N;;;;; +1E98;LATIN SMALL LETTER W WITH RING ABOVE;Ll;0;L;0077 030A;;;;N;;;;; +1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;; +1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L;<compat> 0061 02BE;;;;N;;;;; +1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60 +1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1; +1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0 +1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3; +1EA3;LATIN SMALL LETTER A WITH HOOK ABOVE;Ll;0;L;0061 0309;;;;N;;;1EA2;;1EA2 +1EA4;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00C2 0301;;;;N;;;;1EA5; +1EA5;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00E2 0301;;;;N;;;1EA4;;1EA4 +1EA6;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00C2 0300;;;;N;;;;1EA7; +1EA7;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00E2 0300;;;;N;;;1EA6;;1EA6 +1EA8;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00C2 0309;;;;N;;;;1EA9; +1EA9;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00E2 0309;;;;N;;;1EA8;;1EA8 +1EAA;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE;Lu;0;L;00C2 0303;;;;N;;;;1EAB; +1EAB;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE;Ll;0;L;00E2 0303;;;;N;;;1EAA;;1EAA +1EAC;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EA0 0302;;;;N;;;;1EAD; +1EAD;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EA1 0302;;;;N;;;1EAC;;1EAC +1EAE;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE;Lu;0;L;0102 0301;;;;N;;;;1EAF; +1EAF;LATIN SMALL LETTER A WITH BREVE AND ACUTE;Ll;0;L;0103 0301;;;;N;;;1EAE;;1EAE +1EB0;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE;Lu;0;L;0102 0300;;;;N;;;;1EB1; +1EB1;LATIN SMALL LETTER A WITH BREVE AND GRAVE;Ll;0;L;0103 0300;;;;N;;;1EB0;;1EB0 +1EB2;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE;Lu;0;L;0102 0309;;;;N;;;;1EB3; +1EB3;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE;Ll;0;L;0103 0309;;;;N;;;1EB2;;1EB2 +1EB4;LATIN CAPITAL LETTER A WITH BREVE AND TILDE;Lu;0;L;0102 0303;;;;N;;;;1EB5; +1EB5;LATIN SMALL LETTER A WITH BREVE AND TILDE;Ll;0;L;0103 0303;;;;N;;;1EB4;;1EB4 +1EB6;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW;Lu;0;L;1EA0 0306;;;;N;;;;1EB7; +1EB7;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW;Ll;0;L;1EA1 0306;;;;N;;;1EB6;;1EB6 +1EB8;LATIN CAPITAL LETTER E WITH DOT BELOW;Lu;0;L;0045 0323;;;;N;;;;1EB9; +1EB9;LATIN SMALL LETTER E WITH DOT BELOW;Ll;0;L;0065 0323;;;;N;;;1EB8;;1EB8 +1EBA;LATIN CAPITAL LETTER E WITH HOOK ABOVE;Lu;0;L;0045 0309;;;;N;;;;1EBB; +1EBB;LATIN SMALL LETTER E WITH HOOK ABOVE;Ll;0;L;0065 0309;;;;N;;;1EBA;;1EBA +1EBC;LATIN CAPITAL LETTER E WITH TILDE;Lu;0;L;0045 0303;;;;N;;;;1EBD; +1EBD;LATIN SMALL LETTER E WITH TILDE;Ll;0;L;0065 0303;;;;N;;;1EBC;;1EBC +1EBE;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00CA 0301;;;;N;;;;1EBF; +1EBF;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00EA 0301;;;;N;;;1EBE;;1EBE +1EC0;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00CA 0300;;;;N;;;;1EC1; +1EC1;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00EA 0300;;;;N;;;1EC0;;1EC0 +1EC2;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00CA 0309;;;;N;;;;1EC3; +1EC3;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00EA 0309;;;;N;;;1EC2;;1EC2 +1EC4;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE;Lu;0;L;00CA 0303;;;;N;;;;1EC5; +1EC5;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE;Ll;0;L;00EA 0303;;;;N;;;1EC4;;1EC4 +1EC6;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EB8 0302;;;;N;;;;1EC7; +1EC7;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EB9 0302;;;;N;;;1EC6;;1EC6 +1EC8;LATIN CAPITAL LETTER I WITH HOOK ABOVE;Lu;0;L;0049 0309;;;;N;;;;1EC9; +1EC9;LATIN SMALL LETTER I WITH HOOK ABOVE;Ll;0;L;0069 0309;;;;N;;;1EC8;;1EC8 +1ECA;LATIN CAPITAL LETTER I WITH DOT BELOW;Lu;0;L;0049 0323;;;;N;;;;1ECB; +1ECB;LATIN SMALL LETTER I WITH DOT BELOW;Ll;0;L;0069 0323;;;;N;;;1ECA;;1ECA +1ECC;LATIN CAPITAL LETTER O WITH DOT BELOW;Lu;0;L;004F 0323;;;;N;;;;1ECD; +1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC +1ECE;LATIN CAPITAL LETTER O WITH HOOK ABOVE;Lu;0;L;004F 0309;;;;N;;;;1ECF; +1ECF;LATIN SMALL LETTER O WITH HOOK ABOVE;Ll;0;L;006F 0309;;;;N;;;1ECE;;1ECE +1ED0;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00D4 0301;;;;N;;;;1ED1; +1ED1;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00F4 0301;;;;N;;;1ED0;;1ED0 +1ED2;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00D4 0300;;;;N;;;;1ED3; +1ED3;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00F4 0300;;;;N;;;1ED2;;1ED2 +1ED4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00D4 0309;;;;N;;;;1ED5; +1ED5;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00F4 0309;;;;N;;;1ED4;;1ED4 +1ED6;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE;Lu;0;L;00D4 0303;;;;N;;;;1ED7; +1ED7;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE;Ll;0;L;00F4 0303;;;;N;;;1ED6;;1ED6 +1ED8;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1ECC 0302;;;;N;;;;1ED9; +1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8 +1EDA;LATIN CAPITAL LETTER O WITH HORN AND ACUTE;Lu;0;L;01A0 0301;;;;N;;;;1EDB; +1EDB;LATIN SMALL LETTER O WITH HORN AND ACUTE;Ll;0;L;01A1 0301;;;;N;;;1EDA;;1EDA +1EDC;LATIN CAPITAL LETTER O WITH HORN AND GRAVE;Lu;0;L;01A0 0300;;;;N;;;;1EDD; +1EDD;LATIN SMALL LETTER O WITH HORN AND GRAVE;Ll;0;L;01A1 0300;;;;N;;;1EDC;;1EDC +1EDE;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE;Lu;0;L;01A0 0309;;;;N;;;;1EDF; +1EDF;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE;Ll;0;L;01A1 0309;;;;N;;;1EDE;;1EDE +1EE0;LATIN CAPITAL LETTER O WITH HORN AND TILDE;Lu;0;L;01A0 0303;;;;N;;;;1EE1; +1EE1;LATIN SMALL LETTER O WITH HORN AND TILDE;Ll;0;L;01A1 0303;;;;N;;;1EE0;;1EE0 +1EE2;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW;Lu;0;L;01A0 0323;;;;N;;;;1EE3; +1EE3;LATIN SMALL LETTER O WITH HORN AND DOT BELOW;Ll;0;L;01A1 0323;;;;N;;;1EE2;;1EE2 +1EE4;LATIN CAPITAL LETTER U WITH DOT BELOW;Lu;0;L;0055 0323;;;;N;;;;1EE5; +1EE5;LATIN SMALL LETTER U WITH DOT BELOW;Ll;0;L;0075 0323;;;;N;;;1EE4;;1EE4 +1EE6;LATIN CAPITAL LETTER U WITH HOOK ABOVE;Lu;0;L;0055 0309;;;;N;;;;1EE7; +1EE7;LATIN SMALL LETTER U WITH HOOK ABOVE;Ll;0;L;0075 0309;;;;N;;;1EE6;;1EE6 +1EE8;LATIN CAPITAL LETTER U WITH HORN AND ACUTE;Lu;0;L;01AF 0301;;;;N;;;;1EE9; +1EE9;LATIN SMALL LETTER U WITH HORN AND ACUTE;Ll;0;L;01B0 0301;;;;N;;;1EE8;;1EE8 +1EEA;LATIN CAPITAL LETTER U WITH HORN AND GRAVE;Lu;0;L;01AF 0300;;;;N;;;;1EEB; +1EEB;LATIN SMALL LETTER U WITH HORN AND GRAVE;Ll;0;L;01B0 0300;;;;N;;;1EEA;;1EEA +1EEC;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE;Lu;0;L;01AF 0309;;;;N;;;;1EED; +1EED;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE;Ll;0;L;01B0 0309;;;;N;;;1EEC;;1EEC +1EEE;LATIN CAPITAL LETTER U WITH HORN AND TILDE;Lu;0;L;01AF 0303;;;;N;;;;1EEF; +1EEF;LATIN SMALL LETTER U WITH HORN AND TILDE;Ll;0;L;01B0 0303;;;;N;;;1EEE;;1EEE +1EF0;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW;Lu;0;L;01AF 0323;;;;N;;;;1EF1; +1EF1;LATIN SMALL LETTER U WITH HORN AND DOT BELOW;Ll;0;L;01B0 0323;;;;N;;;1EF0;;1EF0 +1EF2;LATIN CAPITAL LETTER Y WITH GRAVE;Lu;0;L;0059 0300;;;;N;;;;1EF3; +1EF3;LATIN SMALL LETTER Y WITH GRAVE;Ll;0;L;0079 0300;;;;N;;;1EF2;;1EF2 +1EF4;LATIN CAPITAL LETTER Y WITH DOT BELOW;Lu;0;L;0059 0323;;;;N;;;;1EF5; +1EF5;LATIN SMALL LETTER Y WITH DOT BELOW;Ll;0;L;0079 0323;;;;N;;;1EF4;;1EF4 +1EF6;LATIN CAPITAL LETTER Y WITH HOOK ABOVE;Lu;0;L;0059 0309;;;;N;;;;1EF7; +1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6 +1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9; +1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8 +1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08 +1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09 +1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A +1F03;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA;Ll;0;L;1F01 0300;;;;N;;;1F0B;;1F0B +1F04;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA;Ll;0;L;1F00 0301;;;;N;;;1F0C;;1F0C +1F05;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA;Ll;0;L;1F01 0301;;;;N;;;1F0D;;1F0D +1F06;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI;Ll;0;L;1F00 0342;;;;N;;;1F0E;;1F0E +1F07;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI;Ll;0;L;1F01 0342;;;;N;;;1F0F;;1F0F +1F08;GREEK CAPITAL LETTER ALPHA WITH PSILI;Lu;0;L;0391 0313;;;;N;;;;1F00; +1F09;GREEK CAPITAL LETTER ALPHA WITH DASIA;Lu;0;L;0391 0314;;;;N;;;;1F01; +1F0A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA;Lu;0;L;1F08 0300;;;;N;;;;1F02; +1F0B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA;Lu;0;L;1F09 0300;;;;N;;;;1F03; +1F0C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA;Lu;0;L;1F08 0301;;;;N;;;;1F04; +1F0D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA;Lu;0;L;1F09 0301;;;;N;;;;1F05; +1F0E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI;Lu;0;L;1F08 0342;;;;N;;;;1F06; +1F0F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI;Lu;0;L;1F09 0342;;;;N;;;;1F07; +1F10;GREEK SMALL LETTER EPSILON WITH PSILI;Ll;0;L;03B5 0313;;;;N;;;1F18;;1F18 +1F11;GREEK SMALL LETTER EPSILON WITH DASIA;Ll;0;L;03B5 0314;;;;N;;;1F19;;1F19 +1F12;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA;Ll;0;L;1F10 0300;;;;N;;;1F1A;;1F1A +1F13;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA;Ll;0;L;1F11 0300;;;;N;;;1F1B;;1F1B +1F14;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA;Ll;0;L;1F10 0301;;;;N;;;1F1C;;1F1C +1F15;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA;Ll;0;L;1F11 0301;;;;N;;;1F1D;;1F1D +1F18;GREEK CAPITAL LETTER EPSILON WITH PSILI;Lu;0;L;0395 0313;;;;N;;;;1F10; +1F19;GREEK CAPITAL LETTER EPSILON WITH DASIA;Lu;0;L;0395 0314;;;;N;;;;1F11; +1F1A;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA;Lu;0;L;1F18 0300;;;;N;;;;1F12; +1F1B;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA;Lu;0;L;1F19 0300;;;;N;;;;1F13; +1F1C;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA;Lu;0;L;1F18 0301;;;;N;;;;1F14; +1F1D;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA;Lu;0;L;1F19 0301;;;;N;;;;1F15; +1F20;GREEK SMALL LETTER ETA WITH PSILI;Ll;0;L;03B7 0313;;;;N;;;1F28;;1F28 +1F21;GREEK SMALL LETTER ETA WITH DASIA;Ll;0;L;03B7 0314;;;;N;;;1F29;;1F29 +1F22;GREEK SMALL LETTER ETA WITH PSILI AND VARIA;Ll;0;L;1F20 0300;;;;N;;;1F2A;;1F2A +1F23;GREEK SMALL LETTER ETA WITH DASIA AND VARIA;Ll;0;L;1F21 0300;;;;N;;;1F2B;;1F2B +1F24;GREEK SMALL LETTER ETA WITH PSILI AND OXIA;Ll;0;L;1F20 0301;;;;N;;;1F2C;;1F2C +1F25;GREEK SMALL LETTER ETA WITH DASIA AND OXIA;Ll;0;L;1F21 0301;;;;N;;;1F2D;;1F2D +1F26;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI;Ll;0;L;1F20 0342;;;;N;;;1F2E;;1F2E +1F27;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI;Ll;0;L;1F21 0342;;;;N;;;1F2F;;1F2F +1F28;GREEK CAPITAL LETTER ETA WITH PSILI;Lu;0;L;0397 0313;;;;N;;;;1F20; +1F29;GREEK CAPITAL LETTER ETA WITH DASIA;Lu;0;L;0397 0314;;;;N;;;;1F21; +1F2A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA;Lu;0;L;1F28 0300;;;;N;;;;1F22; +1F2B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA;Lu;0;L;1F29 0300;;;;N;;;;1F23; +1F2C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA;Lu;0;L;1F28 0301;;;;N;;;;1F24; +1F2D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA;Lu;0;L;1F29 0301;;;;N;;;;1F25; +1F2E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI;Lu;0;L;1F28 0342;;;;N;;;;1F26; +1F2F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI;Lu;0;L;1F29 0342;;;;N;;;;1F27; +1F30;GREEK SMALL LETTER IOTA WITH PSILI;Ll;0;L;03B9 0313;;;;N;;;1F38;;1F38 +1F31;GREEK SMALL LETTER IOTA WITH DASIA;Ll;0;L;03B9 0314;;;;N;;;1F39;;1F39 +1F32;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA;Ll;0;L;1F30 0300;;;;N;;;1F3A;;1F3A +1F33;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA;Ll;0;L;1F31 0300;;;;N;;;1F3B;;1F3B +1F34;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA;Ll;0;L;1F30 0301;;;;N;;;1F3C;;1F3C +1F35;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA;Ll;0;L;1F31 0301;;;;N;;;1F3D;;1F3D +1F36;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI;Ll;0;L;1F30 0342;;;;N;;;1F3E;;1F3E +1F37;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI;Ll;0;L;1F31 0342;;;;N;;;1F3F;;1F3F +1F38;GREEK CAPITAL LETTER IOTA WITH PSILI;Lu;0;L;0399 0313;;;;N;;;;1F30; +1F39;GREEK CAPITAL LETTER IOTA WITH DASIA;Lu;0;L;0399 0314;;;;N;;;;1F31; +1F3A;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA;Lu;0;L;1F38 0300;;;;N;;;;1F32; +1F3B;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA;Lu;0;L;1F39 0300;;;;N;;;;1F33; +1F3C;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA;Lu;0;L;1F38 0301;;;;N;;;;1F34; +1F3D;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA;Lu;0;L;1F39 0301;;;;N;;;;1F35; +1F3E;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI;Lu;0;L;1F38 0342;;;;N;;;;1F36; +1F3F;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI;Lu;0;L;1F39 0342;;;;N;;;;1F37; +1F40;GREEK SMALL LETTER OMICRON WITH PSILI;Ll;0;L;03BF 0313;;;;N;;;1F48;;1F48 +1F41;GREEK SMALL LETTER OMICRON WITH DASIA;Ll;0;L;03BF 0314;;;;N;;;1F49;;1F49 +1F42;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA;Ll;0;L;1F40 0300;;;;N;;;1F4A;;1F4A +1F43;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA;Ll;0;L;1F41 0300;;;;N;;;1F4B;;1F4B +1F44;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA;Ll;0;L;1F40 0301;;;;N;;;1F4C;;1F4C +1F45;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA;Ll;0;L;1F41 0301;;;;N;;;1F4D;;1F4D +1F48;GREEK CAPITAL LETTER OMICRON WITH PSILI;Lu;0;L;039F 0313;;;;N;;;;1F40; +1F49;GREEK CAPITAL LETTER OMICRON WITH DASIA;Lu;0;L;039F 0314;;;;N;;;;1F41; +1F4A;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA;Lu;0;L;1F48 0300;;;;N;;;;1F42; +1F4B;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA;Lu;0;L;1F49 0300;;;;N;;;;1F43; +1F4C;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA;Lu;0;L;1F48 0301;;;;N;;;;1F44; +1F4D;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA;Lu;0;L;1F49 0301;;;;N;;;;1F45; +1F50;GREEK SMALL LETTER UPSILON WITH PSILI;Ll;0;L;03C5 0313;;;;N;;;;; +1F51;GREEK SMALL LETTER UPSILON WITH DASIA;Ll;0;L;03C5 0314;;;;N;;;1F59;;1F59 +1F52;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA;Ll;0;L;1F50 0300;;;;N;;;;; +1F53;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA;Ll;0;L;1F51 0300;;;;N;;;1F5B;;1F5B +1F54;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA;Ll;0;L;1F50 0301;;;;N;;;;; +1F55;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA;Ll;0;L;1F51 0301;;;;N;;;1F5D;;1F5D +1F56;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI;Ll;0;L;1F50 0342;;;;N;;;;; +1F57;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI;Ll;0;L;1F51 0342;;;;N;;;1F5F;;1F5F +1F59;GREEK CAPITAL LETTER UPSILON WITH DASIA;Lu;0;L;03A5 0314;;;;N;;;;1F51; +1F5B;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA;Lu;0;L;1F59 0300;;;;N;;;;1F53; +1F5D;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA;Lu;0;L;1F59 0301;;;;N;;;;1F55; +1F5F;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI;Lu;0;L;1F59 0342;;;;N;;;;1F57; +1F60;GREEK SMALL LETTER OMEGA WITH PSILI;Ll;0;L;03C9 0313;;;;N;;;1F68;;1F68 +1F61;GREEK SMALL LETTER OMEGA WITH DASIA;Ll;0;L;03C9 0314;;;;N;;;1F69;;1F69 +1F62;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA;Ll;0;L;1F60 0300;;;;N;;;1F6A;;1F6A +1F63;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA;Ll;0;L;1F61 0300;;;;N;;;1F6B;;1F6B +1F64;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA;Ll;0;L;1F60 0301;;;;N;;;1F6C;;1F6C +1F65;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA;Ll;0;L;1F61 0301;;;;N;;;1F6D;;1F6D +1F66;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI;Ll;0;L;1F60 0342;;;;N;;;1F6E;;1F6E +1F67;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI;Ll;0;L;1F61 0342;;;;N;;;1F6F;;1F6F +1F68;GREEK CAPITAL LETTER OMEGA WITH PSILI;Lu;0;L;03A9 0313;;;;N;;;;1F60; +1F69;GREEK CAPITAL LETTER OMEGA WITH DASIA;Lu;0;L;03A9 0314;;;;N;;;;1F61; +1F6A;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA;Lu;0;L;1F68 0300;;;;N;;;;1F62; +1F6B;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA;Lu;0;L;1F69 0300;;;;N;;;;1F63; +1F6C;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA;Lu;0;L;1F68 0301;;;;N;;;;1F64; +1F6D;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA;Lu;0;L;1F69 0301;;;;N;;;;1F65; +1F6E;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI;Lu;0;L;1F68 0342;;;;N;;;;1F66; +1F6F;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI;Lu;0;L;1F69 0342;;;;N;;;;1F67; +1F70;GREEK SMALL LETTER ALPHA WITH VARIA;Ll;0;L;03B1 0300;;;;N;;;1FBA;;1FBA +1F71;GREEK SMALL LETTER ALPHA WITH OXIA;Ll;0;L;03AC;;;;N;;;1FBB;;1FBB +1F72;GREEK SMALL LETTER EPSILON WITH VARIA;Ll;0;L;03B5 0300;;;;N;;;1FC8;;1FC8 +1F73;GREEK SMALL LETTER EPSILON WITH OXIA;Ll;0;L;03AD;;;;N;;;1FC9;;1FC9 +1F74;GREEK SMALL LETTER ETA WITH VARIA;Ll;0;L;03B7 0300;;;;N;;;1FCA;;1FCA +1F75;GREEK SMALL LETTER ETA WITH OXIA;Ll;0;L;03AE;;;;N;;;1FCB;;1FCB +1F76;GREEK SMALL LETTER IOTA WITH VARIA;Ll;0;L;03B9 0300;;;;N;;;1FDA;;1FDA +1F77;GREEK SMALL LETTER IOTA WITH OXIA;Ll;0;L;03AF;;;;N;;;1FDB;;1FDB +1F78;GREEK SMALL LETTER OMICRON WITH VARIA;Ll;0;L;03BF 0300;;;;N;;;1FF8;;1FF8 +1F79;GREEK SMALL LETTER OMICRON WITH OXIA;Ll;0;L;03CC;;;;N;;;1FF9;;1FF9 +1F7A;GREEK SMALL LETTER UPSILON WITH VARIA;Ll;0;L;03C5 0300;;;;N;;;1FEA;;1FEA +1F7B;GREEK SMALL LETTER UPSILON WITH OXIA;Ll;0;L;03CD;;;;N;;;1FEB;;1FEB +1F7C;GREEK SMALL LETTER OMEGA WITH VARIA;Ll;0;L;03C9 0300;;;;N;;;1FFA;;1FFA +1F7D;GREEK SMALL LETTER OMEGA WITH OXIA;Ll;0;L;03CE;;;;N;;;1FFB;;1FFB +1F80;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F00 0345;;;;N;;;1F88;;1F88 +1F81;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F01 0345;;;;N;;;1F89;;1F89 +1F82;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F02 0345;;;;N;;;1F8A;;1F8A +1F83;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F03 0345;;;;N;;;1F8B;;1F8B +1F84;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F04 0345;;;;N;;;1F8C;;1F8C +1F85;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F05 0345;;;;N;;;1F8D;;1F8D +1F86;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F06 0345;;;;N;;;1F8E;;1F8E +1F87;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F07 0345;;;;N;;;1F8F;;1F8F +1F88;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F08 0345;;;;N;;;;1F80; +1F89;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F09 0345;;;;N;;;;1F81; +1F8A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0A 0345;;;;N;;;;1F82; +1F8B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0B 0345;;;;N;;;;1F83; +1F8C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0C 0345;;;;N;;;;1F84; +1F8D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0D 0345;;;;N;;;;1F85; +1F8E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0E 0345;;;;N;;;;1F86; +1F8F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0F 0345;;;;N;;;;1F87; +1F90;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F20 0345;;;;N;;;1F98;;1F98 +1F91;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F21 0345;;;;N;;;1F99;;1F99 +1F92;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F22 0345;;;;N;;;1F9A;;1F9A +1F93;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F23 0345;;;;N;;;1F9B;;1F9B +1F94;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F24 0345;;;;N;;;1F9C;;1F9C +1F95;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F25 0345;;;;N;;;1F9D;;1F9D +1F96;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F26 0345;;;;N;;;1F9E;;1F9E +1F97;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F27 0345;;;;N;;;1F9F;;1F9F +1F98;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F28 0345;;;;N;;;;1F90; +1F99;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F29 0345;;;;N;;;;1F91; +1F9A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2A 0345;;;;N;;;;1F92; +1F9B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2B 0345;;;;N;;;;1F93; +1F9C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2C 0345;;;;N;;;;1F94; +1F9D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2D 0345;;;;N;;;;1F95; +1F9E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2E 0345;;;;N;;;;1F96; +1F9F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2F 0345;;;;N;;;;1F97; +1FA0;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F60 0345;;;;N;;;1FA8;;1FA8 +1FA1;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F61 0345;;;;N;;;1FA9;;1FA9 +1FA2;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F62 0345;;;;N;;;1FAA;;1FAA +1FA3;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F63 0345;;;;N;;;1FAB;;1FAB +1FA4;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F64 0345;;;;N;;;1FAC;;1FAC +1FA5;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F65 0345;;;;N;;;1FAD;;1FAD +1FA6;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F66 0345;;;;N;;;1FAE;;1FAE +1FA7;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F67 0345;;;;N;;;1FAF;;1FAF +1FA8;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F68 0345;;;;N;;;;1FA0; +1FA9;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F69 0345;;;;N;;;;1FA1; +1FAA;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6A 0345;;;;N;;;;1FA2; +1FAB;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6B 0345;;;;N;;;;1FA3; +1FAC;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6C 0345;;;;N;;;;1FA4; +1FAD;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6D 0345;;;;N;;;;1FA5; +1FAE;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6E 0345;;;;N;;;;1FA6; +1FAF;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6F 0345;;;;N;;;;1FA7; +1FB0;GREEK SMALL LETTER ALPHA WITH VRACHY;Ll;0;L;03B1 0306;;;;N;;;1FB8;;1FB8 +1FB1;GREEK SMALL LETTER ALPHA WITH MACRON;Ll;0;L;03B1 0304;;;;N;;;1FB9;;1FB9 +1FB2;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F70 0345;;;;N;;;;; +1FB3;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI;Ll;0;L;03B1 0345;;;;N;;;1FBC;;1FBC +1FB4;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AC 0345;;;;N;;;;; +1FB6;GREEK SMALL LETTER ALPHA WITH PERISPOMENI;Ll;0;L;03B1 0342;;;;N;;;;; +1FB7;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FB6 0345;;;;N;;;;; +1FB8;GREEK CAPITAL LETTER ALPHA WITH VRACHY;Lu;0;L;0391 0306;;;;N;;;;1FB0; +1FB9;GREEK CAPITAL LETTER ALPHA WITH MACRON;Lu;0;L;0391 0304;;;;N;;;;1FB1; +1FBA;GREEK CAPITAL LETTER ALPHA WITH VARIA;Lu;0;L;0391 0300;;;;N;;;;1F70; +1FBB;GREEK CAPITAL LETTER ALPHA WITH OXIA;Lu;0;L;0386;;;;N;;;;1F71; +1FBC;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI;Lt;0;L;0391 0345;;;;N;;;;1FB3; +1FBD;GREEK KORONIS;Sk;0;ON;<compat> 0020 0313;;;;N;;;;; +1FBE;GREEK PROSGEGRAMMENI;Ll;0;L;03B9;;;;N;;;0399;;0399 +1FBF;GREEK PSILI;Sk;0;ON;<compat> 0020 0313;;;;N;;;;; +1FC0;GREEK PERISPOMENI;Sk;0;ON;<compat> 0020 0342;;;;N;;;;; +1FC1;GREEK DIALYTIKA AND PERISPOMENI;Sk;0;ON;00A8 0342;;;;N;;;;; +1FC2;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F74 0345;;;;N;;;;; +1FC3;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI;Ll;0;L;03B7 0345;;;;N;;;1FCC;;1FCC +1FC4;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AE 0345;;;;N;;;;; +1FC6;GREEK SMALL LETTER ETA WITH PERISPOMENI;Ll;0;L;03B7 0342;;;;N;;;;; +1FC7;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FC6 0345;;;;N;;;;; +1FC8;GREEK CAPITAL LETTER EPSILON WITH VARIA;Lu;0;L;0395 0300;;;;N;;;;1F72; +1FC9;GREEK CAPITAL LETTER EPSILON WITH OXIA;Lu;0;L;0388;;;;N;;;;1F73; +1FCA;GREEK CAPITAL LETTER ETA WITH VARIA;Lu;0;L;0397 0300;;;;N;;;;1F74; +1FCB;GREEK CAPITAL LETTER ETA WITH OXIA;Lu;0;L;0389;;;;N;;;;1F75; +1FCC;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI;Lt;0;L;0397 0345;;;;N;;;;1FC3; +1FCD;GREEK PSILI AND VARIA;Sk;0;ON;1FBF 0300;;;;N;;;;; +1FCE;GREEK PSILI AND OXIA;Sk;0;ON;1FBF 0301;;;;N;;;;; +1FCF;GREEK PSILI AND PERISPOMENI;Sk;0;ON;1FBF 0342;;;;N;;;;; +1FD0;GREEK SMALL LETTER IOTA WITH VRACHY;Ll;0;L;03B9 0306;;;;N;;;1FD8;;1FD8 +1FD1;GREEK SMALL LETTER IOTA WITH MACRON;Ll;0;L;03B9 0304;;;;N;;;1FD9;;1FD9 +1FD2;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA;Ll;0;L;03CA 0300;;;;N;;;;; +1FD3;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA;Ll;0;L;0390;;;;N;;;;; +1FD6;GREEK SMALL LETTER IOTA WITH PERISPOMENI;Ll;0;L;03B9 0342;;;;N;;;;; +1FD7;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CA 0342;;;;N;;;;; +1FD8;GREEK CAPITAL LETTER IOTA WITH VRACHY;Lu;0;L;0399 0306;;;;N;;;;1FD0; +1FD9;GREEK CAPITAL LETTER IOTA WITH MACRON;Lu;0;L;0399 0304;;;;N;;;;1FD1; +1FDA;GREEK CAPITAL LETTER IOTA WITH VARIA;Lu;0;L;0399 0300;;;;N;;;;1F76; +1FDB;GREEK CAPITAL LETTER IOTA WITH OXIA;Lu;0;L;038A;;;;N;;;;1F77; +1FDD;GREEK DASIA AND VARIA;Sk;0;ON;1FFE 0300;;;;N;;;;; +1FDE;GREEK DASIA AND OXIA;Sk;0;ON;1FFE 0301;;;;N;;;;; +1FDF;GREEK DASIA AND PERISPOMENI;Sk;0;ON;1FFE 0342;;;;N;;;;; +1FE0;GREEK SMALL LETTER UPSILON WITH VRACHY;Ll;0;L;03C5 0306;;;;N;;;1FE8;;1FE8 +1FE1;GREEK SMALL LETTER UPSILON WITH MACRON;Ll;0;L;03C5 0304;;;;N;;;1FE9;;1FE9 +1FE2;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA;Ll;0;L;03CB 0300;;;;N;;;;; +1FE3;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA;Ll;0;L;03B0;;;;N;;;;; +1FE4;GREEK SMALL LETTER RHO WITH PSILI;Ll;0;L;03C1 0313;;;;N;;;;; +1FE5;GREEK SMALL LETTER RHO WITH DASIA;Ll;0;L;03C1 0314;;;;N;;;1FEC;;1FEC +1FE6;GREEK SMALL LETTER UPSILON WITH PERISPOMENI;Ll;0;L;03C5 0342;;;;N;;;;; +1FE7;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CB 0342;;;;N;;;;; +1FE8;GREEK CAPITAL LETTER UPSILON WITH VRACHY;Lu;0;L;03A5 0306;;;;N;;;;1FE0; +1FE9;GREEK CAPITAL LETTER UPSILON WITH MACRON;Lu;0;L;03A5 0304;;;;N;;;;1FE1; +1FEA;GREEK CAPITAL LETTER UPSILON WITH VARIA;Lu;0;L;03A5 0300;;;;N;;;;1F7A; +1FEB;GREEK CAPITAL LETTER UPSILON WITH OXIA;Lu;0;L;038E;;;;N;;;;1F7B; +1FEC;GREEK CAPITAL LETTER RHO WITH DASIA;Lu;0;L;03A1 0314;;;;N;;;;1FE5; +1FED;GREEK DIALYTIKA AND VARIA;Sk;0;ON;00A8 0300;;;;N;;;;; +1FEE;GREEK DIALYTIKA AND OXIA;Sk;0;ON;0385;;;;N;;;;; +1FEF;GREEK VARIA;Sk;0;ON;0060;;;;N;;;;; +1FF2;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F7C 0345;;;;N;;;;; +1FF3;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI;Ll;0;L;03C9 0345;;;;N;;;1FFC;;1FFC +1FF4;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03CE 0345;;;;N;;;;; +1FF6;GREEK SMALL LETTER OMEGA WITH PERISPOMENI;Ll;0;L;03C9 0342;;;;N;;;;; +1FF7;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FF6 0345;;;;N;;;;; +1FF8;GREEK CAPITAL LETTER OMICRON WITH VARIA;Lu;0;L;039F 0300;;;;N;;;;1F78; +1FF9;GREEK CAPITAL LETTER OMICRON WITH OXIA;Lu;0;L;038C;;;;N;;;;1F79; +1FFA;GREEK CAPITAL LETTER OMEGA WITH VARIA;Lu;0;L;03A9 0300;;;;N;;;;1F7C; +1FFB;GREEK CAPITAL LETTER OMEGA WITH OXIA;Lu;0;L;038F;;;;N;;;;1F7D; +1FFC;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI;Lt;0;L;03A9 0345;;;;N;;;;1FF3; +1FFD;GREEK OXIA;Sk;0;ON;00B4;;;;N;;;;; +1FFE;GREEK DASIA;Sk;0;ON;<compat> 0020 0314;;;;N;;;;; +2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;; +2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;; +2002;EN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2003;EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2004;THREE-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2005;FOUR-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2006;SIX-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2007;FIGURE SPACE;Zs;0;WS;<noBreak> 0020;;;;N;;;;; +2008;PUNCTUATION SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2009;THIN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +200A;HAIR SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +200B;ZERO WIDTH SPACE;Zs;0;BN;;;;;N;;;;; +200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;; +200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;; +200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;; +200F;RIGHT-TO-LEFT MARK;Cf;0;R;;;;;N;;;;; +2010;HYPHEN;Pd;0;ON;;;;;N;;;;; +2011;NON-BREAKING HYPHEN;Pd;0;ON;<noBreak> 2010;;;;N;;;;; +2012;FIGURE DASH;Pd;0;ON;;;;;N;;;;; +2013;EN DASH;Pd;0;ON;;;;;N;;;;; +2014;EM DASH;Pd;0;ON;;;;;N;;;;; +2015;HORIZONTAL BAR;Pd;0;ON;;;;;N;QUOTATION DASH;;;; +2016;DOUBLE VERTICAL LINE;Po;0;ON;;;;;N;DOUBLE VERTICAL BAR;;;; +2017;DOUBLE LOW LINE;Po;0;ON;<compat> 0020 0333;;;;N;SPACING DOUBLE UNDERSCORE;;;; +2018;LEFT SINGLE QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE TURNED COMMA QUOTATION MARK;;;; +2019;RIGHT SINGLE QUOTATION MARK;Pf;0;ON;;;;;N;SINGLE COMMA QUOTATION MARK;;;; +201A;SINGLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW SINGLE COMMA QUOTATION MARK;;;; +201B;SINGLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE REVERSED COMMA QUOTATION MARK;;;; +201C;LEFT DOUBLE QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE TURNED COMMA QUOTATION MARK;;;; +201D;RIGHT DOUBLE QUOTATION MARK;Pf;0;ON;;;;;N;DOUBLE COMMA QUOTATION MARK;;;; +201E;DOUBLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW DOUBLE COMMA QUOTATION MARK;;;; +201F;DOUBLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE REVERSED COMMA QUOTATION MARK;;;; +2020;DAGGER;Po;0;ON;;;;;N;;;;; +2021;DOUBLE DAGGER;Po;0;ON;;;;;N;;;;; +2022;BULLET;Po;0;ON;;;;;N;;;;; +2023;TRIANGULAR BULLET;Po;0;ON;;;;;N;;;;; +2024;ONE DOT LEADER;Po;0;ON;<compat> 002E;;;;N;;;;; +2025;TWO DOT LEADER;Po;0;ON;<compat> 002E 002E;;;;N;;;;; +2026;HORIZONTAL ELLIPSIS;Po;0;ON;<compat> 002E 002E 002E;;;;N;;;;; +2027;HYPHENATION POINT;Po;0;ON;;;;;N;;;;; +2028;LINE SEPARATOR;Zl;0;WS;;;;;N;;;;; +2029;PARAGRAPH SEPARATOR;Zp;0;B;;;;;N;;;;; +202A;LEFT-TO-RIGHT EMBEDDING;Cf;0;LRE;;;;;N;;;;; +202B;RIGHT-TO-LEFT EMBEDDING;Cf;0;RLE;;;;;N;;;;; +202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;; +202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;; +202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;; +202F;NARROW NO-BREAK SPACE;Zs;0;WS;<noBreak> 0020;;;;N;;;;; +2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;; +2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; +2032;PRIME;Po;0;ET;;;;;N;;;;; +2033;DOUBLE PRIME;Po;0;ET;<compat> 2032 2032;;;;N;;;;; +2034;TRIPLE PRIME;Po;0;ET;<compat> 2032 2032 2032;;;;N;;;;; +2035;REVERSED PRIME;Po;0;ON;;;;;N;;;;; +2036;REVERSED DOUBLE PRIME;Po;0;ON;<compat> 2035 2035;;;;N;;;;; +2037;REVERSED TRIPLE PRIME;Po;0;ON;<compat> 2035 2035 2035;;;;N;;;;; +2038;CARET;Po;0;ON;;;;;N;;;;; +2039;SINGLE LEFT-POINTING ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING SINGLE GUILLEMET;;;; +203A;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING SINGLE GUILLEMET;;;; +203B;REFERENCE MARK;Po;0;ON;;;;;N;;;;; +203C;DOUBLE EXCLAMATION MARK;Po;0;ON;<compat> 0021 0021;;;;N;;;;; +203D;INTERROBANG;Po;0;ON;;;;;N;;;;; +203E;OVERLINE;Po;0;ON;<compat> 0020 0305;;;;N;SPACING OVERSCORE;;;; +203F;UNDERTIE;Pc;0;ON;;;;;N;;Enotikon;;; +2040;CHARACTER TIE;Pc;0;ON;;;;;N;;;;; +2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;; +2042;ASTERISM;Po;0;ON;;;;;N;;;;; +2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;; +2044;FRACTION SLASH;Sm;0;ON;;;;;N;;;;; +2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;; +2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;; +2047;DOUBLE QUESTION MARK;Po;0;ON;<compat> 003F 003F;;;;N;;;;; +2048;QUESTION EXCLAMATION MARK;Po;0;ON;<compat> 003F 0021;;;;N;;;;; +2049;EXCLAMATION QUESTION MARK;Po;0;ON;<compat> 0021 003F;;;;N;;;;; +204A;TIRONIAN SIGN ET;Po;0;ON;;;;;N;;;;; +204B;REVERSED PILCROW SIGN;Po;0;ON;;;;;N;;;;; +204C;BLACK LEFTWARDS BULLET;Po;0;ON;;;;;N;;;;; +204D;BLACK RIGHTWARDS BULLET;Po;0;ON;;;;;N;;;;; +204E;LOW ASTERISK;Po;0;ON;;;;;N;;;;; +204F;REVERSED SEMICOLON;Po;0;ON;;;;;N;;;;; +2050;CLOSE UP;Po;0;ON;;;;;N;;;;; +2051;TWO ASTERISKS ALIGNED VERTICALLY;Po;0;ON;;;;;N;;;;; +2052;COMMERCIAL MINUS SIGN;Sm;0;ON;;;;;N;;;;; +2057;QUADRUPLE PRIME;Po;0;ON;<compat> 2032 2032 2032 2032;;;;N;;;;; +205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2060;WORD JOINER;Cf;0;BN;;;;;N;;;;; +2061;FUNCTION APPLICATION;Cf;0;BN;;;;;N;;;;; +2062;INVISIBLE TIMES;Cf;0;BN;;;;;N;;;;; +2063;INVISIBLE SEPARATOR;Cf;0;BN;;;;;N;;;;; +206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; +206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; +206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; +206D;ACTIVATE ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; +206E;NATIONAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; +206F;NOMINAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; +2070;SUPERSCRIPT ZERO;No;0;EN;<super> 0030;0;0;0;N;SUPERSCRIPT DIGIT ZERO;;;; +2071;SUPERSCRIPT LATIN SMALL LETTER I;Ll;0;L;<super> 0069;;;;N;;;;; +2074;SUPERSCRIPT FOUR;No;0;EN;<super> 0034;4;4;4;N;SUPERSCRIPT DIGIT FOUR;;;; +2075;SUPERSCRIPT FIVE;No;0;EN;<super> 0035;5;5;5;N;SUPERSCRIPT DIGIT FIVE;;;; +2076;SUPERSCRIPT SIX;No;0;EN;<super> 0036;6;6;6;N;SUPERSCRIPT DIGIT SIX;;;; +2077;SUPERSCRIPT SEVEN;No;0;EN;<super> 0037;7;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;; +2078;SUPERSCRIPT EIGHT;No;0;EN;<super> 0038;8;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;; +2079;SUPERSCRIPT NINE;No;0;EN;<super> 0039;9;9;9;N;SUPERSCRIPT DIGIT NINE;;;; +207A;SUPERSCRIPT PLUS SIGN;Sm;0;ET;<super> 002B;;;;N;;;;; +207B;SUPERSCRIPT MINUS;Sm;0;ET;<super> 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;; +207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON;<super> 003D;;;;N;;;;; +207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON;<super> 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;; +207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<super> 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;; +207F;SUPERSCRIPT LATIN SMALL LETTER N;Ll;0;L;<super> 006E;;;;N;;;;; +2080;SUBSCRIPT ZERO;No;0;EN;<sub> 0030;0;0;0;N;SUBSCRIPT DIGIT ZERO;;;; +2081;SUBSCRIPT ONE;No;0;EN;<sub> 0031;1;1;1;N;SUBSCRIPT DIGIT ONE;;;; +2082;SUBSCRIPT TWO;No;0;EN;<sub> 0032;2;2;2;N;SUBSCRIPT DIGIT TWO;;;; +2083;SUBSCRIPT THREE;No;0;EN;<sub> 0033;3;3;3;N;SUBSCRIPT DIGIT THREE;;;; +2084;SUBSCRIPT FOUR;No;0;EN;<sub> 0034;4;4;4;N;SUBSCRIPT DIGIT FOUR;;;; +2085;SUBSCRIPT FIVE;No;0;EN;<sub> 0035;5;5;5;N;SUBSCRIPT DIGIT FIVE;;;; +2086;SUBSCRIPT SIX;No;0;EN;<sub> 0036;6;6;6;N;SUBSCRIPT DIGIT SIX;;;; +2087;SUBSCRIPT SEVEN;No;0;EN;<sub> 0037;7;7;7;N;SUBSCRIPT DIGIT SEVEN;;;; +2088;SUBSCRIPT EIGHT;No;0;EN;<sub> 0038;8;8;8;N;SUBSCRIPT DIGIT EIGHT;;;; +2089;SUBSCRIPT NINE;No;0;EN;<sub> 0039;9;9;9;N;SUBSCRIPT DIGIT NINE;;;; +208A;SUBSCRIPT PLUS SIGN;Sm;0;ET;<sub> 002B;;;;N;;;;; +208B;SUBSCRIPT MINUS;Sm;0;ET;<sub> 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;; +208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON;<sub> 003D;;;;N;;;;; +208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON;<sub> 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;; +208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<sub> 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;; +20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; +20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;; +20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;; +20A3;FRENCH FRANC SIGN;Sc;0;ET;;;;;N;;;;; +20A4;LIRA SIGN;Sc;0;ET;;;;;N;;;;; +20A5;MILL SIGN;Sc;0;ET;;;;;N;;;;; +20A6;NAIRA SIGN;Sc;0;ET;;;;;N;;;;; +20A7;PESETA SIGN;Sc;0;ET;;;;;N;;;;; +20A8;RUPEE SIGN;Sc;0;ET;<compat> 0052 0073;;;;N;;;;; +20A9;WON SIGN;Sc;0;ET;;;;;N;;;;; +20AA;NEW SHEQEL SIGN;Sc;0;ET;;;;;N;;;;; +20AB;DONG SIGN;Sc;0;ET;;;;;N;;;;; +20AC;EURO SIGN;Sc;0;ET;;;;;N;;;;; +20AD;KIP SIGN;Sc;0;ET;;;;;N;;;;; +20AE;TUGRIK SIGN;Sc;0;ET;;;;;N;;;;; +20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;; +20B0;GERMAN PENNY SIGN;Sc;0;ET;;;;;N;;;;; +20B1;PESO SIGN;Sc;0;ET;;;;;N;;;;; +20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;; +20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;; +20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;; +20D3;COMBINING SHORT VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT VERTICAL BAR OVERLAY;;;; +20D4;COMBINING ANTICLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING ANTICLOCKWISE ARROW ABOVE;;;; +20D5;COMBINING CLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING CLOCKWISE ARROW ABOVE;;;; +20D6;COMBINING LEFT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT ARROW ABOVE;;;; +20D7;COMBINING RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT ARROW ABOVE;;;; +20D8;COMBINING RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING RING OVERLAY;;;; +20D9;COMBINING CLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING CLOCKWISE RING OVERLAY;;;; +20DA;COMBINING ANTICLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING ANTICLOCKWISE RING OVERLAY;;;; +20DB;COMBINING THREE DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING THREE DOTS ABOVE;;;; +20DC;COMBINING FOUR DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING FOUR DOTS ABOVE;;;; +20DD;COMBINING ENCLOSING CIRCLE;Me;0;NSM;;;;;N;ENCLOSING CIRCLE;;;; +20DE;COMBINING ENCLOSING SQUARE;Me;0;NSM;;;;;N;ENCLOSING SQUARE;;;; +20DF;COMBINING ENCLOSING DIAMOND;Me;0;NSM;;;;;N;ENCLOSING DIAMOND;;;; +20E0;COMBINING ENCLOSING CIRCLE BACKSLASH;Me;0;NSM;;;;;N;ENCLOSING CIRCLE SLASH;;;; +20E1;COMBINING LEFT RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT RIGHT ARROW ABOVE;;;; +20E2;COMBINING ENCLOSING SCREEN;Me;0;NSM;;;;;N;;;;; +20E3;COMBINING ENCLOSING KEYCAP;Me;0;NSM;;;;;N;;;;; +20E4;COMBINING ENCLOSING UPWARD POINTING TRIANGLE;Me;0;NSM;;;;;N;;;;; +20E5;COMBINING REVERSE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; +20E6;COMBINING DOUBLE VERTICAL STROKE OVERLAY;Mn;1;NSM;;;;;N;;;;; +20E7;COMBINING ANNUITY SYMBOL;Mn;230;NSM;;;;;N;;;;; +20E8;COMBINING TRIPLE UNDERDOT;Mn;220;NSM;;;;;N;;;;; +20E9;COMBINING WIDE BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; +20EA;COMBINING LEFTWARDS ARROW OVERLAY;Mn;1;NSM;;;;;N;;;;; +2100;ACCOUNT OF;So;0;ON;<compat> 0061 002F 0063;;;;N;;;;; +2101;ADDRESSED TO THE SUBJECT;So;0;ON;<compat> 0061 002F 0073;;;;N;;;;; +2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L;<font> 0043;;;;N;DOUBLE-STRUCK C;;;; +2103;DEGREE CELSIUS;So;0;ON;<compat> 00B0 0043;;;;N;DEGREES CENTIGRADE;;;; +2104;CENTRE LINE SYMBOL;So;0;ON;;;;;N;C L SYMBOL;;;; +2105;CARE OF;So;0;ON;<compat> 0063 002F 006F;;;;N;;;;; +2106;CADA UNA;So;0;ON;<compat> 0063 002F 0075;;;;N;;;;; +2107;EULER CONSTANT;Lu;0;L;<compat> 0190;;;;N;EULERS;;;; +2108;SCRUPLE;So;0;ON;;;;;N;;;;; +2109;DEGREE FAHRENHEIT;So;0;ON;<compat> 00B0 0046;;;;N;DEGREES FAHRENHEIT;;;; +210A;SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +210B;SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;SCRIPT H;;;; +210C;BLACK-LETTER CAPITAL H;Lu;0;L;<font> 0048;;;;N;BLACK-LETTER H;;;; +210D;DOUBLE-STRUCK CAPITAL H;Lu;0;L;<font> 0048;;;;N;DOUBLE-STRUCK H;;;; +210E;PLANCK CONSTANT;Ll;0;L;<font> 0068;;;;N;;;;; +210F;PLANCK CONSTANT OVER TWO PI;Ll;0;L;<font> 0127;;;;N;PLANCK CONSTANT OVER 2 PI;;;; +2110;SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;SCRIPT I;;;; +2111;BLACK-LETTER CAPITAL I;Lu;0;L;<font> 0049;;;;N;BLACK-LETTER I;;;; +2112;SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;SCRIPT L;;;; +2113;SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +2114;L B BAR SYMBOL;So;0;ON;;;;;N;;;;; +2115;DOUBLE-STRUCK CAPITAL N;Lu;0;L;<font> 004E;;;;N;DOUBLE-STRUCK N;;;; +2116;NUMERO SIGN;So;0;ON;<compat> 004E 006F;;;;N;NUMERO;;;; +2117;SOUND RECORDING COPYRIGHT;So;0;ON;;;;;N;;;;; +2118;SCRIPT CAPITAL P;So;0;ON;;;;;N;SCRIPT P;;;; +2119;DOUBLE-STRUCK CAPITAL P;Lu;0;L;<font> 0050;;;;N;DOUBLE-STRUCK P;;;; +211A;DOUBLE-STRUCK CAPITAL Q;Lu;0;L;<font> 0051;;;;N;DOUBLE-STRUCK Q;;;; +211B;SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;SCRIPT R;;;; +211C;BLACK-LETTER CAPITAL R;Lu;0;L;<font> 0052;;;;N;BLACK-LETTER R;;;; +211D;DOUBLE-STRUCK CAPITAL R;Lu;0;L;<font> 0052;;;;N;DOUBLE-STRUCK R;;;; +211E;PRESCRIPTION TAKE;So;0;ON;;;;;N;;;;; +211F;RESPONSE;So;0;ON;;;;;N;;;;; +2120;SERVICE MARK;So;0;ON;<super> 0053 004D;;;;N;;;;; +2121;TELEPHONE SIGN;So;0;ON;<compat> 0054 0045 004C;;;;N;T E L SYMBOL;;;; +2122;TRADE MARK SIGN;So;0;ON;<super> 0054 004D;;;;N;TRADEMARK;;;; +2123;VERSICLE;So;0;ON;;;;;N;;;;; +2124;DOUBLE-STRUCK CAPITAL Z;Lu;0;L;<font> 005A;;;;N;DOUBLE-STRUCK Z;;;; +2125;OUNCE SIGN;So;0;ON;;;;;N;OUNCE;;;; +2126;OHM SIGN;Lu;0;L;03A9;;;;N;OHM;;;03C9; +2127;INVERTED OHM SIGN;So;0;ON;;;;;N;MHO;;;; +2128;BLACK-LETTER CAPITAL Z;Lu;0;L;<font> 005A;;;;N;BLACK-LETTER Z;;;; +2129;TURNED GREEK SMALL LETTER IOTA;So;0;ON;;;;;N;;;;; +212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B; +212B;ANGSTROM SIGN;Lu;0;L;00C5;;;;N;ANGSTROM UNIT;;;00E5; +212C;SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;SCRIPT B;;;; +212D;BLACK-LETTER CAPITAL C;Lu;0;L;<font> 0043;;;;N;BLACK-LETTER C;;;; +212E;ESTIMATED SYMBOL;So;0;ET;;;;;N;;;;; +212F;SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +2130;SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;SCRIPT E;;;; +2131;SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;SCRIPT F;;;; +2132;TURNED CAPITAL F;So;0;ON;;;;;N;TURNED F;;;; +2133;SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;SCRIPT M;;;; +2134;SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +2135;ALEF SYMBOL;Lo;0;L;<compat> 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;; +2136;BET SYMBOL;Lo;0;L;<compat> 05D1;;;;N;SECOND TRANSFINITE CARDINAL;;;; +2137;GIMEL SYMBOL;Lo;0;L;<compat> 05D2;;;;N;THIRD TRANSFINITE CARDINAL;;;; +2138;DALET SYMBOL;Lo;0;L;<compat> 05D3;;;;N;FOURTH TRANSFINITE CARDINAL;;;; +2139;INFORMATION SOURCE;Ll;0;L;<font> 0069;;;;N;;;;; +213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;; +213D;DOUBLE-STRUCK SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +213E;DOUBLE-STRUCK CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +213F;DOUBLE-STRUCK CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +2140;DOUBLE-STRUCK N-ARY SUMMATION;Sm;0;ON;<font> 2211;;;;Y;;;;; +2141;TURNED SANS-SERIF CAPITAL G;Sm;0;ON;;;;;N;;;;; +2142;TURNED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;; +2143;REVERSED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;; +2144;TURNED SANS-SERIF CAPITAL Y;Sm;0;ON;;;;;N;;;;; +2145;DOUBLE-STRUCK ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +2146;DOUBLE-STRUCK ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +2147;DOUBLE-STRUCK ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +2148;DOUBLE-STRUCK ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +2149;DOUBLE-STRUCK ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +214A;PROPERTY LINE;So;0;ON;;;;;N;;;;; +214B;TURNED AMPERSAND;Sm;0;ON;;;;;N;;;;; +2153;VULGAR FRACTION ONE THIRD;No;0;ON;<fraction> 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;; +2154;VULGAR FRACTION TWO THIRDS;No;0;ON;<fraction> 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;; +2155;VULGAR FRACTION ONE FIFTH;No;0;ON;<fraction> 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;; +2156;VULGAR FRACTION TWO FIFTHS;No;0;ON;<fraction> 0032 2044 0035;;;2/5;N;FRACTION TWO FIFTHS;;;; +2157;VULGAR FRACTION THREE FIFTHS;No;0;ON;<fraction> 0033 2044 0035;;;3/5;N;FRACTION THREE FIFTHS;;;; +2158;VULGAR FRACTION FOUR FIFTHS;No;0;ON;<fraction> 0034 2044 0035;;;4/5;N;FRACTION FOUR FIFTHS;;;; +2159;VULGAR FRACTION ONE SIXTH;No;0;ON;<fraction> 0031 2044 0036;;;1/6;N;FRACTION ONE SIXTH;;;; +215A;VULGAR FRACTION FIVE SIXTHS;No;0;ON;<fraction> 0035 2044 0036;;;5/6;N;FRACTION FIVE SIXTHS;;;; +215B;VULGAR FRACTION ONE EIGHTH;No;0;ON;<fraction> 0031 2044 0038;;;1/8;N;FRACTION ONE EIGHTH;;;; +215C;VULGAR FRACTION THREE EIGHTHS;No;0;ON;<fraction> 0033 2044 0038;;;3/8;N;FRACTION THREE EIGHTHS;;;; +215D;VULGAR FRACTION FIVE EIGHTHS;No;0;ON;<fraction> 0035 2044 0038;;;5/8;N;FRACTION FIVE EIGHTHS;;;; +215E;VULGAR FRACTION SEVEN EIGHTHS;No;0;ON;<fraction> 0037 2044 0038;;;7/8;N;FRACTION SEVEN EIGHTHS;;;; +215F;FRACTION NUMERATOR ONE;No;0;ON;<fraction> 0031 2044;;;1;N;;;;; +2160;ROMAN NUMERAL ONE;Nl;0;L;<compat> 0049;;;1;N;;;;2170; +2161;ROMAN NUMERAL TWO;Nl;0;L;<compat> 0049 0049;;;2;N;;;;2171; +2162;ROMAN NUMERAL THREE;Nl;0;L;<compat> 0049 0049 0049;;;3;N;;;;2172; +2163;ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0049 0056;;;4;N;;;;2173; +2164;ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0056;;;5;N;;;;2174; +2165;ROMAN NUMERAL SIX;Nl;0;L;<compat> 0056 0049;;;6;N;;;;2175; +2166;ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0056 0049 0049;;;7;N;;;;2176; +2167;ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0056 0049 0049 0049;;;8;N;;;;2177; +2168;ROMAN NUMERAL NINE;Nl;0;L;<compat> 0049 0058;;;9;N;;;;2178; +2169;ROMAN NUMERAL TEN;Nl;0;L;<compat> 0058;;;10;N;;;;2179; +216A;ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0058 0049;;;11;N;;;;217A; +216B;ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0058 0049 0049;;;12;N;;;;217B; +216C;ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 004C;;;50;N;;;;217C; +216D;ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0043;;;100;N;;;;217D; +216E;ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0044;;;500;N;;;;217E; +216F;ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 004D;;;1000;N;;;;217F; +2170;SMALL ROMAN NUMERAL ONE;Nl;0;L;<compat> 0069;;;1;N;;;2160;;2160 +2171;SMALL ROMAN NUMERAL TWO;Nl;0;L;<compat> 0069 0069;;;2;N;;;2161;;2161 +2172;SMALL ROMAN NUMERAL THREE;Nl;0;L;<compat> 0069 0069 0069;;;3;N;;;2162;;2162 +2173;SMALL ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0069 0076;;;4;N;;;2163;;2163 +2174;SMALL ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0076;;;5;N;;;2164;;2164 +2175;SMALL ROMAN NUMERAL SIX;Nl;0;L;<compat> 0076 0069;;;6;N;;;2165;;2165 +2176;SMALL ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0076 0069 0069;;;7;N;;;2166;;2166 +2177;SMALL ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0076 0069 0069 0069;;;8;N;;;2167;;2167 +2178;SMALL ROMAN NUMERAL NINE;Nl;0;L;<compat> 0069 0078;;;9;N;;;2168;;2168 +2179;SMALL ROMAN NUMERAL TEN;Nl;0;L;<compat> 0078;;;10;N;;;2169;;2169 +217A;SMALL ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0078 0069;;;11;N;;;216A;;216A +217B;SMALL ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0078 0069 0069;;;12;N;;;216B;;216B +217C;SMALL ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 006C;;;50;N;;;216C;;216C +217D;SMALL ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0063;;;100;N;;;216D;;216D +217E;SMALL ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0064;;;500;N;;;216E;;216E +217F;SMALL ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 006D;;;1000;N;;;216F;;216F +2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;; +2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;; +2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;; +2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Nl;0;L;;;;;N;;;;; +2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;; +2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;; +2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;; +2193;DOWNWARDS ARROW;Sm;0;ON;;;;;N;DOWN ARROW;;;; +2194;LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; +2195;UP DOWN ARROW;So;0;ON;;;;;N;;;;; +2196;NORTH WEST ARROW;So;0;ON;;;;;N;UPPER LEFT ARROW;;;; +2197;NORTH EAST ARROW;So;0;ON;;;;;N;UPPER RIGHT ARROW;;;; +2198;SOUTH EAST ARROW;So;0;ON;;;;;N;LOWER RIGHT ARROW;;;; +2199;SOUTH WEST ARROW;So;0;ON;;;;;N;LOWER LEFT ARROW;;;; +219A;LEFTWARDS ARROW WITH STROKE;Sm;0;ON;2190 0338;;;;N;LEFT ARROW WITH STROKE;;;; +219B;RIGHTWARDS ARROW WITH STROKE;Sm;0;ON;2192 0338;;;;N;RIGHT ARROW WITH STROKE;;;; +219C;LEFTWARDS WAVE ARROW;So;0;ON;;;;;N;LEFT WAVE ARROW;;;; +219D;RIGHTWARDS WAVE ARROW;So;0;ON;;;;;N;RIGHT WAVE ARROW;;;; +219E;LEFTWARDS TWO HEADED ARROW;So;0;ON;;;;;N;LEFT TWO HEADED ARROW;;;; +219F;UPWARDS TWO HEADED ARROW;So;0;ON;;;;;N;UP TWO HEADED ARROW;;;; +21A0;RIGHTWARDS TWO HEADED ARROW;Sm;0;ON;;;;;N;RIGHT TWO HEADED ARROW;;;; +21A1;DOWNWARDS TWO HEADED ARROW;So;0;ON;;;;;N;DOWN TWO HEADED ARROW;;;; +21A2;LEFTWARDS ARROW WITH TAIL;So;0;ON;;;;;N;LEFT ARROW WITH TAIL;;;; +21A3;RIGHTWARDS ARROW WITH TAIL;Sm;0;ON;;;;;N;RIGHT ARROW WITH TAIL;;;; +21A4;LEFTWARDS ARROW FROM BAR;So;0;ON;;;;;N;LEFT ARROW FROM BAR;;;; +21A5;UPWARDS ARROW FROM BAR;So;0;ON;;;;;N;UP ARROW FROM BAR;;;; +21A6;RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;RIGHT ARROW FROM BAR;;;; +21A7;DOWNWARDS ARROW FROM BAR;So;0;ON;;;;;N;DOWN ARROW FROM BAR;;;; +21A8;UP DOWN ARROW WITH BASE;So;0;ON;;;;;N;;;;; +21A9;LEFTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;LEFT ARROW WITH HOOK;;;; +21AA;RIGHTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;RIGHT ARROW WITH HOOK;;;; +21AB;LEFTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;LEFT ARROW WITH LOOP;;;; +21AC;RIGHTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;RIGHT ARROW WITH LOOP;;;; +21AD;LEFT RIGHT WAVE ARROW;So;0;ON;;;;;N;;;;; +21AE;LEFT RIGHT ARROW WITH STROKE;Sm;0;ON;2194 0338;;;;N;;;;; +21AF;DOWNWARDS ZIGZAG ARROW;So;0;ON;;;;;N;DOWN ZIGZAG ARROW;;;; +21B0;UPWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP LEFT;;;; +21B1;UPWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP RIGHT;;;; +21B2;DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP LEFT;;;; +21B3;DOWNWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP RIGHT;;;; +21B4;RIGHTWARDS ARROW WITH CORNER DOWNWARDS;So;0;ON;;;;;N;RIGHT ARROW WITH CORNER DOWN;;;; +21B5;DOWNWARDS ARROW WITH CORNER LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH CORNER LEFT;;;; +21B6;ANTICLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; +21B7;CLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; +21B8;NORTH WEST ARROW TO LONG BAR;So;0;ON;;;;;N;UPPER LEFT ARROW TO LONG BAR;;;; +21B9;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR;;;; +21BA;ANTICLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +21BB;CLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +21BC;LEFTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB UP;;;; +21BD;LEFTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB DOWN;;;; +21BE;UPWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB RIGHT;;;; +21BF;UPWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB LEFT;;;; +21C0;RIGHTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB UP;;;; +21C1;RIGHTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB DOWN;;;; +21C2;DOWNWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB RIGHT;;;; +21C3;DOWNWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB LEFT;;;; +21C4;RIGHTWARDS ARROW OVER LEFTWARDS ARROW;So;0;ON;;;;;N;RIGHT ARROW OVER LEFT ARROW;;;; +21C5;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW;So;0;ON;;;;;N;UP ARROW LEFT OF DOWN ARROW;;;; +21C6;LEFTWARDS ARROW OVER RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT ARROW OVER RIGHT ARROW;;;; +21C7;LEFTWARDS PAIRED ARROWS;So;0;ON;;;;;N;LEFT PAIRED ARROWS;;;; +21C8;UPWARDS PAIRED ARROWS;So;0;ON;;;;;N;UP PAIRED ARROWS;;;; +21C9;RIGHTWARDS PAIRED ARROWS;So;0;ON;;;;;N;RIGHT PAIRED ARROWS;;;; +21CA;DOWNWARDS PAIRED ARROWS;So;0;ON;;;;;N;DOWN PAIRED ARROWS;;;; +21CB;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON;So;0;ON;;;;;N;LEFT HARPOON OVER RIGHT HARPOON;;;; +21CC;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON;So;0;ON;;;;;N;RIGHT HARPOON OVER LEFT HARPOON;;;; +21CD;LEFTWARDS DOUBLE ARROW WITH STROKE;So;0;ON;21D0 0338;;;;N;LEFT DOUBLE ARROW WITH STROKE;;;; +21CE;LEFT RIGHT DOUBLE ARROW WITH STROKE;Sm;0;ON;21D4 0338;;;;N;;;;; +21CF;RIGHTWARDS DOUBLE ARROW WITH STROKE;Sm;0;ON;21D2 0338;;;;N;RIGHT DOUBLE ARROW WITH STROKE;;;; +21D0;LEFTWARDS DOUBLE ARROW;So;0;ON;;;;;N;LEFT DOUBLE ARROW;;;; +21D1;UPWARDS DOUBLE ARROW;So;0;ON;;;;;N;UP DOUBLE ARROW;;;; +21D2;RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;RIGHT DOUBLE ARROW;;;; +21D3;DOWNWARDS DOUBLE ARROW;So;0;ON;;;;;N;DOWN DOUBLE ARROW;;;; +21D4;LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +21D5;UP DOWN DOUBLE ARROW;So;0;ON;;;;;N;;;;; +21D6;NORTH WEST DOUBLE ARROW;So;0;ON;;;;;N;UPPER LEFT DOUBLE ARROW;;;; +21D7;NORTH EAST DOUBLE ARROW;So;0;ON;;;;;N;UPPER RIGHT DOUBLE ARROW;;;; +21D8;SOUTH EAST DOUBLE ARROW;So;0;ON;;;;;N;LOWER RIGHT DOUBLE ARROW;;;; +21D9;SOUTH WEST DOUBLE ARROW;So;0;ON;;;;;N;LOWER LEFT DOUBLE ARROW;;;; +21DA;LEFTWARDS TRIPLE ARROW;So;0;ON;;;;;N;LEFT TRIPLE ARROW;;;; +21DB;RIGHTWARDS TRIPLE ARROW;So;0;ON;;;;;N;RIGHT TRIPLE ARROW;;;; +21DC;LEFTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;LEFT SQUIGGLE ARROW;;;; +21DD;RIGHTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;RIGHT SQUIGGLE ARROW;;;; +21DE;UPWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;UP ARROW WITH DOUBLE STROKE;;;; +21DF;DOWNWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;DOWN ARROW WITH DOUBLE STROKE;;;; +21E0;LEFTWARDS DASHED ARROW;So;0;ON;;;;;N;LEFT DASHED ARROW;;;; +21E1;UPWARDS DASHED ARROW;So;0;ON;;;;;N;UP DASHED ARROW;;;; +21E2;RIGHTWARDS DASHED ARROW;So;0;ON;;;;;N;RIGHT DASHED ARROW;;;; +21E3;DOWNWARDS DASHED ARROW;So;0;ON;;;;;N;DOWN DASHED ARROW;;;; +21E4;LEFTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR;;;; +21E5;RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;RIGHT ARROW TO BAR;;;; +21E6;LEFTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE LEFT ARROW;;;; +21E7;UPWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE UP ARROW;;;; +21E8;RIGHTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE RIGHT ARROW;;;; +21E9;DOWNWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE DOWN ARROW;;;; +21EA;UPWARDS WHITE ARROW FROM BAR;So;0;ON;;;;;N;WHITE UP ARROW FROM BAR;;;; +21EB;UPWARDS WHITE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; +21EC;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; +21ED;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; +21EE;UPWARDS WHITE DOUBLE ARROW;So;0;ON;;;;;N;;;;; +21EF;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; +21F0;RIGHTWARDS WHITE ARROW FROM WALL;So;0;ON;;;;;N;;;;; +21F1;NORTH WEST ARROW TO CORNER;So;0;ON;;;;;N;;;;; +21F2;SOUTH EAST ARROW TO CORNER;So;0;ON;;;;;N;;;;; +21F3;UP DOWN WHITE ARROW;So;0;ON;;;;;N;;;;; +21F4;RIGHT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +21F5;DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW;Sm;0;ON;;;;;N;;;;; +21F6;THREE RIGHTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; +21F7;LEFTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21F8;RIGHTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21F9;LEFT RIGHT ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FA;LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FB;RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FC;LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FD;LEFTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +21FE;RIGHTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +21FF;LEFT RIGHT OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +2200;FOR ALL;Sm;0;ON;;;;;N;;;;; +2201;COMPLEMENT;Sm;0;ON;;;;;Y;;;;; +2202;PARTIAL DIFFERENTIAL;Sm;0;ON;;;;;Y;;;;; +2203;THERE EXISTS;Sm;0;ON;;;;;Y;;;;; +2204;THERE DOES NOT EXIST;Sm;0;ON;2203 0338;;;;Y;;;;; +2205;EMPTY SET;Sm;0;ON;;;;;N;;;;; +2206;INCREMENT;Sm;0;ON;;;;;N;;;;; +2207;NABLA;Sm;0;ON;;;;;N;;;;; +2208;ELEMENT OF;Sm;0;ON;;;;;Y;;;;; +2209;NOT AN ELEMENT OF;Sm;0;ON;2208 0338;;;;Y;;;;; +220A;SMALL ELEMENT OF;Sm;0;ON;;;;;Y;;;;; +220B;CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; +220C;DOES NOT CONTAIN AS MEMBER;Sm;0;ON;220B 0338;;;;Y;;;;; +220D;SMALL CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; +220E;END OF PROOF;Sm;0;ON;;;;;N;;;;; +220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;; +2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;; +2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;; +2212;MINUS SIGN;Sm;0;ET;;;;;N;;;;; +2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;; +2214;DOT PLUS;Sm;0;ON;;;;;N;;;;; +2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; +2216;SET MINUS;Sm;0;ON;;;;;Y;;;;; +2217;ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; +2218;RING OPERATOR;Sm;0;ON;;;;;N;;;;; +2219;BULLET OPERATOR;Sm;0;ON;;;;;N;;;;; +221A;SQUARE ROOT;Sm;0;ON;;;;;Y;;;;; +221B;CUBE ROOT;Sm;0;ON;;;;;Y;;;;; +221C;FOURTH ROOT;Sm;0;ON;;;;;Y;;;;; +221D;PROPORTIONAL TO;Sm;0;ON;;;;;Y;;;;; +221E;INFINITY;Sm;0;ON;;;;;N;;;;; +221F;RIGHT ANGLE;Sm;0;ON;;;;;Y;;;;; +2220;ANGLE;Sm;0;ON;;;;;Y;;;;; +2221;MEASURED ANGLE;Sm;0;ON;;;;;Y;;;;; +2222;SPHERICAL ANGLE;Sm;0;ON;;;;;Y;;;;; +2223;DIVIDES;Sm;0;ON;;;;;N;;;;; +2224;DOES NOT DIVIDE;Sm;0;ON;2223 0338;;;;Y;;;;; +2225;PARALLEL TO;Sm;0;ON;;;;;N;;;;; +2226;NOT PARALLEL TO;Sm;0;ON;2225 0338;;;;Y;;;;; +2227;LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2228;LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2229;INTERSECTION;Sm;0;ON;;;;;N;;;;; +222A;UNION;Sm;0;ON;;;;;N;;;;; +222B;INTEGRAL;Sm;0;ON;;;;;Y;;;;; +222C;DOUBLE INTEGRAL;Sm;0;ON;<compat> 222B 222B;;;;Y;;;;; +222D;TRIPLE INTEGRAL;Sm;0;ON;<compat> 222B 222B 222B;;;;Y;;;;; +222E;CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +222F;SURFACE INTEGRAL;Sm;0;ON;<compat> 222E 222E;;;;Y;;;;; +2230;VOLUME INTEGRAL;Sm;0;ON;<compat> 222E 222E 222E;;;;Y;;;;; +2231;CLOCKWISE INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2232;CLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2233;ANTICLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2234;THEREFORE;Sm;0;ON;;;;;N;;;;; +2235;BECAUSE;Sm;0;ON;;;;;N;;;;; +2236;RATIO;Sm;0;ON;;;;;N;;;;; +2237;PROPORTION;Sm;0;ON;;;;;N;;;;; +2238;DOT MINUS;Sm;0;ON;;;;;N;;;;; +2239;EXCESS;Sm;0;ON;;;;;Y;;;;; +223A;GEOMETRIC PROPORTION;Sm;0;ON;;;;;N;;;;; +223B;HOMOTHETIC;Sm;0;ON;;;;;Y;;;;; +223C;TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +223D;REVERSED TILDE;Sm;0;ON;;;;;Y;;lazy S;;; +223E;INVERTED LAZY S;Sm;0;ON;;;;;Y;;;;; +223F;SINE WAVE;Sm;0;ON;;;;;Y;;;;; +2240;WREATH PRODUCT;Sm;0;ON;;;;;Y;;;;; +2241;NOT TILDE;Sm;0;ON;223C 0338;;;;Y;;;;; +2242;MINUS TILDE;Sm;0;ON;;;;;Y;;;;; +2243;ASYMPTOTICALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2244;NOT ASYMPTOTICALLY EQUAL TO;Sm;0;ON;2243 0338;;;;Y;;;;; +2245;APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2246;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2247;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO;Sm;0;ON;2245 0338;;;;Y;;;;; +2248;ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2249;NOT ALMOST EQUAL TO;Sm;0;ON;2248 0338;;;;Y;;;;; +224A;ALMOST EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +224B;TRIPLE TILDE;Sm;0;ON;;;;;Y;;;;; +224C;ALL EQUAL TO;Sm;0;ON;;;;;Y;;;;; +224D;EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +224E;GEOMETRICALLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +224F;DIFFERENCE BETWEEN;Sm;0;ON;;;;;N;;;;; +2250;APPROACHES THE LIMIT;Sm;0;ON;;;;;N;;;;; +2251;GEOMETRICALLY EQUAL TO;Sm;0;ON;;;;;N;;;;; +2252;APPROXIMATELY EQUAL TO OR THE IMAGE OF;Sm;0;ON;;;;;Y;;;;; +2253;IMAGE OF OR APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2254;COLON EQUALS;Sm;0;ON;;;;;Y;COLON EQUAL;;;; +2255;EQUALS COLON;Sm;0;ON;;;;;Y;EQUAL COLON;;;; +2256;RING IN EQUAL TO;Sm;0;ON;;;;;N;;;;; +2257;RING EQUAL TO;Sm;0;ON;;;;;N;;;;; +2258;CORRESPONDS TO;Sm;0;ON;;;;;N;;;;; +2259;ESTIMATES;Sm;0;ON;;;;;N;;;;; +225A;EQUIANGULAR TO;Sm;0;ON;;;;;N;;;;; +225B;STAR EQUALS;Sm;0;ON;;;;;N;;;;; +225C;DELTA EQUAL TO;Sm;0;ON;;;;;N;;;;; +225D;EQUAL TO BY DEFINITION;Sm;0;ON;;;;;N;;;;; +225E;MEASURED BY;Sm;0;ON;;;;;N;;;;; +225F;QUESTIONED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2260;NOT EQUAL TO;Sm;0;ON;003D 0338;;;;Y;;;;; +2261;IDENTICAL TO;Sm;0;ON;;;;;N;;;;; +2262;NOT IDENTICAL TO;Sm;0;ON;2261 0338;;;;Y;;;;; +2263;STRICTLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +2264;LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUAL TO;;;; +2265;GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUAL TO;;;; +2266;LESS-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OVER EQUAL TO;;;; +2267;GREATER-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OVER EQUAL TO;;;; +2268;LESS-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUAL TO;;;; +2269;GREATER-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUAL TO;;;; +226A;MUCH LESS-THAN;Sm;0;ON;;;;;Y;MUCH LESS THAN;;;; +226B;MUCH GREATER-THAN;Sm;0;ON;;;;;Y;MUCH GREATER THAN;;;; +226C;BETWEEN;Sm;0;ON;;;;;N;;;;; +226D;NOT EQUIVALENT TO;Sm;0;ON;224D 0338;;;;N;;;;; +226E;NOT LESS-THAN;Sm;0;ON;003C 0338;;;;Y;NOT LESS THAN;;;; +226F;NOT GREATER-THAN;Sm;0;ON;003E 0338;;;;Y;NOT GREATER THAN;;;; +2270;NEITHER LESS-THAN NOR EQUAL TO;Sm;0;ON;2264 0338;;;;Y;NEITHER LESS THAN NOR EQUAL TO;;;; +2271;NEITHER GREATER-THAN NOR EQUAL TO;Sm;0;ON;2265 0338;;;;Y;NEITHER GREATER THAN NOR EQUAL TO;;;; +2272;LESS-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUIVALENT TO;;;; +2273;GREATER-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUIVALENT TO;;;; +2274;NEITHER LESS-THAN NOR EQUIVALENT TO;Sm;0;ON;2272 0338;;;;Y;NEITHER LESS THAN NOR EQUIVALENT TO;;;; +2275;NEITHER GREATER-THAN NOR EQUIVALENT TO;Sm;0;ON;2273 0338;;;;Y;NEITHER GREATER THAN NOR EQUIVALENT TO;;;; +2276;LESS-THAN OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN OR GREATER THAN;;;; +2277;GREATER-THAN OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN OR LESS THAN;;;; +2278;NEITHER LESS-THAN NOR GREATER-THAN;Sm;0;ON;2276 0338;;;;Y;NEITHER LESS THAN NOR GREATER THAN;;;; +2279;NEITHER GREATER-THAN NOR LESS-THAN;Sm;0;ON;2277 0338;;;;Y;NEITHER GREATER THAN NOR LESS THAN;;;; +227A;PRECEDES;Sm;0;ON;;;;;Y;;;;; +227B;SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +227C;PRECEDES OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +227D;SUCCEEDS OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +227E;PRECEDES OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +227F;SUCCEEDS OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +2280;DOES NOT PRECEDE;Sm;0;ON;227A 0338;;;;Y;;;;; +2281;DOES NOT SUCCEED;Sm;0;ON;227B 0338;;;;Y;;;;; +2282;SUBSET OF;Sm;0;ON;;;;;Y;;;;; +2283;SUPERSET OF;Sm;0;ON;;;;;Y;;;;; +2284;NOT A SUBSET OF;Sm;0;ON;2282 0338;;;;Y;;;;; +2285;NOT A SUPERSET OF;Sm;0;ON;2283 0338;;;;Y;;;;; +2286;SUBSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2287;SUPERSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2288;NEITHER A SUBSET OF NOR EQUAL TO;Sm;0;ON;2286 0338;;;;Y;;;;; +2289;NEITHER A SUPERSET OF NOR EQUAL TO;Sm;0;ON;2287 0338;;;;Y;;;;; +228A;SUBSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUBSET OF OR NOT EQUAL TO;;;; +228B;SUPERSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUPERSET OF OR NOT EQUAL TO;;;; +228C;MULTISET;Sm;0;ON;;;;;Y;;;;; +228D;MULTISET MULTIPLICATION;Sm;0;ON;;;;;N;;;;; +228E;MULTISET UNION;Sm;0;ON;;;;;N;;;;; +228F;SQUARE IMAGE OF;Sm;0;ON;;;;;Y;;;;; +2290;SQUARE ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; +2291;SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2292;SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2293;SQUARE CAP;Sm;0;ON;;;;;N;;;;; +2294;SQUARE CUP;Sm;0;ON;;;;;N;;;;; +2295;CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +2296;CIRCLED MINUS;Sm;0;ON;;;;;N;;;;; +2297;CIRCLED TIMES;Sm;0;ON;;;;;N;;;;; +2298;CIRCLED DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; +2299;CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +229A;CIRCLED RING OPERATOR;Sm;0;ON;;;;;N;;;;; +229B;CIRCLED ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; +229C;CIRCLED EQUALS;Sm;0;ON;;;;;N;;;;; +229D;CIRCLED DASH;Sm;0;ON;;;;;N;;;;; +229E;SQUARED PLUS;Sm;0;ON;;;;;N;;;;; +229F;SQUARED MINUS;Sm;0;ON;;;;;N;;;;; +22A0;SQUARED TIMES;Sm;0;ON;;;;;N;;;;; +22A1;SQUARED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +22A2;RIGHT TACK;Sm;0;ON;;;;;Y;;;;; +22A3;LEFT TACK;Sm;0;ON;;;;;Y;;;;; +22A4;DOWN TACK;Sm;0;ON;;;;;N;;;;; +22A5;UP TACK;Sm;0;ON;;;;;N;;;;; +22A6;ASSERTION;Sm;0;ON;;;;;Y;;;;; +22A7;MODELS;Sm;0;ON;;;;;Y;;;;; +22A8;TRUE;Sm;0;ON;;;;;Y;;;;; +22A9;FORCES;Sm;0;ON;;;;;Y;;;;; +22AA;TRIPLE VERTICAL BAR RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +22AB;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +22AC;DOES NOT PROVE;Sm;0;ON;22A2 0338;;;;Y;;;;; +22AD;NOT TRUE;Sm;0;ON;22A8 0338;;;;Y;;;;; +22AE;DOES NOT FORCE;Sm;0;ON;22A9 0338;;;;Y;;;;; +22AF;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;22AB 0338;;;;Y;;;;; +22B0;PRECEDES UNDER RELATION;Sm;0;ON;;;;;Y;;;;; +22B1;SUCCEEDS UNDER RELATION;Sm;0;ON;;;;;Y;;;;; +22B2;NORMAL SUBGROUP OF;Sm;0;ON;;;;;Y;;;;; +22B3;CONTAINS AS NORMAL SUBGROUP;Sm;0;ON;;;;;Y;;;;; +22B4;NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22B5;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22B6;ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; +22B7;IMAGE OF;Sm;0;ON;;;;;Y;;;;; +22B8;MULTIMAP;Sm;0;ON;;;;;Y;;;;; +22B9;HERMITIAN CONJUGATE MATRIX;Sm;0;ON;;;;;N;;;;; +22BA;INTERCALATE;Sm;0;ON;;;;;N;;;;; +22BB;XOR;Sm;0;ON;;;;;N;;;;; +22BC;NAND;Sm;0;ON;;;;;N;;;;; +22BD;NOR;Sm;0;ON;;;;;N;;;;; +22BE;RIGHT ANGLE WITH ARC;Sm;0;ON;;;;;Y;;;;; +22BF;RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +22C0;N-ARY LOGICAL AND;Sm;0;ON;;;;;N;;;;; +22C1;N-ARY LOGICAL OR;Sm;0;ON;;;;;N;;;;; +22C2;N-ARY INTERSECTION;Sm;0;ON;;;;;N;;;;; +22C3;N-ARY UNION;Sm;0;ON;;;;;N;;;;; +22C4;DIAMOND OPERATOR;Sm;0;ON;;;;;N;;;;; +22C5;DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +22C6;STAR OPERATOR;Sm;0;ON;;;;;N;;;;; +22C7;DIVISION TIMES;Sm;0;ON;;;;;N;;;;; +22C8;BOWTIE;Sm;0;ON;;;;;N;;;;; +22C9;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CA;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CB;LEFT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CC;RIGHT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CD;REVERSED TILDE EQUALS;Sm;0;ON;;;;;Y;;;;; +22CE;CURLY LOGICAL OR;Sm;0;ON;;;;;N;;;;; +22CF;CURLY LOGICAL AND;Sm;0;ON;;;;;N;;;;; +22D0;DOUBLE SUBSET;Sm;0;ON;;;;;Y;;;;; +22D1;DOUBLE SUPERSET;Sm;0;ON;;;;;Y;;;;; +22D2;DOUBLE INTERSECTION;Sm;0;ON;;;;;N;;;;; +22D3;DOUBLE UNION;Sm;0;ON;;;;;N;;;;; +22D4;PITCHFORK;Sm;0;ON;;;;;N;;;;; +22D5;EQUAL AND PARALLEL TO;Sm;0;ON;;;;;N;;;;; +22D6;LESS-THAN WITH DOT;Sm;0;ON;;;;;Y;LESS THAN WITH DOT;;;; +22D7;GREATER-THAN WITH DOT;Sm;0;ON;;;;;Y;GREATER THAN WITH DOT;;;; +22D8;VERY MUCH LESS-THAN;Sm;0;ON;;;;;Y;VERY MUCH LESS THAN;;;; +22D9;VERY MUCH GREATER-THAN;Sm;0;ON;;;;;Y;VERY MUCH GREATER THAN;;;; +22DA;LESS-THAN EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN EQUAL TO OR GREATER THAN;;;; +22DB;GREATER-THAN EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN EQUAL TO OR LESS THAN;;;; +22DC;EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR LESS THAN;;;; +22DD;EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR GREATER THAN;;;; +22DE;EQUAL TO OR PRECEDES;Sm;0;ON;;;;;Y;;;;; +22DF;EQUAL TO OR SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +22E0;DOES NOT PRECEDE OR EQUAL;Sm;0;ON;227C 0338;;;;Y;;;;; +22E1;DOES NOT SUCCEED OR EQUAL;Sm;0;ON;227D 0338;;;;Y;;;;; +22E2;NOT SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;2291 0338;;;;Y;;;;; +22E3;NOT SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;2292 0338;;;;Y;;;;; +22E4;SQUARE IMAGE OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22E5;SQUARE ORIGINAL OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22E6;LESS-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUIVALENT TO;;;; +22E7;GREATER-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUIVALENT TO;;;; +22E8;PRECEDES BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +22E9;SUCCEEDS BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +22EA;NOT NORMAL SUBGROUP OF;Sm;0;ON;22B2 0338;;;;Y;;;;; +22EB;DOES NOT CONTAIN AS NORMAL SUBGROUP;Sm;0;ON;22B3 0338;;;;Y;;;;; +22EC;NOT NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;22B4 0338;;;;Y;;;;; +22ED;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL;Sm;0;ON;22B5 0338;;;;Y;;;;; +22EE;VERTICAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; +22EF;MIDLINE HORIZONTAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; +22F0;UP RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; +22F1;DOWN RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; +22F2;ELEMENT OF WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F3;ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F4;SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F5;ELEMENT OF WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +22F6;ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22F7;SMALL ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22F8;ELEMENT OF WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +22F9;ELEMENT OF WITH TWO HORIZONTAL STROKES;Sm;0;ON;;;;;Y;;;;; +22FA;CONTAINS WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FB;CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FC;SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FD;CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22FE;SMALL CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22FF;Z NOTATION BAG MEMBERSHIP;Sm;0;ON;;;;;Y;;;;; +2300;DIAMETER SIGN;So;0;ON;;;;;N;;;;; +2301;ELECTRIC ARROW;So;0;ON;;;;;N;;;;; +2302;HOUSE;So;0;ON;;;;;N;;;;; +2303;UP ARROWHEAD;So;0;ON;;;;;N;;;;; +2304;DOWN ARROWHEAD;So;0;ON;;;;;N;;;;; +2305;PROJECTIVE;So;0;ON;;;;;N;;;;; +2306;PERSPECTIVE;So;0;ON;;;;;N;;;;; +2307;WAVY LINE;So;0;ON;;;;;N;;;;; +2308;LEFT CEILING;Sm;0;ON;;;;;Y;;;;; +2309;RIGHT CEILING;Sm;0;ON;;;;;Y;;;;; +230A;LEFT FLOOR;Sm;0;ON;;;;;Y;;;;; +230B;RIGHT FLOOR;Sm;0;ON;;;;;Y;;;;; +230C;BOTTOM RIGHT CROP;So;0;ON;;;;;N;;;;; +230D;BOTTOM LEFT CROP;So;0;ON;;;;;N;;;;; +230E;TOP RIGHT CROP;So;0;ON;;;;;N;;;;; +230F;TOP LEFT CROP;So;0;ON;;;;;N;;;;; +2310;REVERSED NOT SIGN;So;0;ON;;;;;N;;;;; +2311;SQUARE LOZENGE;So;0;ON;;;;;N;;;;; +2312;ARC;So;0;ON;;;;;N;;;;; +2313;SEGMENT;So;0;ON;;;;;N;;;;; +2314;SECTOR;So;0;ON;;;;;N;;;;; +2315;TELEPHONE RECORDER;So;0;ON;;;;;N;;;;; +2316;POSITION INDICATOR;So;0;ON;;;;;N;;;;; +2317;VIEWDATA SQUARE;So;0;ON;;;;;N;;;;; +2318;PLACE OF INTEREST SIGN;So;0;ON;;;;;N;COMMAND KEY;;;; +2319;TURNED NOT SIGN;So;0;ON;;;;;N;;;;; +231A;WATCH;So;0;ON;;;;;N;;;;; +231B;HOURGLASS;So;0;ON;;;;;N;;;;; +231C;TOP LEFT CORNER;So;0;ON;;;;;N;;;;; +231D;TOP RIGHT CORNER;So;0;ON;;;;;N;;;;; +231E;BOTTOM LEFT CORNER;So;0;ON;;;;;N;;;;; +231F;BOTTOM RIGHT CORNER;So;0;ON;;;;;N;;;;; +2320;TOP HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2321;BOTTOM HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2322;FROWN;So;0;ON;;;;;N;;;;; +2323;SMILE;So;0;ON;;;;;N;;;;; +2324;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS;So;0;ON;;;;;N;ENTER KEY;;;; +2325;OPTION KEY;So;0;ON;;;;;N;;;;; +2326;ERASE TO THE RIGHT;So;0;ON;;;;;N;DELETE TO THE RIGHT KEY;;;; +2327;X IN A RECTANGLE BOX;So;0;ON;;;;;N;CLEAR KEY;;;; +2328;KEYBOARD;So;0;ON;;;;;N;;;;; +2329;LEFT-POINTING ANGLE BRACKET;Ps;0;ON;3008;;;;Y;BRA;;;; +232A;RIGHT-POINTING ANGLE BRACKET;Pe;0;ON;3009;;;;Y;KET;;;; +232B;ERASE TO THE LEFT;So;0;ON;;;;;N;DELETE TO THE LEFT KEY;;;; +232C;BENZENE RING;So;0;ON;;;;;N;;;;; +232D;CYLINDRICITY;So;0;ON;;;;;N;;;;; +232E;ALL AROUND-PROFILE;So;0;ON;;;;;N;;;;; +232F;SYMMETRY;So;0;ON;;;;;N;;;;; +2330;TOTAL RUNOUT;So;0;ON;;;;;N;;;;; +2331;DIMENSION ORIGIN;So;0;ON;;;;;N;;;;; +2332;CONICAL TAPER;So;0;ON;;;;;N;;;;; +2333;SLOPE;So;0;ON;;;;;N;;;;; +2334;COUNTERBORE;So;0;ON;;;;;N;;;;; +2335;COUNTERSINK;So;0;ON;;;;;N;;;;; +2336;APL FUNCTIONAL SYMBOL I-BEAM;So;0;L;;;;;N;;;;; +2337;APL FUNCTIONAL SYMBOL SQUISH QUAD;So;0;L;;;;;N;;;;; +2338;APL FUNCTIONAL SYMBOL QUAD EQUAL;So;0;L;;;;;N;;;;; +2339;APL FUNCTIONAL SYMBOL QUAD DIVIDE;So;0;L;;;;;N;;;;; +233A;APL FUNCTIONAL SYMBOL QUAD DIAMOND;So;0;L;;;;;N;;;;; +233B;APL FUNCTIONAL SYMBOL QUAD JOT;So;0;L;;;;;N;;;;; +233C;APL FUNCTIONAL SYMBOL QUAD CIRCLE;So;0;L;;;;;N;;;;; +233D;APL FUNCTIONAL SYMBOL CIRCLE STILE;So;0;L;;;;;N;;;;; +233E;APL FUNCTIONAL SYMBOL CIRCLE JOT;So;0;L;;;;;N;;;;; +233F;APL FUNCTIONAL SYMBOL SLASH BAR;So;0;L;;;;;N;;;;; +2340;APL FUNCTIONAL SYMBOL BACKSLASH BAR;So;0;L;;;;;N;;;;; +2341;APL FUNCTIONAL SYMBOL QUAD SLASH;So;0;L;;;;;N;;;;; +2342;APL FUNCTIONAL SYMBOL QUAD BACKSLASH;So;0;L;;;;;N;;;;; +2343;APL FUNCTIONAL SYMBOL QUAD LESS-THAN;So;0;L;;;;;N;;;;; +2344;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN;So;0;L;;;;;N;;;;; +2345;APL FUNCTIONAL SYMBOL LEFTWARDS VANE;So;0;L;;;;;N;;;;; +2346;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE;So;0;L;;;;;N;;;;; +2347;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW;So;0;L;;;;;N;;;;; +2348;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW;So;0;L;;;;;N;;;;; +2349;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH;So;0;L;;;;;N;;;;; +234A;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR;So;0;L;;;;;N;;*;;; +234B;APL FUNCTIONAL SYMBOL DELTA STILE;So;0;L;;;;;N;;;;; +234C;APL FUNCTIONAL SYMBOL QUAD DOWN CARET;So;0;L;;;;;N;;;;; +234D;APL FUNCTIONAL SYMBOL QUAD DELTA;So;0;L;;;;;N;;;;; +234E;APL FUNCTIONAL SYMBOL DOWN TACK JOT;So;0;L;;;;;N;;*;;; +234F;APL FUNCTIONAL SYMBOL UPWARDS VANE;So;0;L;;;;;N;;;;; +2350;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW;So;0;L;;;;;N;;;;; +2351;APL FUNCTIONAL SYMBOL UP TACK OVERBAR;So;0;L;;;;;N;;*;;; +2352;APL FUNCTIONAL SYMBOL DEL STILE;So;0;L;;;;;N;;;;; +2353;APL FUNCTIONAL SYMBOL QUAD UP CARET;So;0;L;;;;;N;;;;; +2354;APL FUNCTIONAL SYMBOL QUAD DEL;So;0;L;;;;;N;;;;; +2355;APL FUNCTIONAL SYMBOL UP TACK JOT;So;0;L;;;;;N;;*;;; +2356;APL FUNCTIONAL SYMBOL DOWNWARDS VANE;So;0;L;;;;;N;;;;; +2357;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW;So;0;L;;;;;N;;;;; +2358;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR;So;0;L;;;;;N;;;;; +2359;APL FUNCTIONAL SYMBOL DELTA UNDERBAR;So;0;L;;;;;N;;;;; +235A;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR;So;0;L;;;;;N;;;;; +235B;APL FUNCTIONAL SYMBOL JOT UNDERBAR;So;0;L;;;;;N;;;;; +235C;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR;So;0;L;;;;;N;;;;; +235D;APL FUNCTIONAL SYMBOL UP SHOE JOT;So;0;L;;;;;N;;;;; +235E;APL FUNCTIONAL SYMBOL QUOTE QUAD;So;0;L;;;;;N;;;;; +235F;APL FUNCTIONAL SYMBOL CIRCLE STAR;So;0;L;;;;;N;;;;; +2360;APL FUNCTIONAL SYMBOL QUAD COLON;So;0;L;;;;;N;;;;; +2361;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS;So;0;L;;;;;N;;*;;; +2362;APL FUNCTIONAL SYMBOL DEL DIAERESIS;So;0;L;;;;;N;;;;; +2363;APL FUNCTIONAL SYMBOL STAR DIAERESIS;So;0;L;;;;;N;;;;; +2364;APL FUNCTIONAL SYMBOL JOT DIAERESIS;So;0;L;;;;;N;;;;; +2365;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS;So;0;L;;;;;N;;;;; +2366;APL FUNCTIONAL SYMBOL DOWN SHOE STILE;So;0;L;;;;;N;;;;; +2367;APL FUNCTIONAL SYMBOL LEFT SHOE STILE;So;0;L;;;;;N;;;;; +2368;APL FUNCTIONAL SYMBOL TILDE DIAERESIS;So;0;L;;;;;N;;;;; +2369;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS;So;0;L;;;;;N;;;;; +236A;APL FUNCTIONAL SYMBOL COMMA BAR;So;0;L;;;;;N;;;;; +236B;APL FUNCTIONAL SYMBOL DEL TILDE;So;0;L;;;;;N;;;;; +236C;APL FUNCTIONAL SYMBOL ZILDE;So;0;L;;;;;N;;;;; +236D;APL FUNCTIONAL SYMBOL STILE TILDE;So;0;L;;;;;N;;;;; +236E;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR;So;0;L;;;;;N;;;;; +236F;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL;So;0;L;;;;;N;;;;; +2370;APL FUNCTIONAL SYMBOL QUAD QUESTION;So;0;L;;;;;N;;;;; +2371;APL FUNCTIONAL SYMBOL DOWN CARET TILDE;So;0;L;;;;;N;;;;; +2372;APL FUNCTIONAL SYMBOL UP CARET TILDE;So;0;L;;;;;N;;;;; +2373;APL FUNCTIONAL SYMBOL IOTA;So;0;L;;;;;N;;;;; +2374;APL FUNCTIONAL SYMBOL RHO;So;0;L;;;;;N;;;;; +2375;APL FUNCTIONAL SYMBOL OMEGA;So;0;L;;;;;N;;;;; +2376;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR;So;0;L;;;;;N;;;;; +2377;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR;So;0;L;;;;;N;;;;; +2378;APL FUNCTIONAL SYMBOL IOTA UNDERBAR;So;0;L;;;;;N;;;;; +2379;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR;So;0;L;;;;;N;;;;; +237A;APL FUNCTIONAL SYMBOL ALPHA;So;0;L;;;;;N;;;;; +237B;NOT CHECK MARK;So;0;ON;;;;;N;;;;; +237C;RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW;Sm;0;ON;;;;;N;;;;; +237D;SHOULDERED OPEN BOX;So;0;ON;;;;;N;;;;; +237E;BELL SYMBOL;So;0;ON;;;;;N;;;;; +237F;VERTICAL LINE WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; +2380;INSERTION SYMBOL;So;0;ON;;;;;N;;;;; +2381;CONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; +2382;DISCONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; +2383;EMPHASIS SYMBOL;So;0;ON;;;;;N;;;;; +2384;COMPOSITION SYMBOL;So;0;ON;;;;;N;;;;; +2385;WHITE SQUARE WITH CENTRE VERTICAL LINE;So;0;ON;;;;;N;;;;; +2386;ENTER SYMBOL;So;0;ON;;;;;N;;;;; +2387;ALTERNATIVE KEY SYMBOL;So;0;ON;;;;;N;;;;; +2388;HELM SYMBOL;So;0;ON;;;;;N;;;;; +2389;CIRCLED HORIZONTAL BAR WITH NOTCH;So;0;ON;;;;;N;;pause;;; +238A;CIRCLED TRIANGLE DOWN;So;0;ON;;;;;N;;break;;; +238B;BROKEN CIRCLE WITH NORTHWEST ARROW;So;0;ON;;;;;N;;escape;;; +238C;UNDO SYMBOL;So;0;ON;;;;;N;;;;; +238D;MONOSTABLE SYMBOL;So;0;ON;;;;;N;;;;; +238E;HYSTERESIS SYMBOL;So;0;ON;;;;;N;;;;; +238F;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL;So;0;ON;;;;;N;;;;; +2390;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL;So;0;ON;;;;;N;;;;; +2391;PASSIVE-PULL-DOWN-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; +2392;PASSIVE-PULL-UP-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; +2393;DIRECT CURRENT SYMBOL FORM TWO;So;0;ON;;;;;N;;;;; +2394;SOFTWARE-FUNCTION SYMBOL;So;0;ON;;;;;N;;;;; +2395;APL FUNCTIONAL SYMBOL QUAD;So;0;L;;;;;N;;;;; +2396;DECIMAL SEPARATOR KEY SYMBOL;So;0;ON;;;;;N;;;;; +2397;PREVIOUS PAGE;So;0;ON;;;;;N;;;;; +2398;NEXT PAGE;So;0;ON;;;;;N;;;;; +2399;PRINT SCREEN SYMBOL;So;0;ON;;;;;N;;;;; +239A;CLEAR SCREEN SYMBOL;So;0;ON;;;;;N;;;;; +239B;LEFT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;; +239C;LEFT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;; +239D;LEFT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;; +239E;RIGHT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;; +239F;RIGHT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;; +23A0;RIGHT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23A1;LEFT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;; +23A2;LEFT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23A3;LEFT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;; +23A4;RIGHT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;; +23A5;RIGHT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23A6;RIGHT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;; +23A7;LEFT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;; +23A8;LEFT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;; +23A9;LEFT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23AA;CURLY BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23AB;RIGHT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;; +23AC;RIGHT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;; +23AD;RIGHT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23AE;INTEGRAL EXTENSION;Sm;0;ON;;;;;N;;;;; +23AF;HORIZONTAL LINE EXTENSION;Sm;0;ON;;;;;N;;;;; +23B0;UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; +23B1;UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; +23B2;SUMMATION TOP;Sm;0;ON;;;;;N;;;;; +23B3;SUMMATION BOTTOM;Sm;0;ON;;;;;N;;;;; +23B4;TOP SQUARE BRACKET;Ps;0;ON;;;;;N;;;;; +23B5;BOTTOM SQUARE BRACKET;Pe;0;ON;;;;;N;;;;; +23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;Po;0;ON;;;;;N;;;;; +23B7;RADICAL SYMBOL BOTTOM;So;0;ON;;;;;N;;;;; +23B8;LEFT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; +23B9;RIGHT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; +23BA;HORIZONTAL SCAN LINE-1;So;0;ON;;;;;N;;;;; +23BB;HORIZONTAL SCAN LINE-3;So;0;ON;;;;;N;;;;; +23BC;HORIZONTAL SCAN LINE-7;So;0;ON;;;;;N;;;;; +23BD;HORIZONTAL SCAN LINE-9;So;0;ON;;;;;N;;;;; +23BE;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT;So;0;ON;;;;;N;;;;; +23BF;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT;So;0;ON;;;;;N;;;;; +23C0;DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C1;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C2;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C3;DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C4;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C5;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C6;DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE;So;0;ON;;;;;N;;;;; +23C7;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;; +23C8;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;; +23C9;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;;;;; +23CA;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;;;;; +23CB;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT;So;0;ON;;;;;N;;;;; +23CC;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT;So;0;ON;;;;;N;;;;; +23CD;SQUARE FOOT;So;0;ON;;;;;N;;;;; +23CE;RETURN SYMBOL;So;0;ON;;;;;N;;;;; +2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;; +2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;; +2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;; +2403;SYMBOL FOR END OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR END OF TEXT;;;; +2404;SYMBOL FOR END OF TRANSMISSION;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION;;;; +2405;SYMBOL FOR ENQUIRY;So;0;ON;;;;;N;GRAPHIC FOR ENQUIRY;;;; +2406;SYMBOL FOR ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR ACKNOWLEDGE;;;; +2407;SYMBOL FOR BELL;So;0;ON;;;;;N;GRAPHIC FOR BELL;;;; +2408;SYMBOL FOR BACKSPACE;So;0;ON;;;;;N;GRAPHIC FOR BACKSPACE;;;; +2409;SYMBOL FOR HORIZONTAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR HORIZONTAL TABULATION;;;; +240A;SYMBOL FOR LINE FEED;So;0;ON;;;;;N;GRAPHIC FOR LINE FEED;;;; +240B;SYMBOL FOR VERTICAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR VERTICAL TABULATION;;;; +240C;SYMBOL FOR FORM FEED;So;0;ON;;;;;N;GRAPHIC FOR FORM FEED;;;; +240D;SYMBOL FOR CARRIAGE RETURN;So;0;ON;;;;;N;GRAPHIC FOR CARRIAGE RETURN;;;; +240E;SYMBOL FOR SHIFT OUT;So;0;ON;;;;;N;GRAPHIC FOR SHIFT OUT;;;; +240F;SYMBOL FOR SHIFT IN;So;0;ON;;;;;N;GRAPHIC FOR SHIFT IN;;;; +2410;SYMBOL FOR DATA LINK ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR DATA LINK ESCAPE;;;; +2411;SYMBOL FOR DEVICE CONTROL ONE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL ONE;;;; +2412;SYMBOL FOR DEVICE CONTROL TWO;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL TWO;;;; +2413;SYMBOL FOR DEVICE CONTROL THREE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL THREE;;;; +2414;SYMBOL FOR DEVICE CONTROL FOUR;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL FOUR;;;; +2415;SYMBOL FOR NEGATIVE ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR NEGATIVE ACKNOWLEDGE;;;; +2416;SYMBOL FOR SYNCHRONOUS IDLE;So;0;ON;;;;;N;GRAPHIC FOR SYNCHRONOUS IDLE;;;; +2417;SYMBOL FOR END OF TRANSMISSION BLOCK;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION BLOCK;;;; +2418;SYMBOL FOR CANCEL;So;0;ON;;;;;N;GRAPHIC FOR CANCEL;;;; +2419;SYMBOL FOR END OF MEDIUM;So;0;ON;;;;;N;GRAPHIC FOR END OF MEDIUM;;;; +241A;SYMBOL FOR SUBSTITUTE;So;0;ON;;;;;N;GRAPHIC FOR SUBSTITUTE;;;; +241B;SYMBOL FOR ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR ESCAPE;;;; +241C;SYMBOL FOR FILE SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR FILE SEPARATOR;;;; +241D;SYMBOL FOR GROUP SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR GROUP SEPARATOR;;;; +241E;SYMBOL FOR RECORD SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR RECORD SEPARATOR;;;; +241F;SYMBOL FOR UNIT SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR UNIT SEPARATOR;;;; +2420;SYMBOL FOR SPACE;So;0;ON;;;;;N;GRAPHIC FOR SPACE;;;; +2421;SYMBOL FOR DELETE;So;0;ON;;;;;N;GRAPHIC FOR DELETE;;;; +2422;BLANK SYMBOL;So;0;ON;;;;;N;BLANK;;;; +2423;OPEN BOX;So;0;ON;;;;;N;;;;; +2424;SYMBOL FOR NEWLINE;So;0;ON;;;;;N;GRAPHIC FOR NEWLINE;;;; +2425;SYMBOL FOR DELETE FORM TWO;So;0;ON;;;;;N;;;;; +2426;SYMBOL FOR SUBSTITUTE FORM TWO;So;0;ON;;;;;N;;;;; +2440;OCR HOOK;So;0;ON;;;;;N;;;;; +2441;OCR CHAIR;So;0;ON;;;;;N;;;;; +2442;OCR FORK;So;0;ON;;;;;N;;;;; +2443;OCR INVERTED FORK;So;0;ON;;;;;N;;;;; +2444;OCR BELT BUCKLE;So;0;ON;;;;;N;;;;; +2445;OCR BOW TIE;So;0;ON;;;;;N;;;;; +2446;OCR BRANCH BANK IDENTIFICATION;So;0;ON;;;;;N;;;;; +2447;OCR AMOUNT OF CHECK;So;0;ON;;;;;N;;;;; +2448;OCR DASH;So;0;ON;;;;;N;;;;; +2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;; +244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;; +2460;CIRCLED DIGIT ONE;No;0;EN;<circle> 0031;;1;1;N;;;;; +2461;CIRCLED DIGIT TWO;No;0;EN;<circle> 0032;;2;2;N;;;;; +2462;CIRCLED DIGIT THREE;No;0;EN;<circle> 0033;;3;3;N;;;;; +2463;CIRCLED DIGIT FOUR;No;0;EN;<circle> 0034;;4;4;N;;;;; +2464;CIRCLED DIGIT FIVE;No;0;EN;<circle> 0035;;5;5;N;;;;; +2465;CIRCLED DIGIT SIX;No;0;EN;<circle> 0036;;6;6;N;;;;; +2466;CIRCLED DIGIT SEVEN;No;0;EN;<circle> 0037;;7;7;N;;;;; +2467;CIRCLED DIGIT EIGHT;No;0;EN;<circle> 0038;;8;8;N;;;;; +2468;CIRCLED DIGIT NINE;No;0;EN;<circle> 0039;;9;9;N;;;;; +2469;CIRCLED NUMBER TEN;No;0;EN;<circle> 0031 0030;;;10;N;;;;; +246A;CIRCLED NUMBER ELEVEN;No;0;EN;<circle> 0031 0031;;;11;N;;;;; +246B;CIRCLED NUMBER TWELVE;No;0;EN;<circle> 0031 0032;;;12;N;;;;; +246C;CIRCLED NUMBER THIRTEEN;No;0;EN;<circle> 0031 0033;;;13;N;;;;; +246D;CIRCLED NUMBER FOURTEEN;No;0;EN;<circle> 0031 0034;;;14;N;;;;; +246E;CIRCLED NUMBER FIFTEEN;No;0;EN;<circle> 0031 0035;;;15;N;;;;; +246F;CIRCLED NUMBER SIXTEEN;No;0;EN;<circle> 0031 0036;;;16;N;;;;; +2470;CIRCLED NUMBER SEVENTEEN;No;0;EN;<circle> 0031 0037;;;17;N;;;;; +2471;CIRCLED NUMBER EIGHTEEN;No;0;EN;<circle> 0031 0038;;;18;N;;;;; +2472;CIRCLED NUMBER NINETEEN;No;0;EN;<circle> 0031 0039;;;19;N;;;;; +2473;CIRCLED NUMBER TWENTY;No;0;EN;<circle> 0032 0030;;;20;N;;;;; +2474;PARENTHESIZED DIGIT ONE;No;0;EN;<compat> 0028 0031 0029;;1;1;N;;;;; +2475;PARENTHESIZED DIGIT TWO;No;0;EN;<compat> 0028 0032 0029;;2;2;N;;;;; +2476;PARENTHESIZED DIGIT THREE;No;0;EN;<compat> 0028 0033 0029;;3;3;N;;;;; +2477;PARENTHESIZED DIGIT FOUR;No;0;EN;<compat> 0028 0034 0029;;4;4;N;;;;; +2478;PARENTHESIZED DIGIT FIVE;No;0;EN;<compat> 0028 0035 0029;;5;5;N;;;;; +2479;PARENTHESIZED DIGIT SIX;No;0;EN;<compat> 0028 0036 0029;;6;6;N;;;;; +247A;PARENTHESIZED DIGIT SEVEN;No;0;EN;<compat> 0028 0037 0029;;7;7;N;;;;; +247B;PARENTHESIZED DIGIT EIGHT;No;0;EN;<compat> 0028 0038 0029;;8;8;N;;;;; +247C;PARENTHESIZED DIGIT NINE;No;0;EN;<compat> 0028 0039 0029;;9;9;N;;;;; +247D;PARENTHESIZED NUMBER TEN;No;0;EN;<compat> 0028 0031 0030 0029;;;10;N;;;;; +247E;PARENTHESIZED NUMBER ELEVEN;No;0;EN;<compat> 0028 0031 0031 0029;;;11;N;;;;; +247F;PARENTHESIZED NUMBER TWELVE;No;0;EN;<compat> 0028 0031 0032 0029;;;12;N;;;;; +2480;PARENTHESIZED NUMBER THIRTEEN;No;0;EN;<compat> 0028 0031 0033 0029;;;13;N;;;;; +2481;PARENTHESIZED NUMBER FOURTEEN;No;0;EN;<compat> 0028 0031 0034 0029;;;14;N;;;;; +2482;PARENTHESIZED NUMBER FIFTEEN;No;0;EN;<compat> 0028 0031 0035 0029;;;15;N;;;;; +2483;PARENTHESIZED NUMBER SIXTEEN;No;0;EN;<compat> 0028 0031 0036 0029;;;16;N;;;;; +2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;EN;<compat> 0028 0031 0037 0029;;;17;N;;;;; +2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;EN;<compat> 0028 0031 0038 0029;;;18;N;;;;; +2486;PARENTHESIZED NUMBER NINETEEN;No;0;EN;<compat> 0028 0031 0039 0029;;;19;N;;;;; +2487;PARENTHESIZED NUMBER TWENTY;No;0;EN;<compat> 0028 0032 0030 0029;;;20;N;;;;; +2488;DIGIT ONE FULL STOP;No;0;EN;<compat> 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;; +2489;DIGIT TWO FULL STOP;No;0;EN;<compat> 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;; +248A;DIGIT THREE FULL STOP;No;0;EN;<compat> 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;; +248B;DIGIT FOUR FULL STOP;No;0;EN;<compat> 0034 002E;;4;4;N;DIGIT FOUR PERIOD;;;; +248C;DIGIT FIVE FULL STOP;No;0;EN;<compat> 0035 002E;;5;5;N;DIGIT FIVE PERIOD;;;; +248D;DIGIT SIX FULL STOP;No;0;EN;<compat> 0036 002E;;6;6;N;DIGIT SIX PERIOD;;;; +248E;DIGIT SEVEN FULL STOP;No;0;EN;<compat> 0037 002E;;7;7;N;DIGIT SEVEN PERIOD;;;; +248F;DIGIT EIGHT FULL STOP;No;0;EN;<compat> 0038 002E;;8;8;N;DIGIT EIGHT PERIOD;;;; +2490;DIGIT NINE FULL STOP;No;0;EN;<compat> 0039 002E;;9;9;N;DIGIT NINE PERIOD;;;; +2491;NUMBER TEN FULL STOP;No;0;EN;<compat> 0031 0030 002E;;;10;N;NUMBER TEN PERIOD;;;; +2492;NUMBER ELEVEN FULL STOP;No;0;EN;<compat> 0031 0031 002E;;;11;N;NUMBER ELEVEN PERIOD;;;; +2493;NUMBER TWELVE FULL STOP;No;0;EN;<compat> 0031 0032 002E;;;12;N;NUMBER TWELVE PERIOD;;;; +2494;NUMBER THIRTEEN FULL STOP;No;0;EN;<compat> 0031 0033 002E;;;13;N;NUMBER THIRTEEN PERIOD;;;; +2495;NUMBER FOURTEEN FULL STOP;No;0;EN;<compat> 0031 0034 002E;;;14;N;NUMBER FOURTEEN PERIOD;;;; +2496;NUMBER FIFTEEN FULL STOP;No;0;EN;<compat> 0031 0035 002E;;;15;N;NUMBER FIFTEEN PERIOD;;;; +2497;NUMBER SIXTEEN FULL STOP;No;0;EN;<compat> 0031 0036 002E;;;16;N;NUMBER SIXTEEN PERIOD;;;; +2498;NUMBER SEVENTEEN FULL STOP;No;0;EN;<compat> 0031 0037 002E;;;17;N;NUMBER SEVENTEEN PERIOD;;;; +2499;NUMBER EIGHTEEN FULL STOP;No;0;EN;<compat> 0031 0038 002E;;;18;N;NUMBER EIGHTEEN PERIOD;;;; +249A;NUMBER NINETEEN FULL STOP;No;0;EN;<compat> 0031 0039 002E;;;19;N;NUMBER NINETEEN PERIOD;;;; +249B;NUMBER TWENTY FULL STOP;No;0;EN;<compat> 0032 0030 002E;;;20;N;NUMBER TWENTY PERIOD;;;; +249C;PARENTHESIZED LATIN SMALL LETTER A;So;0;L;<compat> 0028 0061 0029;;;;N;;;;; +249D;PARENTHESIZED LATIN SMALL LETTER B;So;0;L;<compat> 0028 0062 0029;;;;N;;;;; +249E;PARENTHESIZED LATIN SMALL LETTER C;So;0;L;<compat> 0028 0063 0029;;;;N;;;;; +249F;PARENTHESIZED LATIN SMALL LETTER D;So;0;L;<compat> 0028 0064 0029;;;;N;;;;; +24A0;PARENTHESIZED LATIN SMALL LETTER E;So;0;L;<compat> 0028 0065 0029;;;;N;;;;; +24A1;PARENTHESIZED LATIN SMALL LETTER F;So;0;L;<compat> 0028 0066 0029;;;;N;;;;; +24A2;PARENTHESIZED LATIN SMALL LETTER G;So;0;L;<compat> 0028 0067 0029;;;;N;;;;; +24A3;PARENTHESIZED LATIN SMALL LETTER H;So;0;L;<compat> 0028 0068 0029;;;;N;;;;; +24A4;PARENTHESIZED LATIN SMALL LETTER I;So;0;L;<compat> 0028 0069 0029;;;;N;;;;; +24A5;PARENTHESIZED LATIN SMALL LETTER J;So;0;L;<compat> 0028 006A 0029;;;;N;;;;; +24A6;PARENTHESIZED LATIN SMALL LETTER K;So;0;L;<compat> 0028 006B 0029;;;;N;;;;; +24A7;PARENTHESIZED LATIN SMALL LETTER L;So;0;L;<compat> 0028 006C 0029;;;;N;;;;; +24A8;PARENTHESIZED LATIN SMALL LETTER M;So;0;L;<compat> 0028 006D 0029;;;;N;;;;; +24A9;PARENTHESIZED LATIN SMALL LETTER N;So;0;L;<compat> 0028 006E 0029;;;;N;;;;; +24AA;PARENTHESIZED LATIN SMALL LETTER O;So;0;L;<compat> 0028 006F 0029;;;;N;;;;; +24AB;PARENTHESIZED LATIN SMALL LETTER P;So;0;L;<compat> 0028 0070 0029;;;;N;;;;; +24AC;PARENTHESIZED LATIN SMALL LETTER Q;So;0;L;<compat> 0028 0071 0029;;;;N;;;;; +24AD;PARENTHESIZED LATIN SMALL LETTER R;So;0;L;<compat> 0028 0072 0029;;;;N;;;;; +24AE;PARENTHESIZED LATIN SMALL LETTER S;So;0;L;<compat> 0028 0073 0029;;;;N;;;;; +24AF;PARENTHESIZED LATIN SMALL LETTER T;So;0;L;<compat> 0028 0074 0029;;;;N;;;;; +24B0;PARENTHESIZED LATIN SMALL LETTER U;So;0;L;<compat> 0028 0075 0029;;;;N;;;;; +24B1;PARENTHESIZED LATIN SMALL LETTER V;So;0;L;<compat> 0028 0076 0029;;;;N;;;;; +24B2;PARENTHESIZED LATIN SMALL LETTER W;So;0;L;<compat> 0028 0077 0029;;;;N;;;;; +24B3;PARENTHESIZED LATIN SMALL LETTER X;So;0;L;<compat> 0028 0078 0029;;;;N;;;;; +24B4;PARENTHESIZED LATIN SMALL LETTER Y;So;0;L;<compat> 0028 0079 0029;;;;N;;;;; +24B5;PARENTHESIZED LATIN SMALL LETTER Z;So;0;L;<compat> 0028 007A 0029;;;;N;;;;; +24B6;CIRCLED LATIN CAPITAL LETTER A;So;0;L;<circle> 0041;;;;N;;;;24D0; +24B7;CIRCLED LATIN CAPITAL LETTER B;So;0;L;<circle> 0042;;;;N;;;;24D1; +24B8;CIRCLED LATIN CAPITAL LETTER C;So;0;L;<circle> 0043;;;;N;;;;24D2; +24B9;CIRCLED LATIN CAPITAL LETTER D;So;0;L;<circle> 0044;;;;N;;;;24D3; +24BA;CIRCLED LATIN CAPITAL LETTER E;So;0;L;<circle> 0045;;;;N;;;;24D4; +24BB;CIRCLED LATIN CAPITAL LETTER F;So;0;L;<circle> 0046;;;;N;;;;24D5; +24BC;CIRCLED LATIN CAPITAL LETTER G;So;0;L;<circle> 0047;;;;N;;;;24D6; +24BD;CIRCLED LATIN CAPITAL LETTER H;So;0;L;<circle> 0048;;;;N;;;;24D7; +24BE;CIRCLED LATIN CAPITAL LETTER I;So;0;L;<circle> 0049;;;;N;;;;24D8; +24BF;CIRCLED LATIN CAPITAL LETTER J;So;0;L;<circle> 004A;;;;N;;;;24D9; +24C0;CIRCLED LATIN CAPITAL LETTER K;So;0;L;<circle> 004B;;;;N;;;;24DA; +24C1;CIRCLED LATIN CAPITAL LETTER L;So;0;L;<circle> 004C;;;;N;;;;24DB; +24C2;CIRCLED LATIN CAPITAL LETTER M;So;0;L;<circle> 004D;;;;N;;;;24DC; +24C3;CIRCLED LATIN CAPITAL LETTER N;So;0;L;<circle> 004E;;;;N;;;;24DD; +24C4;CIRCLED LATIN CAPITAL LETTER O;So;0;L;<circle> 004F;;;;N;;;;24DE; +24C5;CIRCLED LATIN CAPITAL LETTER P;So;0;L;<circle> 0050;;;;N;;;;24DF; +24C6;CIRCLED LATIN CAPITAL LETTER Q;So;0;L;<circle> 0051;;;;N;;;;24E0; +24C7;CIRCLED LATIN CAPITAL LETTER R;So;0;L;<circle> 0052;;;;N;;;;24E1; +24C8;CIRCLED LATIN CAPITAL LETTER S;So;0;L;<circle> 0053;;;;N;;;;24E2; +24C9;CIRCLED LATIN CAPITAL LETTER T;So;0;L;<circle> 0054;;;;N;;;;24E3; +24CA;CIRCLED LATIN CAPITAL LETTER U;So;0;L;<circle> 0055;;;;N;;;;24E4; +24CB;CIRCLED LATIN CAPITAL LETTER V;So;0;L;<circle> 0056;;;;N;;;;24E5; +24CC;CIRCLED LATIN CAPITAL LETTER W;So;0;L;<circle> 0057;;;;N;;;;24E6; +24CD;CIRCLED LATIN CAPITAL LETTER X;So;0;L;<circle> 0058;;;;N;;;;24E7; +24CE;CIRCLED LATIN CAPITAL LETTER Y;So;0;L;<circle> 0059;;;;N;;;;24E8; +24CF;CIRCLED LATIN CAPITAL LETTER Z;So;0;L;<circle> 005A;;;;N;;;;24E9; +24D0;CIRCLED LATIN SMALL LETTER A;So;0;L;<circle> 0061;;;;N;;;24B6;;24B6 +24D1;CIRCLED LATIN SMALL LETTER B;So;0;L;<circle> 0062;;;;N;;;24B7;;24B7 +24D2;CIRCLED LATIN SMALL LETTER C;So;0;L;<circle> 0063;;;;N;;;24B8;;24B8 +24D3;CIRCLED LATIN SMALL LETTER D;So;0;L;<circle> 0064;;;;N;;;24B9;;24B9 +24D4;CIRCLED LATIN SMALL LETTER E;So;0;L;<circle> 0065;;;;N;;;24BA;;24BA +24D5;CIRCLED LATIN SMALL LETTER F;So;0;L;<circle> 0066;;;;N;;;24BB;;24BB +24D6;CIRCLED LATIN SMALL LETTER G;So;0;L;<circle> 0067;;;;N;;;24BC;;24BC +24D7;CIRCLED LATIN SMALL LETTER H;So;0;L;<circle> 0068;;;;N;;;24BD;;24BD +24D8;CIRCLED LATIN SMALL LETTER I;So;0;L;<circle> 0069;;;;N;;;24BE;;24BE +24D9;CIRCLED LATIN SMALL LETTER J;So;0;L;<circle> 006A;;;;N;;;24BF;;24BF +24DA;CIRCLED LATIN SMALL LETTER K;So;0;L;<circle> 006B;;;;N;;;24C0;;24C0 +24DB;CIRCLED LATIN SMALL LETTER L;So;0;L;<circle> 006C;;;;N;;;24C1;;24C1 +24DC;CIRCLED LATIN SMALL LETTER M;So;0;L;<circle> 006D;;;;N;;;24C2;;24C2 +24DD;CIRCLED LATIN SMALL LETTER N;So;0;L;<circle> 006E;;;;N;;;24C3;;24C3 +24DE;CIRCLED LATIN SMALL LETTER O;So;0;L;<circle> 006F;;;;N;;;24C4;;24C4 +24DF;CIRCLED LATIN SMALL LETTER P;So;0;L;<circle> 0070;;;;N;;;24C5;;24C5 +24E0;CIRCLED LATIN SMALL LETTER Q;So;0;L;<circle> 0071;;;;N;;;24C6;;24C6 +24E1;CIRCLED LATIN SMALL LETTER R;So;0;L;<circle> 0072;;;;N;;;24C7;;24C7 +24E2;CIRCLED LATIN SMALL LETTER S;So;0;L;<circle> 0073;;;;N;;;24C8;;24C8 +24E3;CIRCLED LATIN SMALL LETTER T;So;0;L;<circle> 0074;;;;N;;;24C9;;24C9 +24E4;CIRCLED LATIN SMALL LETTER U;So;0;L;<circle> 0075;;;;N;;;24CA;;24CA +24E5;CIRCLED LATIN SMALL LETTER V;So;0;L;<circle> 0076;;;;N;;;24CB;;24CB +24E6;CIRCLED LATIN SMALL LETTER W;So;0;L;<circle> 0077;;;;N;;;24CC;;24CC +24E7;CIRCLED LATIN SMALL LETTER X;So;0;L;<circle> 0078;;;;N;;;24CD;;24CD +24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L;<circle> 0079;;;;N;;;24CE;;24CE +24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L;<circle> 007A;;;;N;;;24CF;;24CF +24EA;CIRCLED DIGIT ZERO;No;0;EN;<circle> 0030;;0;0;N;;;;; +24EB;NEGATIVE CIRCLED NUMBER ELEVEN;No;0;ON;;;;11;N;;;;; +24EC;NEGATIVE CIRCLED NUMBER TWELVE;No;0;ON;;;;12;N;;;;; +24ED;NEGATIVE CIRCLED NUMBER THIRTEEN;No;0;ON;;;;13;N;;;;; +24EE;NEGATIVE CIRCLED NUMBER FOURTEEN;No;0;ON;;;;14;N;;;;; +24EF;NEGATIVE CIRCLED NUMBER FIFTEEN;No;0;ON;;;;15;N;;;;; +24F0;NEGATIVE CIRCLED NUMBER SIXTEEN;No;0;ON;;;;16;N;;;;; +24F1;NEGATIVE CIRCLED NUMBER SEVENTEEN;No;0;ON;;;;17;N;;;;; +24F2;NEGATIVE CIRCLED NUMBER EIGHTEEN;No;0;ON;;;;18;N;;;;; +24F3;NEGATIVE CIRCLED NUMBER NINETEEN;No;0;ON;;;;19;N;;;;; +24F4;NEGATIVE CIRCLED NUMBER TWENTY;No;0;ON;;;;20;N;;;;; +24F5;DOUBLE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;;;;; +24F6;DOUBLE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;;;;; +24F7;DOUBLE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;;;;; +24F8;DOUBLE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;;;;; +24F9;DOUBLE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;;;;; +24FA;DOUBLE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;;;;; +24FB;DOUBLE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;;;;; +24FC;DOUBLE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;;;;; +24FD;DOUBLE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;;;;; +24FE;DOUBLE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;;;;; +2500;BOX DRAWINGS LIGHT HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT HORIZONTAL;;;; +2501;BOX DRAWINGS HEAVY HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY HORIZONTAL;;;; +2502;BOX DRAWINGS LIGHT VERTICAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL;;;; +2503;BOX DRAWINGS HEAVY VERTICAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL;;;; +2504;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH HORIZONTAL;;;; +2505;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH HORIZONTAL;;;; +2506;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH VERTICAL;;;; +2507;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH VERTICAL;;;; +2508;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH HORIZONTAL;;;; +2509;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH HORIZONTAL;;;; +250A;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH VERTICAL;;;; +250B;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH VERTICAL;;;; +250C;BOX DRAWINGS LIGHT DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND RIGHT;;;; +250D;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT HEAVY;;;; +250E;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT LIGHT;;;; +250F;BOX DRAWINGS HEAVY DOWN AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND RIGHT;;;; +2510;BOX DRAWINGS LIGHT DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND LEFT;;;; +2511;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT HEAVY;;;; +2512;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT LIGHT;;;; +2513;BOX DRAWINGS HEAVY DOWN AND LEFT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND LEFT;;;; +2514;BOX DRAWINGS LIGHT UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT UP AND RIGHT;;;; +2515;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT HEAVY;;;; +2516;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT LIGHT;;;; +2517;BOX DRAWINGS HEAVY UP AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY UP AND RIGHT;;;; +2518;BOX DRAWINGS LIGHT UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT UP AND LEFT;;;; +2519;BOX DRAWINGS UP LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT HEAVY;;;; +251A;BOX DRAWINGS UP HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT LIGHT;;;; +251B;BOX DRAWINGS HEAVY UP AND LEFT;So;0;ON;;;;;N;FORMS HEAVY UP AND LEFT;;;; +251C;BOX DRAWINGS LIGHT VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND RIGHT;;;; +251D;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND RIGHT HEAVY;;;; +251E;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT DOWN LIGHT;;;; +251F;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT UP LIGHT;;;; +2520;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND RIGHT LIGHT;;;; +2521;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT UP HEAVY;;;; +2522;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT DOWN HEAVY;;;; +2523;BOX DRAWINGS HEAVY VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND RIGHT;;;; +2524;BOX DRAWINGS LIGHT VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND LEFT;;;; +2525;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND LEFT HEAVY;;;; +2526;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT DOWN LIGHT;;;; +2527;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT UP LIGHT;;;; +2528;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND LEFT LIGHT;;;; +2529;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT UP HEAVY;;;; +252A;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT DOWN HEAVY;;;; +252B;BOX DRAWINGS HEAVY VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND LEFT;;;; +252C;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOWN AND HORIZONTAL;;;; +252D;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT DOWN LIGHT;;;; +252E;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT DOWN LIGHT;;;; +252F;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND HORIZONTAL HEAVY;;;; +2530;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND HORIZONTAL LIGHT;;;; +2531;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT DOWN HEAVY;;;; +2532;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT DOWN HEAVY;;;; +2533;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOWN AND HORIZONTAL;;;; +2534;BOX DRAWINGS LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT UP AND HORIZONTAL;;;; +2535;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT UP LIGHT;;;; +2536;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT UP LIGHT;;;; +2537;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND HORIZONTAL HEAVY;;;; +2538;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND HORIZONTAL LIGHT;;;; +2539;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT UP HEAVY;;;; +253A;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT UP HEAVY;;;; +253B;BOX DRAWINGS HEAVY UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY UP AND HORIZONTAL;;;; +253C;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND HORIZONTAL;;;; +253D;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT;;;; +253E;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT;;;; +253F;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY;;;; +2540;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT;;;; +2541;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT;;;; +2542;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT;;;; +2543;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT;;;; +2544;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT;;;; +2545;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT;;;; +2546;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT;;;; +2547;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY;;;; +2548;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY;;;; +2549;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY;;;; +254A;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY;;;; +254B;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND HORIZONTAL;;;; +254C;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH HORIZONTAL;;;; +254D;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH HORIZONTAL;;;; +254E;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH VERTICAL;;;; +254F;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH VERTICAL;;;; +2550;BOX DRAWINGS DOUBLE HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE HORIZONTAL;;;; +2551;BOX DRAWINGS DOUBLE VERTICAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL;;;; +2552;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND RIGHT DOUBLE;;;; +2553;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND RIGHT SINGLE;;;; +2554;BOX DRAWINGS DOUBLE DOWN AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND RIGHT;;;; +2555;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND LEFT DOUBLE;;;; +2556;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND LEFT SINGLE;;;; +2557;BOX DRAWINGS DOUBLE DOWN AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND LEFT;;;; +2558;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND RIGHT DOUBLE;;;; +2559;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND RIGHT SINGLE;;;; +255A;BOX DRAWINGS DOUBLE UP AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE UP AND RIGHT;;;; +255B;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND LEFT DOUBLE;;;; +255C;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND LEFT SINGLE;;;; +255D;BOX DRAWINGS DOUBLE UP AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE UP AND LEFT;;;; +255E;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND RIGHT DOUBLE;;;; +255F;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND RIGHT SINGLE;;;; +2560;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND RIGHT;;;; +2561;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND LEFT DOUBLE;;;; +2562;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND LEFT SINGLE;;;; +2563;BOX DRAWINGS DOUBLE VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND LEFT;;;; +2564;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND HORIZONTAL DOUBLE;;;; +2565;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND HORIZONTAL SINGLE;;;; +2566;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND HORIZONTAL;;;; +2567;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND HORIZONTAL DOUBLE;;;; +2568;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND HORIZONTAL SINGLE;;;; +2569;BOX DRAWINGS DOUBLE UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE UP AND HORIZONTAL;;;; +256A;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE;;;; +256B;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE;;;; +256C;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND HORIZONTAL;;;; +256D;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND RIGHT;;;; +256E;BOX DRAWINGS LIGHT ARC DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND LEFT;;;; +256F;BOX DRAWINGS LIGHT ARC UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND LEFT;;;; +2570;BOX DRAWINGS LIGHT ARC UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND RIGHT;;;; +2571;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;;;; +2572;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;;;; +2573;BOX DRAWINGS LIGHT DIAGONAL CROSS;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL CROSS;;;; +2574;BOX DRAWINGS LIGHT LEFT;So;0;ON;;;;;N;FORMS LIGHT LEFT;;;; +2575;BOX DRAWINGS LIGHT UP;So;0;ON;;;;;N;FORMS LIGHT UP;;;; +2576;BOX DRAWINGS LIGHT RIGHT;So;0;ON;;;;;N;FORMS LIGHT RIGHT;;;; +2577;BOX DRAWINGS LIGHT DOWN;So;0;ON;;;;;N;FORMS LIGHT DOWN;;;; +2578;BOX DRAWINGS HEAVY LEFT;So;0;ON;;;;;N;FORMS HEAVY LEFT;;;; +2579;BOX DRAWINGS HEAVY UP;So;0;ON;;;;;N;FORMS HEAVY UP;;;; +257A;BOX DRAWINGS HEAVY RIGHT;So;0;ON;;;;;N;FORMS HEAVY RIGHT;;;; +257B;BOX DRAWINGS HEAVY DOWN;So;0;ON;;;;;N;FORMS HEAVY DOWN;;;; +257C;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT;So;0;ON;;;;;N;FORMS LIGHT LEFT AND HEAVY RIGHT;;;; +257D;BOX DRAWINGS LIGHT UP AND HEAVY DOWN;So;0;ON;;;;;N;FORMS LIGHT UP AND HEAVY DOWN;;;; +257E;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT;So;0;ON;;;;;N;FORMS HEAVY LEFT AND LIGHT RIGHT;;;; +257F;BOX DRAWINGS HEAVY UP AND LIGHT DOWN;So;0;ON;;;;;N;FORMS HEAVY UP AND LIGHT DOWN;;;; +2580;UPPER HALF BLOCK;So;0;ON;;;;;N;;;;; +2581;LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2582;LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +2583;LOWER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2584;LOWER HALF BLOCK;So;0;ON;;;;;N;;;;; +2585;LOWER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2586;LOWER THREE QUARTERS BLOCK;So;0;ON;;;;;N;LOWER THREE QUARTER BLOCK;;;; +2587;LOWER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2588;FULL BLOCK;So;0;ON;;;;;N;;;;; +2589;LEFT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258A;LEFT THREE QUARTERS BLOCK;So;0;ON;;;;;N;LEFT THREE QUARTER BLOCK;;;; +258B;LEFT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258C;LEFT HALF BLOCK;So;0;ON;;;;;N;;;;; +258D;LEFT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258E;LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +258F;LEFT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2590;RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;; +2591;LIGHT SHADE;So;0;ON;;;;;N;;;;; +2592;MEDIUM SHADE;So;0;ON;;;;;N;;;;; +2593;DARK SHADE;So;0;ON;;;;;N;;;;; +2594;UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2595;RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2596;QUADRANT LOWER LEFT;So;0;ON;;;;;N;;;;; +2597;QUADRANT LOWER RIGHT;So;0;ON;;;;;N;;;;; +2598;QUADRANT UPPER LEFT;So;0;ON;;;;;N;;;;; +2599;QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259A;QUADRANT UPPER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259B;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;; +259C;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259D;QUADRANT UPPER RIGHT;So;0;ON;;;;;N;;;;; +259E;QUADRANT UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;; +259F;QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +25A0;BLACK SQUARE;So;0;ON;;;;;N;;;;; +25A1;WHITE SQUARE;So;0;ON;;;;;N;;;;; +25A2;WHITE SQUARE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; +25A3;WHITE SQUARE CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; +25A4;SQUARE WITH HORIZONTAL FILL;So;0;ON;;;;;N;;;;; +25A5;SQUARE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; +25A6;SQUARE WITH ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; +25A7;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;; +25A8;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;; +25A9;SQUARE WITH DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; +25AA;BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; +25AB;WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;; +25AC;BLACK RECTANGLE;So;0;ON;;;;;N;;;;; +25AD;WHITE RECTANGLE;So;0;ON;;;;;N;;;;; +25AE;BLACK VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; +25AF;WHITE VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; +25B0;BLACK PARALLELOGRAM;So;0;ON;;;;;N;;;;; +25B1;WHITE PARALLELOGRAM;So;0;ON;;;;;N;;;;; +25B2;BLACK UP-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING TRIANGLE;;;; +25B3;WHITE UP-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE;;;; +25B4;BLACK UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING SMALL TRIANGLE;;;; +25B5;WHITE UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING SMALL TRIANGLE;;;; +25B6;BLACK RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING TRIANGLE;;;; +25B7;WHITE RIGHT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE RIGHT POINTING TRIANGLE;;;; +25B8;BLACK RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING SMALL TRIANGLE;;;; +25B9;WHITE RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE RIGHT POINTING SMALL TRIANGLE;;;; +25BA;BLACK RIGHT-POINTING POINTER;So;0;ON;;;;;N;BLACK RIGHT POINTING POINTER;;;; +25BB;WHITE RIGHT-POINTING POINTER;So;0;ON;;;;;N;WHITE RIGHT POINTING POINTER;;;; +25BC;BLACK DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING TRIANGLE;;;; +25BD;WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING TRIANGLE;;;; +25BE;BLACK DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING SMALL TRIANGLE;;;; +25BF;WHITE DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING SMALL TRIANGLE;;;; +25C0;BLACK LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING TRIANGLE;;;; +25C1;WHITE LEFT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE LEFT POINTING TRIANGLE;;;; +25C2;BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING SMALL TRIANGLE;;;; +25C3;WHITE LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE LEFT POINTING SMALL TRIANGLE;;;; +25C4;BLACK LEFT-POINTING POINTER;So;0;ON;;;;;N;BLACK LEFT POINTING POINTER;;;; +25C5;WHITE LEFT-POINTING POINTER;So;0;ON;;;;;N;WHITE LEFT POINTING POINTER;;;; +25C6;BLACK DIAMOND;So;0;ON;;;;;N;;;;; +25C7;WHITE DIAMOND;So;0;ON;;;;;N;;;;; +25C8;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; +25C9;FISHEYE;So;0;ON;;;;;N;;;;; +25CA;LOZENGE;So;0;ON;;;;;N;;;;; +25CB;WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25CC;DOTTED CIRCLE;So;0;ON;;;;;N;;;;; +25CD;CIRCLE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; +25CE;BULLSEYE;So;0;ON;;;;;N;;;;; +25CF;BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D0;CIRCLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +25D1;CIRCLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +25D2;CIRCLE WITH LOWER HALF BLACK;So;0;ON;;;;;N;;;;; +25D3;CIRCLE WITH UPPER HALF BLACK;So;0;ON;;;;;N;;;;; +25D4;CIRCLE WITH UPPER RIGHT QUADRANT BLACK;So;0;ON;;;;;N;;;;; +25D5;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK;So;0;ON;;;;;N;;;;; +25D6;LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D7;RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D8;INVERSE BULLET;So;0;ON;;;;;N;;;;; +25D9;INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DA;UPPER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DB;LOWER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DC;UPPER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DD;UPPER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DE;LOWER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DF;LOWER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25E0;UPPER HALF CIRCLE;So;0;ON;;;;;N;;;;; +25E1;LOWER HALF CIRCLE;So;0;ON;;;;;N;;;;; +25E2;BLACK LOWER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +25E3;BLACK LOWER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; +25E4;BLACK UPPER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; +25E5;BLACK UPPER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +25E6;WHITE BULLET;So;0;ON;;;;;N;;;;; +25E7;SQUARE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +25E8;SQUARE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +25E9;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +25EA;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +25EB;WHITE SQUARE WITH VERTICAL BISECTING LINE;So;0;ON;;;;;N;;;;; +25EC;WHITE UP-POINTING TRIANGLE WITH DOT;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE WITH DOT;;;; +25ED;UP-POINTING TRIANGLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH LEFT HALF BLACK;;;; +25EE;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH RIGHT HALF BLACK;;;; +25EF;LARGE CIRCLE;So;0;ON;;;;;N;;;;; +25F0;WHITE SQUARE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F1;WHITE SQUARE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F2;WHITE SQUARE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F3;WHITE SQUARE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F4;WHITE CIRCLE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F5;WHITE CIRCLE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F6;WHITE CIRCLE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F7;WHITE CIRCLE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F8;UPPER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25F9;UPPER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25FA;LOWER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25FB;WHITE MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;; +25FC;BLACK MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;; +25FD;WHITE MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;; +25FE;BLACK MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;; +25FF;LOWER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;; +2600;BLACK SUN WITH RAYS;So;0;ON;;;;;N;;;;; +2601;CLOUD;So;0;ON;;;;;N;;;;; +2602;UMBRELLA;So;0;ON;;;;;N;;;;; +2603;SNOWMAN;So;0;ON;;;;;N;;;;; +2604;COMET;So;0;ON;;;;;N;;;;; +2605;BLACK STAR;So;0;ON;;;;;N;;;;; +2606;WHITE STAR;So;0;ON;;;;;N;;;;; +2607;LIGHTNING;So;0;ON;;;;;N;;;;; +2608;THUNDERSTORM;So;0;ON;;;;;N;;;;; +2609;SUN;So;0;ON;;;;;N;;;;; +260A;ASCENDING NODE;So;0;ON;;;;;N;;;;; +260B;DESCENDING NODE;So;0;ON;;;;;N;;;;; +260C;CONJUNCTION;So;0;ON;;;;;N;;;;; +260D;OPPOSITION;So;0;ON;;;;;N;;;;; +260E;BLACK TELEPHONE;So;0;ON;;;;;N;;;;; +260F;WHITE TELEPHONE;So;0;ON;;;;;N;;;;; +2610;BALLOT BOX;So;0;ON;;;;;N;;;;; +2611;BALLOT BOX WITH CHECK;So;0;ON;;;;;N;;;;; +2612;BALLOT BOX WITH X;So;0;ON;;;;;N;;;;; +2613;SALTIRE;So;0;ON;;;;;N;;;;; +2616;WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; +2617;BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; +2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; +261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +261C;WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +261D;WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; +261E;WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +261F;WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; +2620;SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; +2621;CAUTION SIGN;So;0;ON;;;;;N;;;;; +2622;RADIOACTIVE SIGN;So;0;ON;;;;;N;;;;; +2623;BIOHAZARD SIGN;So;0;ON;;;;;N;;;;; +2624;CADUCEUS;So;0;ON;;;;;N;;;;; +2625;ANKH;So;0;ON;;;;;N;;;;; +2626;ORTHODOX CROSS;So;0;ON;;;;;N;;;;; +2627;CHI RHO;So;0;ON;;;;;N;;;;; +2628;CROSS OF LORRAINE;So;0;ON;;;;;N;;;;; +2629;CROSS OF JERUSALEM;So;0;ON;;;;;N;;;;; +262A;STAR AND CRESCENT;So;0;ON;;;;;N;;;;; +262B;FARSI SYMBOL;So;0;ON;;;;;N;SYMBOL OF IRAN;;;; +262C;ADI SHAKTI;So;0;ON;;;;;N;;;;; +262D;HAMMER AND SICKLE;So;0;ON;;;;;N;;;;; +262E;PEACE SYMBOL;So;0;ON;;;;;N;;;;; +262F;YIN YANG;So;0;ON;;;;;N;;;;; +2630;TRIGRAM FOR HEAVEN;So;0;ON;;;;;N;;;;; +2631;TRIGRAM FOR LAKE;So;0;ON;;;;;N;;;;; +2632;TRIGRAM FOR FIRE;So;0;ON;;;;;N;;;;; +2633;TRIGRAM FOR THUNDER;So;0;ON;;;;;N;;;;; +2634;TRIGRAM FOR WIND;So;0;ON;;;;;N;;;;; +2635;TRIGRAM FOR WATER;So;0;ON;;;;;N;;;;; +2636;TRIGRAM FOR MOUNTAIN;So;0;ON;;;;;N;;;;; +2637;TRIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +2638;WHEEL OF DHARMA;So;0;ON;;;;;N;;;;; +2639;WHITE FROWNING FACE;So;0;ON;;;;;N;;;;; +263A;WHITE SMILING FACE;So;0;ON;;;;;N;;;;; +263B;BLACK SMILING FACE;So;0;ON;;;;;N;;;;; +263C;WHITE SUN WITH RAYS;So;0;ON;;;;;N;;;;; +263D;FIRST QUARTER MOON;So;0;ON;;;;;N;;;;; +263E;LAST QUARTER MOON;So;0;ON;;;;;N;;;;; +263F;MERCURY;So;0;ON;;;;;N;;;;; +2640;FEMALE SIGN;So;0;ON;;;;;N;;;;; +2641;EARTH;So;0;ON;;;;;N;;;;; +2642;MALE SIGN;So;0;ON;;;;;N;;;;; +2643;JUPITER;So;0;ON;;;;;N;;;;; +2644;SATURN;So;0;ON;;;;;N;;;;; +2645;URANUS;So;0;ON;;;;;N;;;;; +2646;NEPTUNE;So;0;ON;;;;;N;;;;; +2647;PLUTO;So;0;ON;;;;;N;;;;; +2648;ARIES;So;0;ON;;;;;N;;;;; +2649;TAURUS;So;0;ON;;;;;N;;;;; +264A;GEMINI;So;0;ON;;;;;N;;;;; +264B;CANCER;So;0;ON;;;;;N;;;;; +264C;LEO;So;0;ON;;;;;N;;;;; +264D;VIRGO;So;0;ON;;;;;N;;;;; +264E;LIBRA;So;0;ON;;;;;N;;;;; +264F;SCORPIUS;So;0;ON;;;;;N;;;;; +2650;SAGITTARIUS;So;0;ON;;;;;N;;;;; +2651;CAPRICORN;So;0;ON;;;;;N;;;;; +2652;AQUARIUS;So;0;ON;;;;;N;;;;; +2653;PISCES;So;0;ON;;;;;N;;;;; +2654;WHITE CHESS KING;So;0;ON;;;;;N;;;;; +2655;WHITE CHESS QUEEN;So;0;ON;;;;;N;;;;; +2656;WHITE CHESS ROOK;So;0;ON;;;;;N;;;;; +2657;WHITE CHESS BISHOP;So;0;ON;;;;;N;;;;; +2658;WHITE CHESS KNIGHT;So;0;ON;;;;;N;;;;; +2659;WHITE CHESS PAWN;So;0;ON;;;;;N;;;;; +265A;BLACK CHESS KING;So;0;ON;;;;;N;;;;; +265B;BLACK CHESS QUEEN;So;0;ON;;;;;N;;;;; +265C;BLACK CHESS ROOK;So;0;ON;;;;;N;;;;; +265D;BLACK CHESS BISHOP;So;0;ON;;;;;N;;;;; +265E;BLACK CHESS KNIGHT;So;0;ON;;;;;N;;;;; +265F;BLACK CHESS PAWN;So;0;ON;;;;;N;;;;; +2660;BLACK SPADE SUIT;So;0;ON;;;;;N;;;;; +2661;WHITE HEART SUIT;So;0;ON;;;;;N;;;;; +2662;WHITE DIAMOND SUIT;So;0;ON;;;;;N;;;;; +2663;BLACK CLUB SUIT;So;0;ON;;;;;N;;;;; +2664;WHITE SPADE SUIT;So;0;ON;;;;;N;;;;; +2665;BLACK HEART SUIT;So;0;ON;;;;;N;;;;; +2666;BLACK DIAMOND SUIT;So;0;ON;;;;;N;;;;; +2667;WHITE CLUB SUIT;So;0;ON;;;;;N;;;;; +2668;HOT SPRINGS;So;0;ON;;;;;N;;;;; +2669;QUARTER NOTE;So;0;ON;;;;;N;;;;; +266A;EIGHTH NOTE;So;0;ON;;;;;N;;;;; +266B;BEAMED EIGHTH NOTES;So;0;ON;;;;;N;BARRED EIGHTH NOTES;;;; +266C;BEAMED SIXTEENTH NOTES;So;0;ON;;;;;N;BARRED SIXTEENTH NOTES;;;; +266D;MUSIC FLAT SIGN;So;0;ON;;;;;N;FLAT;;;; +266E;MUSIC NATURAL SIGN;So;0;ON;;;;;N;NATURAL;;;; +266F;MUSIC SHARP SIGN;Sm;0;ON;;;;;N;SHARP;;;; +2670;WEST SYRIAC CROSS;So;0;ON;;;;;N;;;;; +2671;EAST SYRIAC CROSS;So;0;ON;;;;;N;;;;; +2672;UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; +2673;RECYCLING SYMBOL FOR TYPE-1 PLASTICS;So;0;ON;;;;;N;;pete;;; +2674;RECYCLING SYMBOL FOR TYPE-2 PLASTICS;So;0;ON;;;;;N;;hdpe;;; +2675;RECYCLING SYMBOL FOR TYPE-3 PLASTICS;So;0;ON;;;;;N;;pvc;;; +2676;RECYCLING SYMBOL FOR TYPE-4 PLASTICS;So;0;ON;;;;;N;;ldpe;;; +2677;RECYCLING SYMBOL FOR TYPE-5 PLASTICS;So;0;ON;;;;;N;;pp;;; +2678;RECYCLING SYMBOL FOR TYPE-6 PLASTICS;So;0;ON;;;;;N;;ps;;; +2679;RECYCLING SYMBOL FOR TYPE-7 PLASTICS;So;0;ON;;;;;N;;other;;; +267A;RECYCLING SYMBOL FOR GENERIC MATERIALS;So;0;ON;;;;;N;;;;; +267B;BLACK UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; +267C;RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; +267D;PARTIALLY-RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; +2680;DIE FACE-1;So;0;ON;;;;;N;;;;; +2681;DIE FACE-2;So;0;ON;;;;;N;;;;; +2682;DIE FACE-3;So;0;ON;;;;;N;;;;; +2683;DIE FACE-4;So;0;ON;;;;;N;;;;; +2684;DIE FACE-5;So;0;ON;;;;;N;;;;; +2685;DIE FACE-6;So;0;ON;;;;;N;;;;; +2686;WHITE CIRCLE WITH DOT RIGHT;So;0;ON;;;;;N;;;;; +2687;WHITE CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;; +2688;BLACK CIRCLE WITH WHITE DOT RIGHT;So;0;ON;;;;;N;;;;; +2689;BLACK CIRCLE WITH TWO WHITE DOTS;So;0;ON;;;;;N;;;;; +2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;; +2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;; +2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;; +2704;WHITE SCISSORS;So;0;ON;;;;;N;;;;; +2706;TELEPHONE LOCATION SIGN;So;0;ON;;;;;N;;;;; +2707;TAPE DRIVE;So;0;ON;;;;;N;;;;; +2708;AIRPLANE;So;0;ON;;;;;N;;;;; +2709;ENVELOPE;So;0;ON;;;;;N;;;;; +270C;VICTORY HAND;So;0;ON;;;;;N;;;;; +270D;WRITING HAND;So;0;ON;;;;;N;;;;; +270E;LOWER RIGHT PENCIL;So;0;ON;;;;;N;;;;; +270F;PENCIL;So;0;ON;;;;;N;;;;; +2710;UPPER RIGHT PENCIL;So;0;ON;;;;;N;;;;; +2711;WHITE NIB;So;0;ON;;;;;N;;;;; +2712;BLACK NIB;So;0;ON;;;;;N;;;;; +2713;CHECK MARK;So;0;ON;;;;;N;;;;; +2714;HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; +2715;MULTIPLICATION X;So;0;ON;;;;;N;;;;; +2716;HEAVY MULTIPLICATION X;So;0;ON;;;;;N;;;;; +2717;BALLOT X;So;0;ON;;;;;N;;;;; +2718;HEAVY BALLOT X;So;0;ON;;;;;N;;;;; +2719;OUTLINED GREEK CROSS;So;0;ON;;;;;N;;;;; +271A;HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; +271B;OPEN CENTRE CROSS;So;0;ON;;;;;N;OPEN CENTER CROSS;;;; +271C;HEAVY OPEN CENTRE CROSS;So;0;ON;;;;;N;HEAVY OPEN CENTER CROSS;;;; +271D;LATIN CROSS;So;0;ON;;;;;N;;;;; +271E;SHADOWED WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; +271F;OUTLINED LATIN CROSS;So;0;ON;;;;;N;;;;; +2720;MALTESE CROSS;So;0;ON;;;;;N;;;;; +2721;STAR OF DAVID;So;0;ON;;;;;N;;;;; +2722;FOUR TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2723;FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2724;HEAVY FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2725;FOUR CLUB-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2726;BLACK FOUR POINTED STAR;So;0;ON;;;;;N;;;;; +2727;WHITE FOUR POINTED STAR;So;0;ON;;;;;N;;;;; +2729;STRESS OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; +272A;CIRCLED WHITE STAR;So;0;ON;;;;;N;;;;; +272B;OPEN CENTRE BLACK STAR;So;0;ON;;;;;N;OPEN CENTER BLACK STAR;;;; +272C;BLACK CENTRE WHITE STAR;So;0;ON;;;;;N;BLACK CENTER WHITE STAR;;;; +272D;OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; +272E;HEAVY OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; +272F;PINWHEEL STAR;So;0;ON;;;;;N;;;;; +2730;SHADOWED WHITE STAR;So;0;ON;;;;;N;;;;; +2731;HEAVY ASTERISK;So;0;ON;;;;;N;;;;; +2732;OPEN CENTRE ASTERISK;So;0;ON;;;;;N;OPEN CENTER ASTERISK;;;; +2733;EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2734;EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +2735;EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +2736;SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +2737;EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; +2738;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; +2739;TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +273A;SIXTEEN POINTED ASTERISK;So;0;ON;;;;;N;;;;; +273B;TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +273C;OPEN CENTRE TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;OPEN CENTER TEARDROP-SPOKED ASTERISK;;;; +273D;HEAVY TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +273E;SIX PETALLED BLACK AND WHITE FLORETTE;So;0;ON;;;;;N;;;;; +273F;BLACK FLORETTE;So;0;ON;;;;;N;;;;; +2740;WHITE FLORETTE;So;0;ON;;;;;N;;;;; +2741;EIGHT PETALLED OUTLINED BLACK FLORETTE;So;0;ON;;;;;N;;;;; +2742;CIRCLED OPEN CENTRE EIGHT POINTED STAR;So;0;ON;;;;;N;CIRCLED OPEN CENTER EIGHT POINTED STAR;;;; +2743;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK;So;0;ON;;;;;N;;;;; +2744;SNOWFLAKE;So;0;ON;;;;;N;;;;; +2745;TIGHT TRIFOLIATE SNOWFLAKE;So;0;ON;;;;;N;;;;; +2746;HEAVY CHEVRON SNOWFLAKE;So;0;ON;;;;;N;;;;; +2747;SPARKLE;So;0;ON;;;;;N;;;;; +2748;HEAVY SPARKLE;So;0;ON;;;;;N;;;;; +2749;BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +274A;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; +274B;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; +274D;SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; +274F;LOWER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2750;UPPER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2751;LOWER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2752;UPPER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2756;BLACK DIAMOND MINUS WHITE X;So;0;ON;;;;;N;;;;; +2758;LIGHT VERTICAL BAR;So;0;ON;;;;;N;;;;; +2759;MEDIUM VERTICAL BAR;So;0;ON;;;;;N;;;;; +275A;HEAVY VERTICAL BAR;So;0;ON;;;;;N;;;;; +275B;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275C;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275D;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275E;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2761;CURVED STEM PARAGRAPH SIGN ORNAMENT;So;0;ON;;;;;N;;;;; +2762;HEAVY EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2763;HEAVY HEART EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2764;HEAVY BLACK HEART;So;0;ON;;;;;N;;;;; +2765;ROTATED HEAVY BLACK HEART BULLET;So;0;ON;;;;;N;;;;; +2766;FLORAL HEART;So;0;ON;;;;;N;;;;; +2767;ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; +2768;MEDIUM LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2769;MEDIUM RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276A;MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276B;MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276C;MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276D;MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276E;HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276F;HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2770;HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2771;HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2772;LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2773;LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2774;MEDIUM LEFT CURLY BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2775;MEDIUM RIGHT CURLY BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2776;DINGBAT NEGATIVE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED DIGIT ONE;;;; +2777;DINGBAT NEGATIVE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED DIGIT TWO;;;; +2778;DINGBAT NEGATIVE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED DIGIT THREE;;;; +2779;DINGBAT NEGATIVE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED DIGIT FOUR;;;; +277A;DINGBAT NEGATIVE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED DIGIT FIVE;;;; +277B;DINGBAT NEGATIVE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED DIGIT SIX;;;; +277C;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED DIGIT SEVEN;;;; +277D;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED DIGIT EIGHT;;;; +277E;DINGBAT NEGATIVE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED DIGIT NINE;;;; +277F;DINGBAT NEGATIVE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED NUMBER TEN;;;; +2780;DINGBAT CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;CIRCLED SANS-SERIF DIGIT ONE;;;; +2781;DINGBAT CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;CIRCLED SANS-SERIF DIGIT TWO;;;; +2782;DINGBAT CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;CIRCLED SANS-SERIF DIGIT THREE;;;; +2783;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;CIRCLED SANS-SERIF DIGIT FOUR;;;; +2784;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;CIRCLED SANS-SERIF DIGIT FIVE;;;; +2785;DINGBAT CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;CIRCLED SANS-SERIF DIGIT SIX;;;; +2786;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;CIRCLED SANS-SERIF DIGIT SEVEN;;;; +2787;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;CIRCLED SANS-SERIF DIGIT EIGHT;;;; +2788;DINGBAT CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;CIRCLED SANS-SERIF DIGIT NINE;;;; +2789;DINGBAT CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;CIRCLED SANS-SERIF NUMBER TEN;;;; +278A;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED SANS-SERIF DIGIT ONE;;;; +278B;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED SANS-SERIF DIGIT TWO;;;; +278C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED SANS-SERIF DIGIT THREE;;;; +278D;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED SANS-SERIF DIGIT FOUR;;;; +278E;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED SANS-SERIF DIGIT FIVE;;;; +278F;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED SANS-SERIF DIGIT SIX;;;; +2790;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED SANS-SERIF DIGIT SEVEN;;;; +2791;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED SANS-SERIF DIGIT EIGHT;;;; +2792;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED SANS-SERIF DIGIT NINE;;;; +2793;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED SANS-SERIF NUMBER TEN;;;; +2794;HEAVY WIDE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WIDE-HEADED RIGHT ARROW;;;; +2798;HEAVY SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT ARROW;;;; +2799;HEAVY RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY RIGHT ARROW;;;; +279A;HEAVY NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT ARROW;;;; +279B;DRAFTING POINT RIGHTWARDS ARROW;So;0;ON;;;;;N;DRAFTING POINT RIGHT ARROW;;;; +279C;HEAVY ROUND-TIPPED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY ROUND-TIPPED RIGHT ARROW;;;; +279D;TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;TRIANGLE-HEADED RIGHT ARROW;;;; +279E;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TRIANGLE-HEADED RIGHT ARROW;;;; +279F;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;DASHED TRIANGLE-HEADED RIGHT ARROW;;;; +27A0;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW;;;; +27A1;BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK RIGHT ARROW;;;; +27A2;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D TOP-LIGHTED RIGHT ARROWHEAD;;;; +27A3;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD;;;; +27A4;BLACK RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;BLACK RIGHT ARROWHEAD;;;; +27A5;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED DOWN AND RIGHT ARROW;;;; +27A6;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED UP AND RIGHT ARROW;;;; +27A7;SQUAT BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;SQUAT BLACK RIGHT ARROW;;;; +27A8;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY CONCAVE-POINTED BLACK RIGHT ARROW;;;; +27A9;RIGHT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;RIGHT-SHADED WHITE RIGHT ARROW;;;; +27AA;LEFT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT-SHADED WHITE RIGHT ARROW;;;; +27AB;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;BACK-TILTED SHADOWED WHITE RIGHT ARROW;;;; +27AC;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;FRONT-TILTED SHADOWED WHITE RIGHT ARROW;;;; +27AD;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27AE;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27AF;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27B1;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27B2;CIRCLED HEAVY WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;CIRCLED HEAVY WHITE RIGHT ARROW;;;; +27B3;WHITE-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;WHITE-FEATHERED RIGHT ARROW;;;; +27B4;BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED LOWER RIGHT ARROW;;;; +27B5;BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK-FEATHERED RIGHT ARROW;;;; +27B6;BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED UPPER RIGHT ARROW;;;; +27B7;HEAVY BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED LOWER RIGHT ARROW;;;; +27B8;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED RIGHT ARROW;;;; +27B9;HEAVY BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED UPPER RIGHT ARROW;;;; +27BA;TEARDROP-BARBED RIGHTWARDS ARROW;So;0;ON;;;;;N;TEARDROP-BARBED RIGHT ARROW;;;; +27BB;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TEARDROP-SHANKED RIGHT ARROW;;;; +27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;; +27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;; +27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;; +27D0;WHITE DIAMOND WITH CENTRED DOT;Sm;0;ON;;;;;N;;;;; +27D1;AND WITH DOT;Sm;0;ON;;;;;N;;;;; +27D2;ELEMENT OF OPENING UPWARDS;Sm;0;ON;;;;;N;;;;; +27D3;LOWER RIGHT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;; +27D4;UPPER LEFT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;; +27D5;LEFT OUTER JOIN;Sm;0;ON;;;;;Y;;;;; +27D6;RIGHT OUTER JOIN;Sm;0;ON;;;;;Y;;;;; +27D7;FULL OUTER JOIN;Sm;0;ON;;;;;N;;;;; +27D8;LARGE UP TACK;Sm;0;ON;;;;;N;;;;; +27D9;LARGE DOWN TACK;Sm;0;ON;;;;;N;;;;; +27DA;LEFT AND RIGHT DOUBLE TURNSTILE;Sm;0;ON;;;;;N;;;;; +27DB;LEFT AND RIGHT TACK;Sm;0;ON;;;;;N;;;;; +27DC;LEFT MULTIMAP;Sm;0;ON;;;;;Y;;;;; +27DD;LONG RIGHT TACK;Sm;0;ON;;;;;Y;;;;; +27DE;LONG LEFT TACK;Sm;0;ON;;;;;Y;;;;; +27DF;UP TACK WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +27E0;LOZENGE DIVIDED BY HORIZONTAL RULE;Sm;0;ON;;;;;N;;;;; +27E1;WHITE CONCAVE-SIDED DIAMOND;Sm;0;ON;;;;;N;;;;; +27E2;WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E3;WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E4;WHITE SQUARE WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E5;WHITE SQUARE WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E6;MATHEMATICAL LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;;;;; +27E7;MATHEMATICAL RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;;;;; +27E8;MATHEMATICAL LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +27E9;MATHEMATICAL RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +27EA;MATHEMATICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +27EB;MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +27F0;UPWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; +27F1;DOWNWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; +27F2;ANTICLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +27F3;CLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +27F4;RIGHT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +27F5;LONG LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +27F6;LONG RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +27F7;LONG LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; +27F8;LONG LEFTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27F9;LONG RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27FA;LONG LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27FB;LONG LEFTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FC;LONG RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FD;LONG LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FE;LONG RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FF;LONG RIGHTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; +2800;BRAILLE PATTERN BLANK;So;0;ON;;;;;N;;;;; +2801;BRAILLE PATTERN DOTS-1;So;0;ON;;;;;N;;;;; +2802;BRAILLE PATTERN DOTS-2;So;0;ON;;;;;N;;;;; +2803;BRAILLE PATTERN DOTS-12;So;0;ON;;;;;N;;;;; +2804;BRAILLE PATTERN DOTS-3;So;0;ON;;;;;N;;;;; +2805;BRAILLE PATTERN DOTS-13;So;0;ON;;;;;N;;;;; +2806;BRAILLE PATTERN DOTS-23;So;0;ON;;;;;N;;;;; +2807;BRAILLE PATTERN DOTS-123;So;0;ON;;;;;N;;;;; +2808;BRAILLE PATTERN DOTS-4;So;0;ON;;;;;N;;;;; +2809;BRAILLE PATTERN DOTS-14;So;0;ON;;;;;N;;;;; +280A;BRAILLE PATTERN DOTS-24;So;0;ON;;;;;N;;;;; +280B;BRAILLE PATTERN DOTS-124;So;0;ON;;;;;N;;;;; +280C;BRAILLE PATTERN DOTS-34;So;0;ON;;;;;N;;;;; +280D;BRAILLE PATTERN DOTS-134;So;0;ON;;;;;N;;;;; +280E;BRAILLE PATTERN DOTS-234;So;0;ON;;;;;N;;;;; +280F;BRAILLE PATTERN DOTS-1234;So;0;ON;;;;;N;;;;; +2810;BRAILLE PATTERN DOTS-5;So;0;ON;;;;;N;;;;; +2811;BRAILLE PATTERN DOTS-15;So;0;ON;;;;;N;;;;; +2812;BRAILLE PATTERN DOTS-25;So;0;ON;;;;;N;;;;; +2813;BRAILLE PATTERN DOTS-125;So;0;ON;;;;;N;;;;; +2814;BRAILLE PATTERN DOTS-35;So;0;ON;;;;;N;;;;; +2815;BRAILLE PATTERN DOTS-135;So;0;ON;;;;;N;;;;; +2816;BRAILLE PATTERN DOTS-235;So;0;ON;;;;;N;;;;; +2817;BRAILLE PATTERN DOTS-1235;So;0;ON;;;;;N;;;;; +2818;BRAILLE PATTERN DOTS-45;So;0;ON;;;;;N;;;;; +2819;BRAILLE PATTERN DOTS-145;So;0;ON;;;;;N;;;;; +281A;BRAILLE PATTERN DOTS-245;So;0;ON;;;;;N;;;;; +281B;BRAILLE PATTERN DOTS-1245;So;0;ON;;;;;N;;;;; +281C;BRAILLE PATTERN DOTS-345;So;0;ON;;;;;N;;;;; +281D;BRAILLE PATTERN DOTS-1345;So;0;ON;;;;;N;;;;; +281E;BRAILLE PATTERN DOTS-2345;So;0;ON;;;;;N;;;;; +281F;BRAILLE PATTERN DOTS-12345;So;0;ON;;;;;N;;;;; +2820;BRAILLE PATTERN DOTS-6;So;0;ON;;;;;N;;;;; +2821;BRAILLE PATTERN DOTS-16;So;0;ON;;;;;N;;;;; +2822;BRAILLE PATTERN DOTS-26;So;0;ON;;;;;N;;;;; +2823;BRAILLE PATTERN DOTS-126;So;0;ON;;;;;N;;;;; +2824;BRAILLE PATTERN DOTS-36;So;0;ON;;;;;N;;;;; +2825;BRAILLE PATTERN DOTS-136;So;0;ON;;;;;N;;;;; +2826;BRAILLE PATTERN DOTS-236;So;0;ON;;;;;N;;;;; +2827;BRAILLE PATTERN DOTS-1236;So;0;ON;;;;;N;;;;; +2828;BRAILLE PATTERN DOTS-46;So;0;ON;;;;;N;;;;; +2829;BRAILLE PATTERN DOTS-146;So;0;ON;;;;;N;;;;; +282A;BRAILLE PATTERN DOTS-246;So;0;ON;;;;;N;;;;; +282B;BRAILLE PATTERN DOTS-1246;So;0;ON;;;;;N;;;;; +282C;BRAILLE PATTERN DOTS-346;So;0;ON;;;;;N;;;;; +282D;BRAILLE PATTERN DOTS-1346;So;0;ON;;;;;N;;;;; +282E;BRAILLE PATTERN DOTS-2346;So;0;ON;;;;;N;;;;; +282F;BRAILLE PATTERN DOTS-12346;So;0;ON;;;;;N;;;;; +2830;BRAILLE PATTERN DOTS-56;So;0;ON;;;;;N;;;;; +2831;BRAILLE PATTERN DOTS-156;So;0;ON;;;;;N;;;;; +2832;BRAILLE PATTERN DOTS-256;So;0;ON;;;;;N;;;;; +2833;BRAILLE PATTERN DOTS-1256;So;0;ON;;;;;N;;;;; +2834;BRAILLE PATTERN DOTS-356;So;0;ON;;;;;N;;;;; +2835;BRAILLE PATTERN DOTS-1356;So;0;ON;;;;;N;;;;; +2836;BRAILLE PATTERN DOTS-2356;So;0;ON;;;;;N;;;;; +2837;BRAILLE PATTERN DOTS-12356;So;0;ON;;;;;N;;;;; +2838;BRAILLE PATTERN DOTS-456;So;0;ON;;;;;N;;;;; +2839;BRAILLE PATTERN DOTS-1456;So;0;ON;;;;;N;;;;; +283A;BRAILLE PATTERN DOTS-2456;So;0;ON;;;;;N;;;;; +283B;BRAILLE PATTERN DOTS-12456;So;0;ON;;;;;N;;;;; +283C;BRAILLE PATTERN DOTS-3456;So;0;ON;;;;;N;;;;; +283D;BRAILLE PATTERN DOTS-13456;So;0;ON;;;;;N;;;;; +283E;BRAILLE PATTERN DOTS-23456;So;0;ON;;;;;N;;;;; +283F;BRAILLE PATTERN DOTS-123456;So;0;ON;;;;;N;;;;; +2840;BRAILLE PATTERN DOTS-7;So;0;ON;;;;;N;;;;; +2841;BRAILLE PATTERN DOTS-17;So;0;ON;;;;;N;;;;; +2842;BRAILLE PATTERN DOTS-27;So;0;ON;;;;;N;;;;; +2843;BRAILLE PATTERN DOTS-127;So;0;ON;;;;;N;;;;; +2844;BRAILLE PATTERN DOTS-37;So;0;ON;;;;;N;;;;; +2845;BRAILLE PATTERN DOTS-137;So;0;ON;;;;;N;;;;; +2846;BRAILLE PATTERN DOTS-237;So;0;ON;;;;;N;;;;; +2847;BRAILLE PATTERN DOTS-1237;So;0;ON;;;;;N;;;;; +2848;BRAILLE PATTERN DOTS-47;So;0;ON;;;;;N;;;;; +2849;BRAILLE PATTERN DOTS-147;So;0;ON;;;;;N;;;;; +284A;BRAILLE PATTERN DOTS-247;So;0;ON;;;;;N;;;;; +284B;BRAILLE PATTERN DOTS-1247;So;0;ON;;;;;N;;;;; +284C;BRAILLE PATTERN DOTS-347;So;0;ON;;;;;N;;;;; +284D;BRAILLE PATTERN DOTS-1347;So;0;ON;;;;;N;;;;; +284E;BRAILLE PATTERN DOTS-2347;So;0;ON;;;;;N;;;;; +284F;BRAILLE PATTERN DOTS-12347;So;0;ON;;;;;N;;;;; +2850;BRAILLE PATTERN DOTS-57;So;0;ON;;;;;N;;;;; +2851;BRAILLE PATTERN DOTS-157;So;0;ON;;;;;N;;;;; +2852;BRAILLE PATTERN DOTS-257;So;0;ON;;;;;N;;;;; +2853;BRAILLE PATTERN DOTS-1257;So;0;ON;;;;;N;;;;; +2854;BRAILLE PATTERN DOTS-357;So;0;ON;;;;;N;;;;; +2855;BRAILLE PATTERN DOTS-1357;So;0;ON;;;;;N;;;;; +2856;BRAILLE PATTERN DOTS-2357;So;0;ON;;;;;N;;;;; +2857;BRAILLE PATTERN DOTS-12357;So;0;ON;;;;;N;;;;; +2858;BRAILLE PATTERN DOTS-457;So;0;ON;;;;;N;;;;; +2859;BRAILLE PATTERN DOTS-1457;So;0;ON;;;;;N;;;;; +285A;BRAILLE PATTERN DOTS-2457;So;0;ON;;;;;N;;;;; +285B;BRAILLE PATTERN DOTS-12457;So;0;ON;;;;;N;;;;; +285C;BRAILLE PATTERN DOTS-3457;So;0;ON;;;;;N;;;;; +285D;BRAILLE PATTERN DOTS-13457;So;0;ON;;;;;N;;;;; +285E;BRAILLE PATTERN DOTS-23457;So;0;ON;;;;;N;;;;; +285F;BRAILLE PATTERN DOTS-123457;So;0;ON;;;;;N;;;;; +2860;BRAILLE PATTERN DOTS-67;So;0;ON;;;;;N;;;;; +2861;BRAILLE PATTERN DOTS-167;So;0;ON;;;;;N;;;;; +2862;BRAILLE PATTERN DOTS-267;So;0;ON;;;;;N;;;;; +2863;BRAILLE PATTERN DOTS-1267;So;0;ON;;;;;N;;;;; +2864;BRAILLE PATTERN DOTS-367;So;0;ON;;;;;N;;;;; +2865;BRAILLE PATTERN DOTS-1367;So;0;ON;;;;;N;;;;; +2866;BRAILLE PATTERN DOTS-2367;So;0;ON;;;;;N;;;;; +2867;BRAILLE PATTERN DOTS-12367;So;0;ON;;;;;N;;;;; +2868;BRAILLE PATTERN DOTS-467;So;0;ON;;;;;N;;;;; +2869;BRAILLE PATTERN DOTS-1467;So;0;ON;;;;;N;;;;; +286A;BRAILLE PATTERN DOTS-2467;So;0;ON;;;;;N;;;;; +286B;BRAILLE PATTERN DOTS-12467;So;0;ON;;;;;N;;;;; +286C;BRAILLE PATTERN DOTS-3467;So;0;ON;;;;;N;;;;; +286D;BRAILLE PATTERN DOTS-13467;So;0;ON;;;;;N;;;;; +286E;BRAILLE PATTERN DOTS-23467;So;0;ON;;;;;N;;;;; +286F;BRAILLE PATTERN DOTS-123467;So;0;ON;;;;;N;;;;; +2870;BRAILLE PATTERN DOTS-567;So;0;ON;;;;;N;;;;; +2871;BRAILLE PATTERN DOTS-1567;So;0;ON;;;;;N;;;;; +2872;BRAILLE PATTERN DOTS-2567;So;0;ON;;;;;N;;;;; +2873;BRAILLE PATTERN DOTS-12567;So;0;ON;;;;;N;;;;; +2874;BRAILLE PATTERN DOTS-3567;So;0;ON;;;;;N;;;;; +2875;BRAILLE PATTERN DOTS-13567;So;0;ON;;;;;N;;;;; +2876;BRAILLE PATTERN DOTS-23567;So;0;ON;;;;;N;;;;; +2877;BRAILLE PATTERN DOTS-123567;So;0;ON;;;;;N;;;;; +2878;BRAILLE PATTERN DOTS-4567;So;0;ON;;;;;N;;;;; +2879;BRAILLE PATTERN DOTS-14567;So;0;ON;;;;;N;;;;; +287A;BRAILLE PATTERN DOTS-24567;So;0;ON;;;;;N;;;;; +287B;BRAILLE PATTERN DOTS-124567;So;0;ON;;;;;N;;;;; +287C;BRAILLE PATTERN DOTS-34567;So;0;ON;;;;;N;;;;; +287D;BRAILLE PATTERN DOTS-134567;So;0;ON;;;;;N;;;;; +287E;BRAILLE PATTERN DOTS-234567;So;0;ON;;;;;N;;;;; +287F;BRAILLE PATTERN DOTS-1234567;So;0;ON;;;;;N;;;;; +2880;BRAILLE PATTERN DOTS-8;So;0;ON;;;;;N;;;;; +2881;BRAILLE PATTERN DOTS-18;So;0;ON;;;;;N;;;;; +2882;BRAILLE PATTERN DOTS-28;So;0;ON;;;;;N;;;;; +2883;BRAILLE PATTERN DOTS-128;So;0;ON;;;;;N;;;;; +2884;BRAILLE PATTERN DOTS-38;So;0;ON;;;;;N;;;;; +2885;BRAILLE PATTERN DOTS-138;So;0;ON;;;;;N;;;;; +2886;BRAILLE PATTERN DOTS-238;So;0;ON;;;;;N;;;;; +2887;BRAILLE PATTERN DOTS-1238;So;0;ON;;;;;N;;;;; +2888;BRAILLE PATTERN DOTS-48;So;0;ON;;;;;N;;;;; +2889;BRAILLE PATTERN DOTS-148;So;0;ON;;;;;N;;;;; +288A;BRAILLE PATTERN DOTS-248;So;0;ON;;;;;N;;;;; +288B;BRAILLE PATTERN DOTS-1248;So;0;ON;;;;;N;;;;; +288C;BRAILLE PATTERN DOTS-348;So;0;ON;;;;;N;;;;; +288D;BRAILLE PATTERN DOTS-1348;So;0;ON;;;;;N;;;;; +288E;BRAILLE PATTERN DOTS-2348;So;0;ON;;;;;N;;;;; +288F;BRAILLE PATTERN DOTS-12348;So;0;ON;;;;;N;;;;; +2890;BRAILLE PATTERN DOTS-58;So;0;ON;;;;;N;;;;; +2891;BRAILLE PATTERN DOTS-158;So;0;ON;;;;;N;;;;; +2892;BRAILLE PATTERN DOTS-258;So;0;ON;;;;;N;;;;; +2893;BRAILLE PATTERN DOTS-1258;So;0;ON;;;;;N;;;;; +2894;BRAILLE PATTERN DOTS-358;So;0;ON;;;;;N;;;;; +2895;BRAILLE PATTERN DOTS-1358;So;0;ON;;;;;N;;;;; +2896;BRAILLE PATTERN DOTS-2358;So;0;ON;;;;;N;;;;; +2897;BRAILLE PATTERN DOTS-12358;So;0;ON;;;;;N;;;;; +2898;BRAILLE PATTERN DOTS-458;So;0;ON;;;;;N;;;;; +2899;BRAILLE PATTERN DOTS-1458;So;0;ON;;;;;N;;;;; +289A;BRAILLE PATTERN DOTS-2458;So;0;ON;;;;;N;;;;; +289B;BRAILLE PATTERN DOTS-12458;So;0;ON;;;;;N;;;;; +289C;BRAILLE PATTERN DOTS-3458;So;0;ON;;;;;N;;;;; +289D;BRAILLE PATTERN DOTS-13458;So;0;ON;;;;;N;;;;; +289E;BRAILLE PATTERN DOTS-23458;So;0;ON;;;;;N;;;;; +289F;BRAILLE PATTERN DOTS-123458;So;0;ON;;;;;N;;;;; +28A0;BRAILLE PATTERN DOTS-68;So;0;ON;;;;;N;;;;; +28A1;BRAILLE PATTERN DOTS-168;So;0;ON;;;;;N;;;;; +28A2;BRAILLE PATTERN DOTS-268;So;0;ON;;;;;N;;;;; +28A3;BRAILLE PATTERN DOTS-1268;So;0;ON;;;;;N;;;;; +28A4;BRAILLE PATTERN DOTS-368;So;0;ON;;;;;N;;;;; +28A5;BRAILLE PATTERN DOTS-1368;So;0;ON;;;;;N;;;;; +28A6;BRAILLE PATTERN DOTS-2368;So;0;ON;;;;;N;;;;; +28A7;BRAILLE PATTERN DOTS-12368;So;0;ON;;;;;N;;;;; +28A8;BRAILLE PATTERN DOTS-468;So;0;ON;;;;;N;;;;; +28A9;BRAILLE PATTERN DOTS-1468;So;0;ON;;;;;N;;;;; +28AA;BRAILLE PATTERN DOTS-2468;So;0;ON;;;;;N;;;;; +28AB;BRAILLE PATTERN DOTS-12468;So;0;ON;;;;;N;;;;; +28AC;BRAILLE PATTERN DOTS-3468;So;0;ON;;;;;N;;;;; +28AD;BRAILLE PATTERN DOTS-13468;So;0;ON;;;;;N;;;;; +28AE;BRAILLE PATTERN DOTS-23468;So;0;ON;;;;;N;;;;; +28AF;BRAILLE PATTERN DOTS-123468;So;0;ON;;;;;N;;;;; +28B0;BRAILLE PATTERN DOTS-568;So;0;ON;;;;;N;;;;; +28B1;BRAILLE PATTERN DOTS-1568;So;0;ON;;;;;N;;;;; +28B2;BRAILLE PATTERN DOTS-2568;So;0;ON;;;;;N;;;;; +28B3;BRAILLE PATTERN DOTS-12568;So;0;ON;;;;;N;;;;; +28B4;BRAILLE PATTERN DOTS-3568;So;0;ON;;;;;N;;;;; +28B5;BRAILLE PATTERN DOTS-13568;So;0;ON;;;;;N;;;;; +28B6;BRAILLE PATTERN DOTS-23568;So;0;ON;;;;;N;;;;; +28B7;BRAILLE PATTERN DOTS-123568;So;0;ON;;;;;N;;;;; +28B8;BRAILLE PATTERN DOTS-4568;So;0;ON;;;;;N;;;;; +28B9;BRAILLE PATTERN DOTS-14568;So;0;ON;;;;;N;;;;; +28BA;BRAILLE PATTERN DOTS-24568;So;0;ON;;;;;N;;;;; +28BB;BRAILLE PATTERN DOTS-124568;So;0;ON;;;;;N;;;;; +28BC;BRAILLE PATTERN DOTS-34568;So;0;ON;;;;;N;;;;; +28BD;BRAILLE PATTERN DOTS-134568;So;0;ON;;;;;N;;;;; +28BE;BRAILLE PATTERN DOTS-234568;So;0;ON;;;;;N;;;;; +28BF;BRAILLE PATTERN DOTS-1234568;So;0;ON;;;;;N;;;;; +28C0;BRAILLE PATTERN DOTS-78;So;0;ON;;;;;N;;;;; +28C1;BRAILLE PATTERN DOTS-178;So;0;ON;;;;;N;;;;; +28C2;BRAILLE PATTERN DOTS-278;So;0;ON;;;;;N;;;;; +28C3;BRAILLE PATTERN DOTS-1278;So;0;ON;;;;;N;;;;; +28C4;BRAILLE PATTERN DOTS-378;So;0;ON;;;;;N;;;;; +28C5;BRAILLE PATTERN DOTS-1378;So;0;ON;;;;;N;;;;; +28C6;BRAILLE PATTERN DOTS-2378;So;0;ON;;;;;N;;;;; +28C7;BRAILLE PATTERN DOTS-12378;So;0;ON;;;;;N;;;;; +28C8;BRAILLE PATTERN DOTS-478;So;0;ON;;;;;N;;;;; +28C9;BRAILLE PATTERN DOTS-1478;So;0;ON;;;;;N;;;;; +28CA;BRAILLE PATTERN DOTS-2478;So;0;ON;;;;;N;;;;; +28CB;BRAILLE PATTERN DOTS-12478;So;0;ON;;;;;N;;;;; +28CC;BRAILLE PATTERN DOTS-3478;So;0;ON;;;;;N;;;;; +28CD;BRAILLE PATTERN DOTS-13478;So;0;ON;;;;;N;;;;; +28CE;BRAILLE PATTERN DOTS-23478;So;0;ON;;;;;N;;;;; +28CF;BRAILLE PATTERN DOTS-123478;So;0;ON;;;;;N;;;;; +28D0;BRAILLE PATTERN DOTS-578;So;0;ON;;;;;N;;;;; +28D1;BRAILLE PATTERN DOTS-1578;So;0;ON;;;;;N;;;;; +28D2;BRAILLE PATTERN DOTS-2578;So;0;ON;;;;;N;;;;; +28D3;BRAILLE PATTERN DOTS-12578;So;0;ON;;;;;N;;;;; +28D4;BRAILLE PATTERN DOTS-3578;So;0;ON;;;;;N;;;;; +28D5;BRAILLE PATTERN DOTS-13578;So;0;ON;;;;;N;;;;; +28D6;BRAILLE PATTERN DOTS-23578;So;0;ON;;;;;N;;;;; +28D7;BRAILLE PATTERN DOTS-123578;So;0;ON;;;;;N;;;;; +28D8;BRAILLE PATTERN DOTS-4578;So;0;ON;;;;;N;;;;; +28D9;BRAILLE PATTERN DOTS-14578;So;0;ON;;;;;N;;;;; +28DA;BRAILLE PATTERN DOTS-24578;So;0;ON;;;;;N;;;;; +28DB;BRAILLE PATTERN DOTS-124578;So;0;ON;;;;;N;;;;; +28DC;BRAILLE PATTERN DOTS-34578;So;0;ON;;;;;N;;;;; +28DD;BRAILLE PATTERN DOTS-134578;So;0;ON;;;;;N;;;;; +28DE;BRAILLE PATTERN DOTS-234578;So;0;ON;;;;;N;;;;; +28DF;BRAILLE PATTERN DOTS-1234578;So;0;ON;;;;;N;;;;; +28E0;BRAILLE PATTERN DOTS-678;So;0;ON;;;;;N;;;;; +28E1;BRAILLE PATTERN DOTS-1678;So;0;ON;;;;;N;;;;; +28E2;BRAILLE PATTERN DOTS-2678;So;0;ON;;;;;N;;;;; +28E3;BRAILLE PATTERN DOTS-12678;So;0;ON;;;;;N;;;;; +28E4;BRAILLE PATTERN DOTS-3678;So;0;ON;;;;;N;;;;; +28E5;BRAILLE PATTERN DOTS-13678;So;0;ON;;;;;N;;;;; +28E6;BRAILLE PATTERN DOTS-23678;So;0;ON;;;;;N;;;;; +28E7;BRAILLE PATTERN DOTS-123678;So;0;ON;;;;;N;;;;; +28E8;BRAILLE PATTERN DOTS-4678;So;0;ON;;;;;N;;;;; +28E9;BRAILLE PATTERN DOTS-14678;So;0;ON;;;;;N;;;;; +28EA;BRAILLE PATTERN DOTS-24678;So;0;ON;;;;;N;;;;; +28EB;BRAILLE PATTERN DOTS-124678;So;0;ON;;;;;N;;;;; +28EC;BRAILLE PATTERN DOTS-34678;So;0;ON;;;;;N;;;;; +28ED;BRAILLE PATTERN DOTS-134678;So;0;ON;;;;;N;;;;; +28EE;BRAILLE PATTERN DOTS-234678;So;0;ON;;;;;N;;;;; +28EF;BRAILLE PATTERN DOTS-1234678;So;0;ON;;;;;N;;;;; +28F0;BRAILLE PATTERN DOTS-5678;So;0;ON;;;;;N;;;;; +28F1;BRAILLE PATTERN DOTS-15678;So;0;ON;;;;;N;;;;; +28F2;BRAILLE PATTERN DOTS-25678;So;0;ON;;;;;N;;;;; +28F3;BRAILLE PATTERN DOTS-125678;So;0;ON;;;;;N;;;;; +28F4;BRAILLE PATTERN DOTS-35678;So;0;ON;;;;;N;;;;; +28F5;BRAILLE PATTERN DOTS-135678;So;0;ON;;;;;N;;;;; +28F6;BRAILLE PATTERN DOTS-235678;So;0;ON;;;;;N;;;;; +28F7;BRAILLE PATTERN DOTS-1235678;So;0;ON;;;;;N;;;;; +28F8;BRAILLE PATTERN DOTS-45678;So;0;ON;;;;;N;;;;; +28F9;BRAILLE PATTERN DOTS-145678;So;0;ON;;;;;N;;;;; +28FA;BRAILLE PATTERN DOTS-245678;So;0;ON;;;;;N;;;;; +28FB;BRAILLE PATTERN DOTS-1245678;So;0;ON;;;;;N;;;;; +28FC;BRAILLE PATTERN DOTS-345678;So;0;ON;;;;;N;;;;; +28FD;BRAILLE PATTERN DOTS-1345678;So;0;ON;;;;;N;;;;; +28FE;BRAILLE PATTERN DOTS-2345678;So;0;ON;;;;;N;;;;; +28FF;BRAILLE PATTERN DOTS-12345678;So;0;ON;;;;;N;;;;; +2900;RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2901;RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2902;LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2903;RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2904;LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2905;RIGHTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2906;LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2907;RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2908;DOWNWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2909;UPWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +290A;UPWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;; +290B;DOWNWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;; +290C;LEFTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290D;RIGHTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290E;LEFTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290F;RIGHTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2910;RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2911;RIGHTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; +2912;UPWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;; +2913;DOWNWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;; +2914;RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2915;RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2916;RIGHTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; +2917;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2918;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2919;LEFTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291A;RIGHTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291B;LEFTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291C;RIGHTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291D;LEFTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +291E;RIGHTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +291F;LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +2920;RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +2921;NORTH WEST AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2922;NORTH EAST AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +2923;NORTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2924;NORTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2925;SOUTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2926;SOUTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2927;NORTH WEST ARROW AND NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2928;NORTH EAST ARROW AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2929;SOUTH EAST ARROW AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +292A;SOUTH WEST ARROW AND NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +292B;RISING DIAGONAL CROSSING FALLING DIAGONAL;Sm;0;ON;;;;;N;;;;; +292C;FALLING DIAGONAL CROSSING RISING DIAGONAL;Sm;0;ON;;;;;N;;;;; +292D;SOUTH EAST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +292E;NORTH EAST ARROW CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +292F;FALLING DIAGONAL CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2930;RISING DIAGONAL CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2931;NORTH EAST ARROW CROSSING NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +2932;NORTH WEST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2933;WAVE ARROW POINTING DIRECTLY RIGHT;Sm;0;ON;;;;;N;;;;; +2934;ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS;Sm;0;ON;;;;;N;;;;; +2935;ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS;Sm;0;ON;;;;;N;;;;; +2936;ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS;Sm;0;ON;;;;;N;;;;; +2937;ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS;Sm;0;ON;;;;;N;;;;; +2938;RIGHT-SIDE ARC CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +2939;LEFT-SIDE ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293A;TOP ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293B;BOTTOM ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293C;TOP ARC CLOCKWISE ARROW WITH MINUS;Sm;0;ON;;;;;N;;;;; +293D;TOP ARC ANTICLOCKWISE ARROW WITH PLUS;Sm;0;ON;;;;;N;;;;; +293E;LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293F;LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +2940;ANTICLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +2941;CLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +2942;RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2943;LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2944;SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2945;RIGHTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;; +2946;LEFTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;; +2947;RIGHTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; +2948;LEFT RIGHT ARROW THROUGH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +2949;UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +294A;LEFT BARB UP RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;; +294B;LEFT BARB DOWN RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;; +294C;UP BARB RIGHT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;; +294D;UP BARB LEFT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;; +294E;LEFT BARB UP RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;; +294F;UP BARB RIGHT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;; +2950;LEFT BARB DOWN RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;; +2951;UP BARB LEFT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;; +2952;LEFTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;; +2953;RIGHTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;; +2954;UPWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;; +2955;DOWNWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;; +2956;LEFTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;; +2957;RIGHTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;; +2958;UPWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;; +2959;DOWNWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;; +295A;LEFTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;; +295B;RIGHTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;; +295C;UPWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;; +295D;DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;; +295E;LEFTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;; +295F;RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;; +2960;UPWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;; +2961;DOWNWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;; +2962;LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2963;UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2964;RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2965;DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2966;LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;; +2967;LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2968;RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;; +2969;RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +296A;LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;; +296B;LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;; +296C;RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;; +296D;RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;; +296E;UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +296F;DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2970;RIGHT DOUBLE ARROW WITH ROUNDED HEAD;Sm;0;ON;;;;;N;;;;; +2971;EQUALS SIGN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2972;TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2973;LEFTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2974;RIGHTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2975;RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2976;LESS-THAN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2977;LEFTWARDS ARROW THROUGH LESS-THAN;Sm;0;ON;;;;;N;;;;; +2978;GREATER-THAN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2979;SUBSET ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +297A;LEFTWARDS ARROW THROUGH SUBSET;Sm;0;ON;;;;;N;;;;; +297B;SUPERSET ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +297C;LEFT FISH TAIL;Sm;0;ON;;;;;N;;;;; +297D;RIGHT FISH TAIL;Sm;0;ON;;;;;N;;;;; +297E;UP FISH TAIL;Sm;0;ON;;;;;N;;;;; +297F;DOWN FISH TAIL;Sm;0;ON;;;;;N;;;;; +2980;TRIPLE VERTICAL BAR DELIMITER;Sm;0;ON;;;;;N;;;;; +2981;Z NOTATION SPOT;Sm;0;ON;;;;;N;;;;; +2982;Z NOTATION TYPE COLON;Sm;0;ON;;;;;N;;;;; +2983;LEFT WHITE CURLY BRACKET;Ps;0;ON;;;;;Y;;;;; +2984;RIGHT WHITE CURLY BRACKET;Pe;0;ON;;;;;Y;;;;; +2985;LEFT WHITE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2986;RIGHT WHITE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2987;Z NOTATION LEFT IMAGE BRACKET;Ps;0;ON;;;;;Y;;;;; +2988;Z NOTATION RIGHT IMAGE BRACKET;Pe;0;ON;;;;;Y;;;;; +2989;Z NOTATION LEFT BINDING BRACKET;Ps;0;ON;;;;;Y;;;;; +298A;Z NOTATION RIGHT BINDING BRACKET;Pe;0;ON;;;;;Y;;;;; +298B;LEFT SQUARE BRACKET WITH UNDERBAR;Ps;0;ON;;;;;Y;;;;; +298C;RIGHT SQUARE BRACKET WITH UNDERBAR;Pe;0;ON;;;;;Y;;;;; +298D;LEFT SQUARE BRACKET WITH TICK IN TOP CORNER;Ps;0;ON;;;;;Y;;;;; +298E;RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Pe;0;ON;;;;;Y;;;;; +298F;LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Ps;0;ON;;;;;Y;;;;; +2990;RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER;Pe;0;ON;;;;;Y;;;;; +2991;LEFT ANGLE BRACKET WITH DOT;Ps;0;ON;;;;;Y;;;;; +2992;RIGHT ANGLE BRACKET WITH DOT;Pe;0;ON;;;;;Y;;;;; +2993;LEFT ARC LESS-THAN BRACKET;Ps;0;ON;;;;;Y;;;;; +2994;RIGHT ARC GREATER-THAN BRACKET;Pe;0;ON;;;;;Y;;;;; +2995;DOUBLE LEFT ARC GREATER-THAN BRACKET;Ps;0;ON;;;;;Y;;;;; +2996;DOUBLE RIGHT ARC LESS-THAN BRACKET;Pe;0;ON;;;;;Y;;;;; +2997;LEFT BLACK TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; +2998;RIGHT BLACK TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; +2999;DOTTED FENCE;Sm;0;ON;;;;;N;;;;; +299A;VERTICAL ZIGZAG LINE;Sm;0;ON;;;;;N;;;;; +299B;MEASURED ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;; +299C;RIGHT ANGLE VARIANT WITH SQUARE;Sm;0;ON;;;;;Y;;;;; +299D;MEASURED RIGHT ANGLE WITH DOT;Sm;0;ON;;;;;Y;;;;; +299E;ANGLE WITH S INSIDE;Sm;0;ON;;;;;Y;;;;; +299F;ACUTE ANGLE;Sm;0;ON;;;;;Y;;;;; +29A0;SPHERICAL ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;; +29A1;SPHERICAL ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;; +29A2;TURNED ANGLE;Sm;0;ON;;;;;Y;;;;; +29A3;REVERSED ANGLE;Sm;0;ON;;;;;Y;;;;; +29A4;ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +29A5;REVERSED ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +29A6;OBLIQUE ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;; +29A7;OBLIQUE ANGLE OPENING DOWN;Sm;0;ON;;;;;Y;;;;; +29A8;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT;Sm;0;ON;;;;;Y;;;;; +29A9;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT;Sm;0;ON;;;;;Y;;;;; +29AA;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT;Sm;0;ON;;;;;Y;;;;; +29AB;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT;Sm;0;ON;;;;;Y;;;;; +29AC;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP;Sm;0;ON;;;;;Y;;;;; +29AD;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP;Sm;0;ON;;;;;Y;;;;; +29AE;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN;Sm;0;ON;;;;;Y;;;;; +29AF;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN;Sm;0;ON;;;;;Y;;;;; +29B0;REVERSED EMPTY SET;Sm;0;ON;;;;;N;;;;; +29B1;EMPTY SET WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +29B2;EMPTY SET WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +29B3;EMPTY SET WITH RIGHT ARROW ABOVE;Sm;0;ON;;;;;N;;;;; +29B4;EMPTY SET WITH LEFT ARROW ABOVE;Sm;0;ON;;;;;N;;;;; +29B5;CIRCLE WITH HORIZONTAL BAR;Sm;0;ON;;;;;N;;;;; +29B6;CIRCLED VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29B7;CIRCLED PARALLEL;Sm;0;ON;;;;;N;;;;; +29B8;CIRCLED REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29B9;CIRCLED PERPENDICULAR;Sm;0;ON;;;;;N;;;;; +29BA;CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29BB;CIRCLE WITH SUPERIMPOSED X;Sm;0;ON;;;;;N;;;;; +29BC;CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +29BD;UP ARROW THROUGH CIRCLE;Sm;0;ON;;;;;N;;;;; +29BE;CIRCLED WHITE BULLET;Sm;0;ON;;;;;N;;;;; +29BF;CIRCLED BULLET;Sm;0;ON;;;;;N;;;;; +29C0;CIRCLED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +29C1;CIRCLED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +29C2;CIRCLE WITH SMALL CIRCLE TO THE RIGHT;Sm;0;ON;;;;;Y;;;;; +29C3;CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT;Sm;0;ON;;;;;Y;;;;; +29C4;SQUARED RISING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;; +29C5;SQUARED FALLING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;; +29C6;SQUARED ASTERISK;Sm;0;ON;;;;;N;;;;; +29C7;SQUARED SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +29C8;SQUARED SQUARE;Sm;0;ON;;;;;N;;;;; +29C9;TWO JOINED SQUARES;Sm;0;ON;;;;;Y;;;;; +29CA;TRIANGLE WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +29CB;TRIANGLE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +29CC;S IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +29CD;TRIANGLE WITH SERIFS AT BOTTOM;Sm;0;ON;;;;;N;;;;; +29CE;RIGHT TRIANGLE ABOVE LEFT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +29CF;LEFT TRIANGLE BESIDE VERTICAL BAR;Sm;0;ON;;;;;Y;;;;; +29D0;VERTICAL BAR BESIDE RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +29D1;BOWTIE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D2;BOWTIE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D3;BLACK BOWTIE;Sm;0;ON;;;;;N;;;;; +29D4;TIMES WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D5;TIMES WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D6;WHITE HOURGLASS;Sm;0;ON;;;;;N;;;;; +29D7;BLACK HOURGLASS;Sm;0;ON;;;;;N;;;;; +29D8;LEFT WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;; +29D9;RIGHT WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;; +29DA;LEFT DOUBLE WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;; +29DB;RIGHT DOUBLE WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;; +29DC;INCOMPLETE INFINITY;Sm;0;ON;;;;;Y;;;;; +29DD;TIE OVER INFINITY;Sm;0;ON;;;;;N;;;;; +29DE;INFINITY NEGATED WITH VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29DF;DOUBLE-ENDED MULTIMAP;Sm;0;ON;;;;;N;;;;; +29E0;SQUARE WITH CONTOURED OUTLINE;Sm;0;ON;;;;;N;;;;; +29E1;INCREASES AS;Sm;0;ON;;;;;Y;;;;; +29E2;SHUFFLE PRODUCT;Sm;0;ON;;;;;N;;;;; +29E3;EQUALS SIGN AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;; +29E4;EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;; +29E5;IDENTICAL TO AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;; +29E6;GLEICH STARK;Sm;0;ON;;;;;N;;;;; +29E7;THERMODYNAMIC;Sm;0;ON;;;;;N;;;;; +29E8;DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29E9;DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29EA;BLACK DIAMOND WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29EB;BLACK LOZENGE;Sm;0;ON;;;;;N;;;;; +29EC;WHITE CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29ED;BLACK CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29EE;ERROR-BARRED WHITE SQUARE;Sm;0;ON;;;;;N;;;;; +29EF;ERROR-BARRED BLACK SQUARE;Sm;0;ON;;;;;N;;;;; +29F0;ERROR-BARRED WHITE DIAMOND;Sm;0;ON;;;;;N;;;;; +29F1;ERROR-BARRED BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +29F2;ERROR-BARRED WHITE CIRCLE;Sm;0;ON;;;;;N;;;;; +29F3;ERROR-BARRED BLACK CIRCLE;Sm;0;ON;;;;;N;;;;; +29F4;RULE-DELAYED;Sm;0;ON;;;;;Y;;;;; +29F5;REVERSE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;; +29F6;SOLIDUS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +29F7;REVERSE SOLIDUS WITH HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +29F8;BIG SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29F9;BIG REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29FA;DOUBLE PLUS;Sm;0;ON;;;;;N;;;;; +29FB;TRIPLE PLUS;Sm;0;ON;;;;;N;;;;; +29FC;LEFT-POINTING CURVED ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +29FD;RIGHT-POINTING CURVED ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +29FE;TINY;Sm;0;ON;;;;;N;;;;; +29FF;MINY;Sm;0;ON;;;;;N;;;;; +2A00;N-ARY CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +2A01;N-ARY CIRCLED PLUS OPERATOR;Sm;0;ON;;;;;N;;;;; +2A02;N-ARY CIRCLED TIMES OPERATOR;Sm;0;ON;;;;;N;;;;; +2A03;N-ARY UNION OPERATOR WITH DOT;Sm;0;ON;;;;;N;;;;; +2A04;N-ARY UNION OPERATOR WITH PLUS;Sm;0;ON;;;;;N;;;;; +2A05;N-ARY SQUARE INTERSECTION OPERATOR;Sm;0;ON;;;;;N;;;;; +2A06;N-ARY SQUARE UNION OPERATOR;Sm;0;ON;;;;;N;;;;; +2A07;TWO LOGICAL AND OPERATOR;Sm;0;ON;;;;;N;;;;; +2A08;TWO LOGICAL OR OPERATOR;Sm;0;ON;;;;;N;;;;; +2A09;N-ARY TIMES OPERATOR;Sm;0;ON;;;;;N;;;;; +2A0A;MODULO TWO SUM;Sm;0;ON;;;;;Y;;;;; +2A0B;SUMMATION WITH INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2A0C;QUADRUPLE INTEGRAL OPERATOR;Sm;0;ON;<compat> 222B 222B 222B 222B;;;;Y;;;;; +2A0D;FINITE PART INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2A0E;INTEGRAL WITH DOUBLE STROKE;Sm;0;ON;;;;;Y;;;;; +2A0F;INTEGRAL AVERAGE WITH SLASH;Sm;0;ON;;;;;Y;;;;; +2A10;CIRCULATION FUNCTION;Sm;0;ON;;;;;Y;;;;; +2A11;ANTICLOCKWISE INTEGRATION;Sm;0;ON;;;;;Y;;;;; +2A12;LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;; +2A13;LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;; +2A14;LINE INTEGRATION NOT INCLUDING THE POLE;Sm;0;ON;;;;;Y;;;;; +2A15;INTEGRAL AROUND A POINT OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A16;QUATERNION INTEGRAL OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A17;INTEGRAL WITH LEFTWARDS ARROW WITH HOOK;Sm;0;ON;;;;;Y;;;;; +2A18;INTEGRAL WITH TIMES SIGN;Sm;0;ON;;;;;Y;;;;; +2A19;INTEGRAL WITH INTERSECTION;Sm;0;ON;;;;;Y;;;;; +2A1A;INTEGRAL WITH UNION;Sm;0;ON;;;;;Y;;;;; +2A1B;INTEGRAL WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +2A1C;INTEGRAL WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +2A1D;JOIN;Sm;0;ON;;;;;N;;;;; +2A1E;LARGE LEFT TRIANGLE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A1F;Z NOTATION SCHEMA COMPOSITION;Sm;0;ON;;;;;Y;;;;; +2A20;Z NOTATION SCHEMA PIPING;Sm;0;ON;;;;;Y;;;;; +2A21;Z NOTATION SCHEMA PROJECTION;Sm;0;ON;;;;;Y;;;;; +2A22;PLUS SIGN WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +2A23;PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE;Sm;0;ON;;;;;N;;;;; +2A24;PLUS SIGN WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;; +2A25;PLUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A26;PLUS SIGN WITH TILDE BELOW;Sm;0;ON;;;;;Y;;;;; +2A27;PLUS SIGN WITH SUBSCRIPT TWO;Sm;0;ON;;;;;N;;;;; +2A28;PLUS SIGN WITH BLACK TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A29;MINUS SIGN WITH COMMA ABOVE;Sm;0;ON;;;;;Y;;;;; +2A2A;MINUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A2B;MINUS SIGN WITH FALLING DOTS;Sm;0;ON;;;;;Y;;;;; +2A2C;MINUS SIGN WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;; +2A2D;PLUS SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A2E;PLUS SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A2F;VECTOR OR CROSS PRODUCT;Sm;0;ON;;;;;N;;;;; +2A30;MULTIPLICATION SIGN WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A31;MULTIPLICATION SIGN WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A32;SEMIDIRECT PRODUCT WITH BOTTOM CLOSED;Sm;0;ON;;;;;N;;;;; +2A33;SMASH PRODUCT;Sm;0;ON;;;;;N;;;;; +2A34;MULTIPLICATION SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A35;MULTIPLICATION SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A36;CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;N;;;;; +2A37;MULTIPLICATION SIGN IN DOUBLE CIRCLE;Sm;0;ON;;;;;N;;;;; +2A38;CIRCLED DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +2A39;PLUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3A;MINUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3B;MULTIPLICATION SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3C;INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;; +2A3D;RIGHTHAND INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;; +2A3E;Z NOTATION RELATIONAL COMPOSITION;Sm;0;ON;;;;;Y;;;;; +2A3F;AMALGAMATION OR COPRODUCT;Sm;0;ON;;;;;N;;;;; +2A40;INTERSECTION WITH DOT;Sm;0;ON;;;;;N;;;;; +2A41;UNION WITH MINUS SIGN;Sm;0;ON;;;;;N;;;;; +2A42;UNION WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2A43;INTERSECTION WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2A44;INTERSECTION WITH LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A45;UNION WITH LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A46;UNION ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A47;INTERSECTION ABOVE UNION;Sm;0;ON;;;;;N;;;;; +2A48;UNION ABOVE BAR ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A49;INTERSECTION ABOVE BAR ABOVE UNION;Sm;0;ON;;;;;N;;;;; +2A4A;UNION BESIDE AND JOINED WITH UNION;Sm;0;ON;;;;;N;;;;; +2A4B;INTERSECTION BESIDE AND JOINED WITH INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A4C;CLOSED UNION WITH SERIFS;Sm;0;ON;;;;;N;;;;; +2A4D;CLOSED INTERSECTION WITH SERIFS;Sm;0;ON;;;;;N;;;;; +2A4E;DOUBLE SQUARE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A4F;DOUBLE SQUARE UNION;Sm;0;ON;;;;;N;;;;; +2A50;CLOSED UNION WITH SERIFS AND SMASH PRODUCT;Sm;0;ON;;;;;N;;;;; +2A51;LOGICAL AND WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A52;LOGICAL OR WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A53;DOUBLE LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A54;DOUBLE LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A55;TWO INTERSECTING LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A56;TWO INTERSECTING LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A57;SLOPING LARGE OR;Sm;0;ON;;;;;Y;;;;; +2A58;SLOPING LARGE AND;Sm;0;ON;;;;;Y;;;;; +2A59;LOGICAL OR OVERLAPPING LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A5A;LOGICAL AND WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;; +2A5B;LOGICAL OR WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;; +2A5C;LOGICAL AND WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;; +2A5D;LOGICAL OR WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;; +2A5E;LOGICAL AND WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;; +2A5F;LOGICAL AND WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A60;LOGICAL AND WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A61;SMALL VEE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A62;LOGICAL OR WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;; +2A63;LOGICAL OR WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A64;Z NOTATION DOMAIN ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;; +2A65;Z NOTATION RANGE ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;; +2A66;EQUALS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A67;IDENTICAL WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A68;TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2A69;TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2A6A;TILDE OPERATOR WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A6B;TILDE OPERATOR WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;; +2A6C;SIMILAR MINUS SIMILAR;Sm;0;ON;;;;;Y;;;;; +2A6D;CONGRUENT WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A6E;EQUALS WITH ASTERISK;Sm;0;ON;;;;;N;;;;; +2A6F;ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;Y;;;;; +2A70;APPROXIMATELY EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A71;EQUALS SIGN ABOVE PLUS SIGN;Sm;0;ON;;;;;N;;;;; +2A72;PLUS SIGN ABOVE EQUALS SIGN;Sm;0;ON;;;;;N;;;;; +2A73;EQUALS SIGN ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A74;DOUBLE COLON EQUAL;Sm;0;ON;<compat> 003A 003A 003D;;;;Y;;;;; +2A75;TWO CONSECUTIVE EQUALS SIGNS;Sm;0;ON;<compat> 003D 003D;;;;N;;;;; +2A76;THREE CONSECUTIVE EQUALS SIGNS;Sm;0;ON;<compat> 003D 003D 003D;;;;N;;;;; +2A77;EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW;Sm;0;ON;;;;;N;;;;; +2A78;EQUIVALENT WITH FOUR DOTS ABOVE;Sm;0;ON;;;;;N;;;;; +2A79;LESS-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;; +2A7A;GREATER-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;; +2A7B;LESS-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;; +2A7C;GREATER-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;; +2A7D;LESS-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A7E;GREATER-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A7F;LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A80;GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A81;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A82;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A83;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT;Sm;0;ON;;;;;Y;;;;; +2A84;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT;Sm;0;ON;;;;;Y;;;;; +2A85;LESS-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A86;GREATER-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A87;LESS-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A88;GREATER-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A89;LESS-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A8A;GREATER-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A8B;LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A8C;GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A8D;LESS-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;; +2A8E;GREATER-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;; +2A8F;LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A90;GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A91;LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;; +2A92;GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;; +2A93;LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2A94;GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2A95;SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A96;SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A97;SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A98;SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A99;DOUBLE-LINE EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9A;DOUBLE-LINE EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9B;DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9C;DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9D;SIMILAR OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9E;SIMILAR OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9F;SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AA0;SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AA1;DOUBLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2AA2;DOUBLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2AA3;DOUBLE NESTED LESS-THAN WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +2AA4;GREATER-THAN OVERLAPPING LESS-THAN;Sm;0;ON;;;;;N;;;;; +2AA5;GREATER-THAN BESIDE LESS-THAN;Sm;0;ON;;;;;N;;;;; +2AA6;LESS-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;; +2AA7;GREATER-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;; +2AA8;LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2AA9;GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2AAA;SMALLER THAN;Sm;0;ON;;;;;Y;;;;; +2AAB;LARGER THAN;Sm;0;ON;;;;;Y;;;;; +2AAC;SMALLER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AAD;LARGER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AAE;EQUALS SIGN WITH BUMPY ABOVE;Sm;0;ON;;;;;N;;;;; +2AAF;PRECEDES ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB0;SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB1;PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB2;SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB3;PRECEDES ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB4;SUCCEEDS ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB5;PRECEDES ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB6;SUCCEEDS ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB7;PRECEDES ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB8;SUCCEEDS ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB9;PRECEDES ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ABA;SUCCEEDS ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ABB;DOUBLE PRECEDES;Sm;0;ON;;;;;Y;;;;; +2ABC;DOUBLE SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +2ABD;SUBSET WITH DOT;Sm;0;ON;;;;;Y;;;;; +2ABE;SUPERSET WITH DOT;Sm;0;ON;;;;;Y;;;;; +2ABF;SUBSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC0;SUPERSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC1;SUBSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC2;SUPERSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC3;SUBSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2AC4;SUPERSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2AC5;SUBSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AC6;SUPERSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AC7;SUBSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AC8;SUPERSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AC9;SUBSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACA;SUPERSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACB;SUBSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACC;SUPERSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACD;SQUARE LEFT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; +2ACE;SQUARE RIGHT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; +2ACF;CLOSED SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD0;CLOSED SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD1;CLOSED SUBSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AD2;CLOSED SUPERSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AD3;SUBSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD4;SUPERSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD5;SUBSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD6;SUPERSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD7;SUPERSET BESIDE SUBSET;Sm;0;ON;;;;;N;;;;; +2AD8;SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET;Sm;0;ON;;;;;N;;;;; +2AD9;ELEMENT OF OPENING DOWNWARDS;Sm;0;ON;;;;;N;;;;; +2ADA;PITCHFORK WITH TEE TOP;Sm;0;ON;;;;;N;;;;; +2ADB;TRANSVERSAL INTERSECTION;Sm;0;ON;;;;;N;;;;; +2ADC;FORKING;Sm;0;ON;2ADD 0338;;;;Y;;not independent;;; +2ADD;NONFORKING;Sm;0;ON;;;;;N;;independent;;; +2ADE;SHORT LEFT TACK;Sm;0;ON;;;;;Y;;;;; +2ADF;SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AE0;SHORT UP TACK;Sm;0;ON;;;;;N;;;;; +2AE1;PERPENDICULAR WITH S;Sm;0;ON;;;;;N;;;;; +2AE2;VERTICAL BAR TRIPLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE3;DOUBLE VERTICAL BAR LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE4;VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE5;DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE6;LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL;Sm;0;ON;;;;;Y;;;;; +2AE7;SHORT DOWN TACK WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2AE8;SHORT UP TACK WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2AE9;SHORT UP TACK ABOVE SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AEA;DOUBLE DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AEB;DOUBLE UP TACK;Sm;0;ON;;;;;N;;;;; +2AEC;DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;; +2AED;REVERSED DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;; +2AEE;DOES NOT DIVIDE WITH REVERSED NEGATION SLASH;Sm;0;ON;;;;;Y;;;;; +2AEF;VERTICAL LINE WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +2AF0;VERTICAL LINE WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;; +2AF1;DOWN TACK WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;; +2AF2;PARALLEL WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2AF3;PARALLEL WITH TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AF4;TRIPLE VERTICAL BAR BINARY RELATION;Sm;0;ON;;;;;N;;;;; +2AF5;TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2AF6;TRIPLE COLON OPERATOR;Sm;0;ON;;;;;N;;;;; +2AF7;TRIPLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2AF8;TRIPLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2AF9;DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AFA;DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AFB;TRIPLE SOLIDUS BINARY RELATION;Sm;0;ON;;;;;Y;;;;; +2AFC;LARGE TRIPLE VERTICAL BAR OPERATOR;Sm;0;ON;;;;;N;;;;; +2AFD;DOUBLE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AFE;WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +2AFF;N-ARY WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;; +2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;; +2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;; +2E83;CJK RADICAL SECOND TWO;So;0;ON;;;;;N;;;;; +2E84;CJK RADICAL SECOND THREE;So;0;ON;;;;;N;;;;; +2E85;CJK RADICAL PERSON;So;0;ON;;;;;N;;;;; +2E86;CJK RADICAL BOX;So;0;ON;;;;;N;;;;; +2E87;CJK RADICAL TABLE;So;0;ON;;;;;N;;;;; +2E88;CJK RADICAL KNIFE ONE;So;0;ON;;;;;N;;;;; +2E89;CJK RADICAL KNIFE TWO;So;0;ON;;;;;N;;;;; +2E8A;CJK RADICAL DIVINATION;So;0;ON;;;;;N;;;;; +2E8B;CJK RADICAL SEAL;So;0;ON;;;;;N;;;;; +2E8C;CJK RADICAL SMALL ONE;So;0;ON;;;;;N;;;;; +2E8D;CJK RADICAL SMALL TWO;So;0;ON;;;;;N;;;;; +2E8E;CJK RADICAL LAME ONE;So;0;ON;;;;;N;;;;; +2E8F;CJK RADICAL LAME TWO;So;0;ON;;;;;N;;;;; +2E90;CJK RADICAL LAME THREE;So;0;ON;;;;;N;;;;; +2E91;CJK RADICAL LAME FOUR;So;0;ON;;;;;N;;;;; +2E92;CJK RADICAL SNAKE;So;0;ON;;;;;N;;;;; +2E93;CJK RADICAL THREAD;So;0;ON;;;;;N;;;;; +2E94;CJK RADICAL SNOUT ONE;So;0;ON;;;;;N;;;;; +2E95;CJK RADICAL SNOUT TWO;So;0;ON;;;;;N;;;;; +2E96;CJK RADICAL HEART ONE;So;0;ON;;;;;N;;;;; +2E97;CJK RADICAL HEART TWO;So;0;ON;;;;;N;;;;; +2E98;CJK RADICAL HAND;So;0;ON;;;;;N;;;;; +2E99;CJK RADICAL RAP;So;0;ON;;;;;N;;;;; +2E9B;CJK RADICAL CHOKE;So;0;ON;;;;;N;;;;; +2E9C;CJK RADICAL SUN;So;0;ON;;;;;N;;;;; +2E9D;CJK RADICAL MOON;So;0;ON;;;;;N;;;;; +2E9E;CJK RADICAL DEATH;So;0;ON;;;;;N;;;;; +2E9F;CJK RADICAL MOTHER;So;0;ON;<compat> 6BCD;;;;N;;;;; +2EA0;CJK RADICAL CIVILIAN;So;0;ON;;;;;N;;;;; +2EA1;CJK RADICAL WATER ONE;So;0;ON;;;;;N;;;;; +2EA2;CJK RADICAL WATER TWO;So;0;ON;;;;;N;;;;; +2EA3;CJK RADICAL FIRE;So;0;ON;;;;;N;;;;; +2EA4;CJK RADICAL PAW ONE;So;0;ON;;;;;N;;;;; +2EA5;CJK RADICAL PAW TWO;So;0;ON;;;;;N;;;;; +2EA6;CJK RADICAL SIMPLIFIED HALF TREE TRUNK;So;0;ON;;;;;N;;;;; +2EA7;CJK RADICAL COW;So;0;ON;;;;;N;;;;; +2EA8;CJK RADICAL DOG;So;0;ON;;;;;N;;;;; +2EA9;CJK RADICAL JADE;So;0;ON;;;;;N;;;;; +2EAA;CJK RADICAL BOLT OF CLOTH;So;0;ON;;;;;N;;;;; +2EAB;CJK RADICAL EYE;So;0;ON;;;;;N;;;;; +2EAC;CJK RADICAL SPIRIT ONE;So;0;ON;;;;;N;;;;; +2EAD;CJK RADICAL SPIRIT TWO;So;0;ON;;;;;N;;;;; +2EAE;CJK RADICAL BAMBOO;So;0;ON;;;;;N;;;;; +2EAF;CJK RADICAL SILK;So;0;ON;;;;;N;;;;; +2EB0;CJK RADICAL C-SIMPLIFIED SILK;So;0;ON;;;;;N;;;;; +2EB1;CJK RADICAL NET ONE;So;0;ON;;;;;N;;;;; +2EB2;CJK RADICAL NET TWO;So;0;ON;;;;;N;;;;; +2EB3;CJK RADICAL NET THREE;So;0;ON;;;;;N;;;;; +2EB4;CJK RADICAL NET FOUR;So;0;ON;;;;;N;;;;; +2EB5;CJK RADICAL MESH;So;0;ON;;;;;N;;;;; +2EB6;CJK RADICAL SHEEP;So;0;ON;;;;;N;;;;; +2EB7;CJK RADICAL RAM;So;0;ON;;;;;N;;;;; +2EB8;CJK RADICAL EWE;So;0;ON;;;;;N;;;;; +2EB9;CJK RADICAL OLD;So;0;ON;;;;;N;;;;; +2EBA;CJK RADICAL BRUSH ONE;So;0;ON;;;;;N;;;;; +2EBB;CJK RADICAL BRUSH TWO;So;0;ON;;;;;N;;;;; +2EBC;CJK RADICAL MEAT;So;0;ON;;;;;N;;;;; +2EBD;CJK RADICAL MORTAR;So;0;ON;;;;;N;;;;; +2EBE;CJK RADICAL GRASS ONE;So;0;ON;;;;;N;;;;; +2EBF;CJK RADICAL GRASS TWO;So;0;ON;;;;;N;;;;; +2EC0;CJK RADICAL GRASS THREE;So;0;ON;;;;;N;;;;; +2EC1;CJK RADICAL TIGER;So;0;ON;;;;;N;;;;; +2EC2;CJK RADICAL CLOTHES;So;0;ON;;;;;N;;;;; +2EC3;CJK RADICAL WEST ONE;So;0;ON;;;;;N;;;;; +2EC4;CJK RADICAL WEST TWO;So;0;ON;;;;;N;;;;; +2EC5;CJK RADICAL C-SIMPLIFIED SEE;So;0;ON;;;;;N;;;;; +2EC6;CJK RADICAL SIMPLIFIED HORN;So;0;ON;;;;;N;;;;; +2EC7;CJK RADICAL HORN;So;0;ON;;;;;N;;;;; +2EC8;CJK RADICAL C-SIMPLIFIED SPEECH;So;0;ON;;;;;N;;;;; +2EC9;CJK RADICAL C-SIMPLIFIED SHELL;So;0;ON;;;;;N;;;;; +2ECA;CJK RADICAL FOOT;So;0;ON;;;;;N;;;;; +2ECB;CJK RADICAL C-SIMPLIFIED CART;So;0;ON;;;;;N;;;;; +2ECC;CJK RADICAL SIMPLIFIED WALK;So;0;ON;;;;;N;;;;; +2ECD;CJK RADICAL WALK ONE;So;0;ON;;;;;N;;;;; +2ECE;CJK RADICAL WALK TWO;So;0;ON;;;;;N;;;;; +2ECF;CJK RADICAL CITY;So;0;ON;;;;;N;;;;; +2ED0;CJK RADICAL C-SIMPLIFIED GOLD;So;0;ON;;;;;N;;;;; +2ED1;CJK RADICAL LONG ONE;So;0;ON;;;;;N;;;;; +2ED2;CJK RADICAL LONG TWO;So;0;ON;;;;;N;;;;; +2ED3;CJK RADICAL C-SIMPLIFIED LONG;So;0;ON;;;;;N;;;;; +2ED4;CJK RADICAL C-SIMPLIFIED GATE;So;0;ON;;;;;N;;;;; +2ED5;CJK RADICAL MOUND ONE;So;0;ON;;;;;N;;;;; +2ED6;CJK RADICAL MOUND TWO;So;0;ON;;;;;N;;;;; +2ED7;CJK RADICAL RAIN;So;0;ON;;;;;N;;;;; +2ED8;CJK RADICAL BLUE;So;0;ON;;;;;N;;;;; +2ED9;CJK RADICAL C-SIMPLIFIED TANNED LEATHER;So;0;ON;;;;;N;;;;; +2EDA;CJK RADICAL C-SIMPLIFIED LEAF;So;0;ON;;;;;N;;;;; +2EDB;CJK RADICAL C-SIMPLIFIED WIND;So;0;ON;;;;;N;;;;; +2EDC;CJK RADICAL C-SIMPLIFIED FLY;So;0;ON;;;;;N;;;;; +2EDD;CJK RADICAL EAT ONE;So;0;ON;;;;;N;;;;; +2EDE;CJK RADICAL EAT TWO;So;0;ON;;;;;N;;;;; +2EDF;CJK RADICAL EAT THREE;So;0;ON;;;;;N;;;;; +2EE0;CJK RADICAL C-SIMPLIFIED EAT;So;0;ON;;;;;N;;;;; +2EE1;CJK RADICAL HEAD;So;0;ON;;;;;N;;;;; +2EE2;CJK RADICAL C-SIMPLIFIED HORSE;So;0;ON;;;;;N;;;;; +2EE3;CJK RADICAL BONE;So;0;ON;;;;;N;;;;; +2EE4;CJK RADICAL GHOST;So;0;ON;;;;;N;;;;; +2EE5;CJK RADICAL C-SIMPLIFIED FISH;So;0;ON;;;;;N;;;;; +2EE6;CJK RADICAL C-SIMPLIFIED BIRD;So;0;ON;;;;;N;;;;; +2EE7;CJK RADICAL C-SIMPLIFIED SALT;So;0;ON;;;;;N;;;;; +2EE8;CJK RADICAL SIMPLIFIED WHEAT;So;0;ON;;;;;N;;;;; +2EE9;CJK RADICAL SIMPLIFIED YELLOW;So;0;ON;;;;;N;;;;; +2EEA;CJK RADICAL C-SIMPLIFIED FROG;So;0;ON;;;;;N;;;;; +2EEB;CJK RADICAL J-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; +2EEC;CJK RADICAL C-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; +2EED;CJK RADICAL J-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; +2EEE;CJK RADICAL C-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; +2EEF;CJK RADICAL J-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; +2EF0;CJK RADICAL C-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; +2EF1;CJK RADICAL TURTLE;So;0;ON;;;;;N;;;;; +2EF2;CJK RADICAL J-SIMPLIFIED TURTLE;So;0;ON;;;;;N;;;;; +2EF3;CJK RADICAL C-SIMPLIFIED TURTLE;So;0;ON;<compat> 9F9F;;;;N;;;;; +2F00;KANGXI RADICAL ONE;So;0;ON;<compat> 4E00;;;;N;;;;; +2F01;KANGXI RADICAL LINE;So;0;ON;<compat> 4E28;;;;N;;;;; +2F02;KANGXI RADICAL DOT;So;0;ON;<compat> 4E36;;;;N;;;;; +2F03;KANGXI RADICAL SLASH;So;0;ON;<compat> 4E3F;;;;N;;;;; +2F04;KANGXI RADICAL SECOND;So;0;ON;<compat> 4E59;;;;N;;;;; +2F05;KANGXI RADICAL HOOK;So;0;ON;<compat> 4E85;;;;N;;;;; +2F06;KANGXI RADICAL TWO;So;0;ON;<compat> 4E8C;;;;N;;;;; +2F07;KANGXI RADICAL LID;So;0;ON;<compat> 4EA0;;;;N;;;;; +2F08;KANGXI RADICAL MAN;So;0;ON;<compat> 4EBA;;;;N;;;;; +2F09;KANGXI RADICAL LEGS;So;0;ON;<compat> 513F;;;;N;;;;; +2F0A;KANGXI RADICAL ENTER;So;0;ON;<compat> 5165;;;;N;;;;; +2F0B;KANGXI RADICAL EIGHT;So;0;ON;<compat> 516B;;;;N;;;;; +2F0C;KANGXI RADICAL DOWN BOX;So;0;ON;<compat> 5182;;;;N;;;;; +2F0D;KANGXI RADICAL COVER;So;0;ON;<compat> 5196;;;;N;;;;; +2F0E;KANGXI RADICAL ICE;So;0;ON;<compat> 51AB;;;;N;;;;; +2F0F;KANGXI RADICAL TABLE;So;0;ON;<compat> 51E0;;;;N;;;;; +2F10;KANGXI RADICAL OPEN BOX;So;0;ON;<compat> 51F5;;;;N;;;;; +2F11;KANGXI RADICAL KNIFE;So;0;ON;<compat> 5200;;;;N;;;;; +2F12;KANGXI RADICAL POWER;So;0;ON;<compat> 529B;;;;N;;;;; +2F13;KANGXI RADICAL WRAP;So;0;ON;<compat> 52F9;;;;N;;;;; +2F14;KANGXI RADICAL SPOON;So;0;ON;<compat> 5315;;;;N;;;;; +2F15;KANGXI RADICAL RIGHT OPEN BOX;So;0;ON;<compat> 531A;;;;N;;;;; +2F16;KANGXI RADICAL HIDING ENCLOSURE;So;0;ON;<compat> 5338;;;;N;;;;; +2F17;KANGXI RADICAL TEN;So;0;ON;<compat> 5341;;;;N;;;;; +2F18;KANGXI RADICAL DIVINATION;So;0;ON;<compat> 535C;;;;N;;;;; +2F19;KANGXI RADICAL SEAL;So;0;ON;<compat> 5369;;;;N;;;;; +2F1A;KANGXI RADICAL CLIFF;So;0;ON;<compat> 5382;;;;N;;;;; +2F1B;KANGXI RADICAL PRIVATE;So;0;ON;<compat> 53B6;;;;N;;;;; +2F1C;KANGXI RADICAL AGAIN;So;0;ON;<compat> 53C8;;;;N;;;;; +2F1D;KANGXI RADICAL MOUTH;So;0;ON;<compat> 53E3;;;;N;;;;; +2F1E;KANGXI RADICAL ENCLOSURE;So;0;ON;<compat> 56D7;;;;N;;;;; +2F1F;KANGXI RADICAL EARTH;So;0;ON;<compat> 571F;;;;N;;;;; +2F20;KANGXI RADICAL SCHOLAR;So;0;ON;<compat> 58EB;;;;N;;;;; +2F21;KANGXI RADICAL GO;So;0;ON;<compat> 5902;;;;N;;;;; +2F22;KANGXI RADICAL GO SLOWLY;So;0;ON;<compat> 590A;;;;N;;;;; +2F23;KANGXI RADICAL EVENING;So;0;ON;<compat> 5915;;;;N;;;;; +2F24;KANGXI RADICAL BIG;So;0;ON;<compat> 5927;;;;N;;;;; +2F25;KANGXI RADICAL WOMAN;So;0;ON;<compat> 5973;;;;N;;;;; +2F26;KANGXI RADICAL CHILD;So;0;ON;<compat> 5B50;;;;N;;;;; +2F27;KANGXI RADICAL ROOF;So;0;ON;<compat> 5B80;;;;N;;;;; +2F28;KANGXI RADICAL INCH;So;0;ON;<compat> 5BF8;;;;N;;;;; +2F29;KANGXI RADICAL SMALL;So;0;ON;<compat> 5C0F;;;;N;;;;; +2F2A;KANGXI RADICAL LAME;So;0;ON;<compat> 5C22;;;;N;;;;; +2F2B;KANGXI RADICAL CORPSE;So;0;ON;<compat> 5C38;;;;N;;;;; +2F2C;KANGXI RADICAL SPROUT;So;0;ON;<compat> 5C6E;;;;N;;;;; +2F2D;KANGXI RADICAL MOUNTAIN;So;0;ON;<compat> 5C71;;;;N;;;;; +2F2E;KANGXI RADICAL RIVER;So;0;ON;<compat> 5DDB;;;;N;;;;; +2F2F;KANGXI RADICAL WORK;So;0;ON;<compat> 5DE5;;;;N;;;;; +2F30;KANGXI RADICAL ONESELF;So;0;ON;<compat> 5DF1;;;;N;;;;; +2F31;KANGXI RADICAL TURBAN;So;0;ON;<compat> 5DFE;;;;N;;;;; +2F32;KANGXI RADICAL DRY;So;0;ON;<compat> 5E72;;;;N;;;;; +2F33;KANGXI RADICAL SHORT THREAD;So;0;ON;<compat> 5E7A;;;;N;;;;; +2F34;KANGXI RADICAL DOTTED CLIFF;So;0;ON;<compat> 5E7F;;;;N;;;;; +2F35;KANGXI RADICAL LONG STRIDE;So;0;ON;<compat> 5EF4;;;;N;;;;; +2F36;KANGXI RADICAL TWO HANDS;So;0;ON;<compat> 5EFE;;;;N;;;;; +2F37;KANGXI RADICAL SHOOT;So;0;ON;<compat> 5F0B;;;;N;;;;; +2F38;KANGXI RADICAL BOW;So;0;ON;<compat> 5F13;;;;N;;;;; +2F39;KANGXI RADICAL SNOUT;So;0;ON;<compat> 5F50;;;;N;;;;; +2F3A;KANGXI RADICAL BRISTLE;So;0;ON;<compat> 5F61;;;;N;;;;; +2F3B;KANGXI RADICAL STEP;So;0;ON;<compat> 5F73;;;;N;;;;; +2F3C;KANGXI RADICAL HEART;So;0;ON;<compat> 5FC3;;;;N;;;;; +2F3D;KANGXI RADICAL HALBERD;So;0;ON;<compat> 6208;;;;N;;;;; +2F3E;KANGXI RADICAL DOOR;So;0;ON;<compat> 6236;;;;N;;;;; +2F3F;KANGXI RADICAL HAND;So;0;ON;<compat> 624B;;;;N;;;;; +2F40;KANGXI RADICAL BRANCH;So;0;ON;<compat> 652F;;;;N;;;;; +2F41;KANGXI RADICAL RAP;So;0;ON;<compat> 6534;;;;N;;;;; +2F42;KANGXI RADICAL SCRIPT;So;0;ON;<compat> 6587;;;;N;;;;; +2F43;KANGXI RADICAL DIPPER;So;0;ON;<compat> 6597;;;;N;;;;; +2F44;KANGXI RADICAL AXE;So;0;ON;<compat> 65A4;;;;N;;;;; +2F45;KANGXI RADICAL SQUARE;So;0;ON;<compat> 65B9;;;;N;;;;; +2F46;KANGXI RADICAL NOT;So;0;ON;<compat> 65E0;;;;N;;;;; +2F47;KANGXI RADICAL SUN;So;0;ON;<compat> 65E5;;;;N;;;;; +2F48;KANGXI RADICAL SAY;So;0;ON;<compat> 66F0;;;;N;;;;; +2F49;KANGXI RADICAL MOON;So;0;ON;<compat> 6708;;;;N;;;;; +2F4A;KANGXI RADICAL TREE;So;0;ON;<compat> 6728;;;;N;;;;; +2F4B;KANGXI RADICAL LACK;So;0;ON;<compat> 6B20;;;;N;;;;; +2F4C;KANGXI RADICAL STOP;So;0;ON;<compat> 6B62;;;;N;;;;; +2F4D;KANGXI RADICAL DEATH;So;0;ON;<compat> 6B79;;;;N;;;;; +2F4E;KANGXI RADICAL WEAPON;So;0;ON;<compat> 6BB3;;;;N;;;;; +2F4F;KANGXI RADICAL DO NOT;So;0;ON;<compat> 6BCB;;;;N;;;;; +2F50;KANGXI RADICAL COMPARE;So;0;ON;<compat> 6BD4;;;;N;;;;; +2F51;KANGXI RADICAL FUR;So;0;ON;<compat> 6BDB;;;;N;;;;; +2F52;KANGXI RADICAL CLAN;So;0;ON;<compat> 6C0F;;;;N;;;;; +2F53;KANGXI RADICAL STEAM;So;0;ON;<compat> 6C14;;;;N;;;;; +2F54;KANGXI RADICAL WATER;So;0;ON;<compat> 6C34;;;;N;;;;; +2F55;KANGXI RADICAL FIRE;So;0;ON;<compat> 706B;;;;N;;;;; +2F56;KANGXI RADICAL CLAW;So;0;ON;<compat> 722A;;;;N;;;;; +2F57;KANGXI RADICAL FATHER;So;0;ON;<compat> 7236;;;;N;;;;; +2F58;KANGXI RADICAL DOUBLE X;So;0;ON;<compat> 723B;;;;N;;;;; +2F59;KANGXI RADICAL HALF TREE TRUNK;So;0;ON;<compat> 723F;;;;N;;;;; +2F5A;KANGXI RADICAL SLICE;So;0;ON;<compat> 7247;;;;N;;;;; +2F5B;KANGXI RADICAL FANG;So;0;ON;<compat> 7259;;;;N;;;;; +2F5C;KANGXI RADICAL COW;So;0;ON;<compat> 725B;;;;N;;;;; +2F5D;KANGXI RADICAL DOG;So;0;ON;<compat> 72AC;;;;N;;;;; +2F5E;KANGXI RADICAL PROFOUND;So;0;ON;<compat> 7384;;;;N;;;;; +2F5F;KANGXI RADICAL JADE;So;0;ON;<compat> 7389;;;;N;;;;; +2F60;KANGXI RADICAL MELON;So;0;ON;<compat> 74DC;;;;N;;;;; +2F61;KANGXI RADICAL TILE;So;0;ON;<compat> 74E6;;;;N;;;;; +2F62;KANGXI RADICAL SWEET;So;0;ON;<compat> 7518;;;;N;;;;; +2F63;KANGXI RADICAL LIFE;So;0;ON;<compat> 751F;;;;N;;;;; +2F64;KANGXI RADICAL USE;So;0;ON;<compat> 7528;;;;N;;;;; +2F65;KANGXI RADICAL FIELD;So;0;ON;<compat> 7530;;;;N;;;;; +2F66;KANGXI RADICAL BOLT OF CLOTH;So;0;ON;<compat> 758B;;;;N;;;;; +2F67;KANGXI RADICAL SICKNESS;So;0;ON;<compat> 7592;;;;N;;;;; +2F68;KANGXI RADICAL DOTTED TENT;So;0;ON;<compat> 7676;;;;N;;;;; +2F69;KANGXI RADICAL WHITE;So;0;ON;<compat> 767D;;;;N;;;;; +2F6A;KANGXI RADICAL SKIN;So;0;ON;<compat> 76AE;;;;N;;;;; +2F6B;KANGXI RADICAL DISH;So;0;ON;<compat> 76BF;;;;N;;;;; +2F6C;KANGXI RADICAL EYE;So;0;ON;<compat> 76EE;;;;N;;;;; +2F6D;KANGXI RADICAL SPEAR;So;0;ON;<compat> 77DB;;;;N;;;;; +2F6E;KANGXI RADICAL ARROW;So;0;ON;<compat> 77E2;;;;N;;;;; +2F6F;KANGXI RADICAL STONE;So;0;ON;<compat> 77F3;;;;N;;;;; +2F70;KANGXI RADICAL SPIRIT;So;0;ON;<compat> 793A;;;;N;;;;; +2F71;KANGXI RADICAL TRACK;So;0;ON;<compat> 79B8;;;;N;;;;; +2F72;KANGXI RADICAL GRAIN;So;0;ON;<compat> 79BE;;;;N;;;;; +2F73;KANGXI RADICAL CAVE;So;0;ON;<compat> 7A74;;;;N;;;;; +2F74;KANGXI RADICAL STAND;So;0;ON;<compat> 7ACB;;;;N;;;;; +2F75;KANGXI RADICAL BAMBOO;So;0;ON;<compat> 7AF9;;;;N;;;;; +2F76;KANGXI RADICAL RICE;So;0;ON;<compat> 7C73;;;;N;;;;; +2F77;KANGXI RADICAL SILK;So;0;ON;<compat> 7CF8;;;;N;;;;; +2F78;KANGXI RADICAL JAR;So;0;ON;<compat> 7F36;;;;N;;;;; +2F79;KANGXI RADICAL NET;So;0;ON;<compat> 7F51;;;;N;;;;; +2F7A;KANGXI RADICAL SHEEP;So;0;ON;<compat> 7F8A;;;;N;;;;; +2F7B;KANGXI RADICAL FEATHER;So;0;ON;<compat> 7FBD;;;;N;;;;; +2F7C;KANGXI RADICAL OLD;So;0;ON;<compat> 8001;;;;N;;;;; +2F7D;KANGXI RADICAL AND;So;0;ON;<compat> 800C;;;;N;;;;; +2F7E;KANGXI RADICAL PLOW;So;0;ON;<compat> 8012;;;;N;;;;; +2F7F;KANGXI RADICAL EAR;So;0;ON;<compat> 8033;;;;N;;;;; +2F80;KANGXI RADICAL BRUSH;So;0;ON;<compat> 807F;;;;N;;;;; +2F81;KANGXI RADICAL MEAT;So;0;ON;<compat> 8089;;;;N;;;;; +2F82;KANGXI RADICAL MINISTER;So;0;ON;<compat> 81E3;;;;N;;;;; +2F83;KANGXI RADICAL SELF;So;0;ON;<compat> 81EA;;;;N;;;;; +2F84;KANGXI RADICAL ARRIVE;So;0;ON;<compat> 81F3;;;;N;;;;; +2F85;KANGXI RADICAL MORTAR;So;0;ON;<compat> 81FC;;;;N;;;;; +2F86;KANGXI RADICAL TONGUE;So;0;ON;<compat> 820C;;;;N;;;;; +2F87;KANGXI RADICAL OPPOSE;So;0;ON;<compat> 821B;;;;N;;;;; +2F88;KANGXI RADICAL BOAT;So;0;ON;<compat> 821F;;;;N;;;;; +2F89;KANGXI RADICAL STOPPING;So;0;ON;<compat> 826E;;;;N;;;;; +2F8A;KANGXI RADICAL COLOR;So;0;ON;<compat> 8272;;;;N;;;;; +2F8B;KANGXI RADICAL GRASS;So;0;ON;<compat> 8278;;;;N;;;;; +2F8C;KANGXI RADICAL TIGER;So;0;ON;<compat> 864D;;;;N;;;;; +2F8D;KANGXI RADICAL INSECT;So;0;ON;<compat> 866B;;;;N;;;;; +2F8E;KANGXI RADICAL BLOOD;So;0;ON;<compat> 8840;;;;N;;;;; +2F8F;KANGXI RADICAL WALK ENCLOSURE;So;0;ON;<compat> 884C;;;;N;;;;; +2F90;KANGXI RADICAL CLOTHES;So;0;ON;<compat> 8863;;;;N;;;;; +2F91;KANGXI RADICAL WEST;So;0;ON;<compat> 897E;;;;N;;;;; +2F92;KANGXI RADICAL SEE;So;0;ON;<compat> 898B;;;;N;;;;; +2F93;KANGXI RADICAL HORN;So;0;ON;<compat> 89D2;;;;N;;;;; +2F94;KANGXI RADICAL SPEECH;So;0;ON;<compat> 8A00;;;;N;;;;; +2F95;KANGXI RADICAL VALLEY;So;0;ON;<compat> 8C37;;;;N;;;;; +2F96;KANGXI RADICAL BEAN;So;0;ON;<compat> 8C46;;;;N;;;;; +2F97;KANGXI RADICAL PIG;So;0;ON;<compat> 8C55;;;;N;;;;; +2F98;KANGXI RADICAL BADGER;So;0;ON;<compat> 8C78;;;;N;;;;; +2F99;KANGXI RADICAL SHELL;So;0;ON;<compat> 8C9D;;;;N;;;;; +2F9A;KANGXI RADICAL RED;So;0;ON;<compat> 8D64;;;;N;;;;; +2F9B;KANGXI RADICAL RUN;So;0;ON;<compat> 8D70;;;;N;;;;; +2F9C;KANGXI RADICAL FOOT;So;0;ON;<compat> 8DB3;;;;N;;;;; +2F9D;KANGXI RADICAL BODY;So;0;ON;<compat> 8EAB;;;;N;;;;; +2F9E;KANGXI RADICAL CART;So;0;ON;<compat> 8ECA;;;;N;;;;; +2F9F;KANGXI RADICAL BITTER;So;0;ON;<compat> 8F9B;;;;N;;;;; +2FA0;KANGXI RADICAL MORNING;So;0;ON;<compat> 8FB0;;;;N;;;;; +2FA1;KANGXI RADICAL WALK;So;0;ON;<compat> 8FB5;;;;N;;;;; +2FA2;KANGXI RADICAL CITY;So;0;ON;<compat> 9091;;;;N;;;;; +2FA3;KANGXI RADICAL WINE;So;0;ON;<compat> 9149;;;;N;;;;; +2FA4;KANGXI RADICAL DISTINGUISH;So;0;ON;<compat> 91C6;;;;N;;;;; +2FA5;KANGXI RADICAL VILLAGE;So;0;ON;<compat> 91CC;;;;N;;;;; +2FA6;KANGXI RADICAL GOLD;So;0;ON;<compat> 91D1;;;;N;;;;; +2FA7;KANGXI RADICAL LONG;So;0;ON;<compat> 9577;;;;N;;;;; +2FA8;KANGXI RADICAL GATE;So;0;ON;<compat> 9580;;;;N;;;;; +2FA9;KANGXI RADICAL MOUND;So;0;ON;<compat> 961C;;;;N;;;;; +2FAA;KANGXI RADICAL SLAVE;So;0;ON;<compat> 96B6;;;;N;;;;; +2FAB;KANGXI RADICAL SHORT TAILED BIRD;So;0;ON;<compat> 96B9;;;;N;;;;; +2FAC;KANGXI RADICAL RAIN;So;0;ON;<compat> 96E8;;;;N;;;;; +2FAD;KANGXI RADICAL BLUE;So;0;ON;<compat> 9751;;;;N;;;;; +2FAE;KANGXI RADICAL WRONG;So;0;ON;<compat> 975E;;;;N;;;;; +2FAF;KANGXI RADICAL FACE;So;0;ON;<compat> 9762;;;;N;;;;; +2FB0;KANGXI RADICAL LEATHER;So;0;ON;<compat> 9769;;;;N;;;;; +2FB1;KANGXI RADICAL TANNED LEATHER;So;0;ON;<compat> 97CB;;;;N;;;;; +2FB2;KANGXI RADICAL LEEK;So;0;ON;<compat> 97ED;;;;N;;;;; +2FB3;KANGXI RADICAL SOUND;So;0;ON;<compat> 97F3;;;;N;;;;; +2FB4;KANGXI RADICAL LEAF;So;0;ON;<compat> 9801;;;;N;;;;; +2FB5;KANGXI RADICAL WIND;So;0;ON;<compat> 98A8;;;;N;;;;; +2FB6;KANGXI RADICAL FLY;So;0;ON;<compat> 98DB;;;;N;;;;; +2FB7;KANGXI RADICAL EAT;So;0;ON;<compat> 98DF;;;;N;;;;; +2FB8;KANGXI RADICAL HEAD;So;0;ON;<compat> 9996;;;;N;;;;; +2FB9;KANGXI RADICAL FRAGRANT;So;0;ON;<compat> 9999;;;;N;;;;; +2FBA;KANGXI RADICAL HORSE;So;0;ON;<compat> 99AC;;;;N;;;;; +2FBB;KANGXI RADICAL BONE;So;0;ON;<compat> 9AA8;;;;N;;;;; +2FBC;KANGXI RADICAL TALL;So;0;ON;<compat> 9AD8;;;;N;;;;; +2FBD;KANGXI RADICAL HAIR;So;0;ON;<compat> 9ADF;;;;N;;;;; +2FBE;KANGXI RADICAL FIGHT;So;0;ON;<compat> 9B25;;;;N;;;;; +2FBF;KANGXI RADICAL SACRIFICIAL WINE;So;0;ON;<compat> 9B2F;;;;N;;;;; +2FC0;KANGXI RADICAL CAULDRON;So;0;ON;<compat> 9B32;;;;N;;;;; +2FC1;KANGXI RADICAL GHOST;So;0;ON;<compat> 9B3C;;;;N;;;;; +2FC2;KANGXI RADICAL FISH;So;0;ON;<compat> 9B5A;;;;N;;;;; +2FC3;KANGXI RADICAL BIRD;So;0;ON;<compat> 9CE5;;;;N;;;;; +2FC4;KANGXI RADICAL SALT;So;0;ON;<compat> 9E75;;;;N;;;;; +2FC5;KANGXI RADICAL DEER;So;0;ON;<compat> 9E7F;;;;N;;;;; +2FC6;KANGXI RADICAL WHEAT;So;0;ON;<compat> 9EA5;;;;N;;;;; +2FC7;KANGXI RADICAL HEMP;So;0;ON;<compat> 9EBB;;;;N;;;;; +2FC8;KANGXI RADICAL YELLOW;So;0;ON;<compat> 9EC3;;;;N;;;;; +2FC9;KANGXI RADICAL MILLET;So;0;ON;<compat> 9ECD;;;;N;;;;; +2FCA;KANGXI RADICAL BLACK;So;0;ON;<compat> 9ED1;;;;N;;;;; +2FCB;KANGXI RADICAL EMBROIDERY;So;0;ON;<compat> 9EF9;;;;N;;;;; +2FCC;KANGXI RADICAL FROG;So;0;ON;<compat> 9EFD;;;;N;;;;; +2FCD;KANGXI RADICAL TRIPOD;So;0;ON;<compat> 9F0E;;;;N;;;;; +2FCE;KANGXI RADICAL DRUM;So;0;ON;<compat> 9F13;;;;N;;;;; +2FCF;KANGXI RADICAL RAT;So;0;ON;<compat> 9F20;;;;N;;;;; +2FD0;KANGXI RADICAL NOSE;So;0;ON;<compat> 9F3B;;;;N;;;;; +2FD1;KANGXI RADICAL EVEN;So;0;ON;<compat> 9F4A;;;;N;;;;; +2FD2;KANGXI RADICAL TOOTH;So;0;ON;<compat> 9F52;;;;N;;;;; +2FD3;KANGXI RADICAL DRAGON;So;0;ON;<compat> 9F8D;;;;N;;;;; +2FD4;KANGXI RADICAL TURTLE;So;0;ON;<compat> 9F9C;;;;N;;;;; +2FD5;KANGXI RADICAL FLUTE;So;0;ON;<compat> 9FA0;;;;N;;;;; +2FF0;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT;So;0;ON;;;;;N;;;;; +2FF1;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW;So;0;ON;;;;;N;;;;; +2FF2;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT;So;0;ON;;;;;N;;;;; +2FF3;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW;So;0;ON;;;;;N;;;;; +2FF4;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND;So;0;ON;;;;;N;;;;; +2FF5;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE;So;0;ON;;;;;N;;;;; +2FF6;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW;So;0;ON;;;;;N;;;;; +2FF7;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT;So;0;ON;;;;;N;;;;; +2FF8;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT;So;0;ON;;;;;N;;;;; +2FF9;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT;So;0;ON;;;;;N;;;;; +2FFA;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT;So;0;ON;;;;;N;;;;; +2FFB;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID;So;0;ON;;;;;N;;;;; +3000;IDEOGRAPHIC SPACE;Zs;0;WS;<wide> 0020;;;;N;;;;; +3001;IDEOGRAPHIC COMMA;Po;0;ON;;;;;N;;;;; +3002;IDEOGRAPHIC FULL STOP;Po;0;ON;;;;;N;IDEOGRAPHIC PERIOD;;;; +3003;DITTO MARK;Po;0;ON;;;;;N;;;;; +3004;JAPANESE INDUSTRIAL STANDARD SYMBOL;So;0;ON;;;;;N;;;;; +3005;IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; +3006;IDEOGRAPHIC CLOSING MARK;Lo;0;L;;;;;N;;;;; +3007;IDEOGRAPHIC NUMBER ZERO;Nl;0;L;;;;0;N;;;;; +3008;LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING ANGLE BRACKET;;;; +3009;RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING ANGLE BRACKET;;;; +300A;LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING DOUBLE ANGLE BRACKET;;;; +300B;RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING DOUBLE ANGLE BRACKET;;;; +300C;LEFT CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING CORNER BRACKET;;;; +300D;RIGHT CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING CORNER BRACKET;;;; +300E;LEFT WHITE CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE CORNER BRACKET;;;; +300F;RIGHT WHITE CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE CORNER BRACKET;;;; +3010;LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING BLACK LENTICULAR BRACKET;;;; +3011;RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING BLACK LENTICULAR BRACKET;;;; +3012;POSTAL MARK;So;0;ON;;;;;N;;;;; +3013;GETA MARK;So;0;ON;;;;;N;;;;; +3014;LEFT TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING TORTOISE SHELL BRACKET;;;; +3015;RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING TORTOISE SHELL BRACKET;;;; +3016;LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE LENTICULAR BRACKET;;;; +3017;RIGHT WHITE LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE LENTICULAR BRACKET;;;; +3018;LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE TORTOISE SHELL BRACKET;;;; +3019;RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE TORTOISE SHELL BRACKET;;;; +301A;LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE SQUARE BRACKET;;;; +301B;RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE SQUARE BRACKET;;;; +301C;WAVE DASH;Pd;0;ON;;;;;N;;;;; +301D;REVERSED DOUBLE PRIME QUOTATION MARK;Ps;0;ON;;;;;N;;;;; +301E;DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; +301F;LOW DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; +3020;POSTAL MARK FACE;So;0;ON;;;;;N;;;;; +3021;HANGZHOU NUMERAL ONE;Nl;0;L;;;;1;N;;;;; +3022;HANGZHOU NUMERAL TWO;Nl;0;L;;;;2;N;;;;; +3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;; +3024;HANGZHOU NUMERAL FOUR;Nl;0;L;;;;4;N;;;;; +3025;HANGZHOU NUMERAL FIVE;Nl;0;L;;;;5;N;;;;; +3026;HANGZHOU NUMERAL SIX;Nl;0;L;;;;6;N;;;;; +3027;HANGZHOU NUMERAL SEVEN;Nl;0;L;;;;7;N;;;;; +3028;HANGZHOU NUMERAL EIGHT;Nl;0;L;;;;8;N;;;;; +3029;HANGZHOU NUMERAL NINE;Nl;0;L;;;;9;N;;;;; +302A;IDEOGRAPHIC LEVEL TONE MARK;Mn;218;NSM;;;;;N;;;;; +302B;IDEOGRAPHIC RISING TONE MARK;Mn;228;NSM;;;;;N;;;;; +302C;IDEOGRAPHIC DEPARTING TONE MARK;Mn;232;NSM;;;;;N;;;;; +302D;IDEOGRAPHIC ENTERING TONE MARK;Mn;222;NSM;;;;;N;;;;; +302E;HANGUL SINGLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;; +302F;HANGUL DOUBLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;; +3030;WAVY DASH;Pd;0;ON;;;;;N;;;;; +3031;VERTICAL KANA REPEAT MARK;Lm;0;L;;;;;N;;;;; +3032;VERTICAL KANA REPEAT WITH VOICED SOUND MARK;Lm;0;L;;;;;N;;;;; +3033;VERTICAL KANA REPEAT MARK UPPER HALF;Lm;0;L;;;;;N;;;;; +3034;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF;Lm;0;L;;;;;N;;;;; +3035;VERTICAL KANA REPEAT MARK LOWER HALF;Lm;0;L;;;;;N;;;;; +3036;CIRCLED POSTAL MARK;So;0;ON;<compat> 3012;;;;N;;;;; +3037;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL;So;0;ON;;;;;N;;;;; +3038;HANGZHOU NUMERAL TEN;Nl;0;L;<compat> 5341;;;10;N;;;;; +3039;HANGZHOU NUMERAL TWENTY;Nl;0;L;<compat> 5344;;;20;N;;;;; +303A;HANGZHOU NUMERAL THIRTY;Nl;0;L;<compat> 5345;;;30;N;;;;; +303B;VERTICAL IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; +303C;MASU MARK;Lo;0;L;;;;;N;;;;; +303D;PART ALTERNATION MARK;Po;0;ON;;;;;N;;;;; +303E;IDEOGRAPHIC VARIATION INDICATOR;So;0;ON;;;;;N;;;;; +303F;IDEOGRAPHIC HALF FILL SPACE;So;0;ON;;;;;N;;;;; +3041;HIRAGANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +3042;HIRAGANA LETTER A;Lo;0;L;;;;;N;;;;; +3043;HIRAGANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; +3044;HIRAGANA LETTER I;Lo;0;L;;;;;N;;;;; +3045;HIRAGANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; +3046;HIRAGANA LETTER U;Lo;0;L;;;;;N;;;;; +3047;HIRAGANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; +3048;HIRAGANA LETTER E;Lo;0;L;;;;;N;;;;; +3049;HIRAGANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; +304A;HIRAGANA LETTER O;Lo;0;L;;;;;N;;;;; +304B;HIRAGANA LETTER KA;Lo;0;L;;;;;N;;;;; +304C;HIRAGANA LETTER GA;Lo;0;L;304B 3099;;;;N;;;;; +304D;HIRAGANA LETTER KI;Lo;0;L;;;;;N;;;;; +304E;HIRAGANA LETTER GI;Lo;0;L;304D 3099;;;;N;;;;; +304F;HIRAGANA LETTER KU;Lo;0;L;;;;;N;;;;; +3050;HIRAGANA LETTER GU;Lo;0;L;304F 3099;;;;N;;;;; +3051;HIRAGANA LETTER KE;Lo;0;L;;;;;N;;;;; +3052;HIRAGANA LETTER GE;Lo;0;L;3051 3099;;;;N;;;;; +3053;HIRAGANA LETTER KO;Lo;0;L;;;;;N;;;;; +3054;HIRAGANA LETTER GO;Lo;0;L;3053 3099;;;;N;;;;; +3055;HIRAGANA LETTER SA;Lo;0;L;;;;;N;;;;; +3056;HIRAGANA LETTER ZA;Lo;0;L;3055 3099;;;;N;;;;; +3057;HIRAGANA LETTER SI;Lo;0;L;;;;;N;;;;; +3058;HIRAGANA LETTER ZI;Lo;0;L;3057 3099;;;;N;;;;; +3059;HIRAGANA LETTER SU;Lo;0;L;;;;;N;;;;; +305A;HIRAGANA LETTER ZU;Lo;0;L;3059 3099;;;;N;;;;; +305B;HIRAGANA LETTER SE;Lo;0;L;;;;;N;;;;; +305C;HIRAGANA LETTER ZE;Lo;0;L;305B 3099;;;;N;;;;; +305D;HIRAGANA LETTER SO;Lo;0;L;;;;;N;;;;; +305E;HIRAGANA LETTER ZO;Lo;0;L;305D 3099;;;;N;;;;; +305F;HIRAGANA LETTER TA;Lo;0;L;;;;;N;;;;; +3060;HIRAGANA LETTER DA;Lo;0;L;305F 3099;;;;N;;;;; +3061;HIRAGANA LETTER TI;Lo;0;L;;;;;N;;;;; +3062;HIRAGANA LETTER DI;Lo;0;L;3061 3099;;;;N;;;;; +3063;HIRAGANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; +3064;HIRAGANA LETTER TU;Lo;0;L;;;;;N;;;;; +3065;HIRAGANA LETTER DU;Lo;0;L;3064 3099;;;;N;;;;; +3066;HIRAGANA LETTER TE;Lo;0;L;;;;;N;;;;; +3067;HIRAGANA LETTER DE;Lo;0;L;3066 3099;;;;N;;;;; +3068;HIRAGANA LETTER TO;Lo;0;L;;;;;N;;;;; +3069;HIRAGANA LETTER DO;Lo;0;L;3068 3099;;;;N;;;;; +306A;HIRAGANA LETTER NA;Lo;0;L;;;;;N;;;;; +306B;HIRAGANA LETTER NI;Lo;0;L;;;;;N;;;;; +306C;HIRAGANA LETTER NU;Lo;0;L;;;;;N;;;;; +306D;HIRAGANA LETTER NE;Lo;0;L;;;;;N;;;;; +306E;HIRAGANA LETTER NO;Lo;0;L;;;;;N;;;;; +306F;HIRAGANA LETTER HA;Lo;0;L;;;;;N;;;;; +3070;HIRAGANA LETTER BA;Lo;0;L;306F 3099;;;;N;;;;; +3071;HIRAGANA LETTER PA;Lo;0;L;306F 309A;;;;N;;;;; +3072;HIRAGANA LETTER HI;Lo;0;L;;;;;N;;;;; +3073;HIRAGANA LETTER BI;Lo;0;L;3072 3099;;;;N;;;;; +3074;HIRAGANA LETTER PI;Lo;0;L;3072 309A;;;;N;;;;; +3075;HIRAGANA LETTER HU;Lo;0;L;;;;;N;;;;; +3076;HIRAGANA LETTER BU;Lo;0;L;3075 3099;;;;N;;;;; +3077;HIRAGANA LETTER PU;Lo;0;L;3075 309A;;;;N;;;;; +3078;HIRAGANA LETTER HE;Lo;0;L;;;;;N;;;;; +3079;HIRAGANA LETTER BE;Lo;0;L;3078 3099;;;;N;;;;; +307A;HIRAGANA LETTER PE;Lo;0;L;3078 309A;;;;N;;;;; +307B;HIRAGANA LETTER HO;Lo;0;L;;;;;N;;;;; +307C;HIRAGANA LETTER BO;Lo;0;L;307B 3099;;;;N;;;;; +307D;HIRAGANA LETTER PO;Lo;0;L;307B 309A;;;;N;;;;; +307E;HIRAGANA LETTER MA;Lo;0;L;;;;;N;;;;; +307F;HIRAGANA LETTER MI;Lo;0;L;;;;;N;;;;; +3080;HIRAGANA LETTER MU;Lo;0;L;;;;;N;;;;; +3081;HIRAGANA LETTER ME;Lo;0;L;;;;;N;;;;; +3082;HIRAGANA LETTER MO;Lo;0;L;;;;;N;;;;; +3083;HIRAGANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; +3084;HIRAGANA LETTER YA;Lo;0;L;;;;;N;;;;; +3085;HIRAGANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; +3086;HIRAGANA LETTER YU;Lo;0;L;;;;;N;;;;; +3087;HIRAGANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; +3088;HIRAGANA LETTER YO;Lo;0;L;;;;;N;;;;; +3089;HIRAGANA LETTER RA;Lo;0;L;;;;;N;;;;; +308A;HIRAGANA LETTER RI;Lo;0;L;;;;;N;;;;; +308B;HIRAGANA LETTER RU;Lo;0;L;;;;;N;;;;; +308C;HIRAGANA LETTER RE;Lo;0;L;;;;;N;;;;; +308D;HIRAGANA LETTER RO;Lo;0;L;;;;;N;;;;; +308E;HIRAGANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; +308F;HIRAGANA LETTER WA;Lo;0;L;;;;;N;;;;; +3090;HIRAGANA LETTER WI;Lo;0;L;;;;;N;;;;; +3091;HIRAGANA LETTER WE;Lo;0;L;;;;;N;;;;; +3092;HIRAGANA LETTER WO;Lo;0;L;;;;;N;;;;; +3093;HIRAGANA LETTER N;Lo;0;L;;;;;N;;;;; +3094;HIRAGANA LETTER VU;Lo;0;L;3046 3099;;;;N;;;;; +3095;HIRAGANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; +3096;HIRAGANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; +3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;; +309A;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;;;; +309B;KATAKANA-HIRAGANA VOICED SOUND MARK;Sk;0;ON;<compat> 0020 3099;;;;N;;;;; +309C;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Sk;0;ON;<compat> 0020 309A;;;;N;;;;; +309D;HIRAGANA ITERATION MARK;Lm;0;L;;;;;N;;;;; +309E;HIRAGANA VOICED ITERATION MARK;Lm;0;L;309D 3099;;;;N;;;;; +309F;HIRAGANA DIGRAPH YORI;Lo;0;L;<vertical> 3088 308A;;;;N;;;;; +30A0;KATAKANA-HIRAGANA DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;; +30A1;KATAKANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +30A2;KATAKANA LETTER A;Lo;0;L;;;;;N;;;;; +30A3;KATAKANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; +30A4;KATAKANA LETTER I;Lo;0;L;;;;;N;;;;; +30A5;KATAKANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; +30A6;KATAKANA LETTER U;Lo;0;L;;;;;N;;;;; +30A7;KATAKANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; +30A8;KATAKANA LETTER E;Lo;0;L;;;;;N;;;;; +30A9;KATAKANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; +30AA;KATAKANA LETTER O;Lo;0;L;;;;;N;;;;; +30AB;KATAKANA LETTER KA;Lo;0;L;;;;;N;;;;; +30AC;KATAKANA LETTER GA;Lo;0;L;30AB 3099;;;;N;;;;; +30AD;KATAKANA LETTER KI;Lo;0;L;;;;;N;;;;; +30AE;KATAKANA LETTER GI;Lo;0;L;30AD 3099;;;;N;;;;; +30AF;KATAKANA LETTER KU;Lo;0;L;;;;;N;;;;; +30B0;KATAKANA LETTER GU;Lo;0;L;30AF 3099;;;;N;;;;; +30B1;KATAKANA LETTER KE;Lo;0;L;;;;;N;;;;; +30B2;KATAKANA LETTER GE;Lo;0;L;30B1 3099;;;;N;;;;; +30B3;KATAKANA LETTER KO;Lo;0;L;;;;;N;;;;; +30B4;KATAKANA LETTER GO;Lo;0;L;30B3 3099;;;;N;;;;; +30B5;KATAKANA LETTER SA;Lo;0;L;;;;;N;;;;; +30B6;KATAKANA LETTER ZA;Lo;0;L;30B5 3099;;;;N;;;;; +30B7;KATAKANA LETTER SI;Lo;0;L;;;;;N;;;;; +30B8;KATAKANA LETTER ZI;Lo;0;L;30B7 3099;;;;N;;;;; +30B9;KATAKANA LETTER SU;Lo;0;L;;;;;N;;;;; +30BA;KATAKANA LETTER ZU;Lo;0;L;30B9 3099;;;;N;;;;; +30BB;KATAKANA LETTER SE;Lo;0;L;;;;;N;;;;; +30BC;KATAKANA LETTER ZE;Lo;0;L;30BB 3099;;;;N;;;;; +30BD;KATAKANA LETTER SO;Lo;0;L;;;;;N;;;;; +30BE;KATAKANA LETTER ZO;Lo;0;L;30BD 3099;;;;N;;;;; +30BF;KATAKANA LETTER TA;Lo;0;L;;;;;N;;;;; +30C0;KATAKANA LETTER DA;Lo;0;L;30BF 3099;;;;N;;;;; +30C1;KATAKANA LETTER TI;Lo;0;L;;;;;N;;;;; +30C2;KATAKANA LETTER DI;Lo;0;L;30C1 3099;;;;N;;;;; +30C3;KATAKANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; +30C4;KATAKANA LETTER TU;Lo;0;L;;;;;N;;;;; +30C5;KATAKANA LETTER DU;Lo;0;L;30C4 3099;;;;N;;;;; +30C6;KATAKANA LETTER TE;Lo;0;L;;;;;N;;;;; +30C7;KATAKANA LETTER DE;Lo;0;L;30C6 3099;;;;N;;;;; +30C8;KATAKANA LETTER TO;Lo;0;L;;;;;N;;;;; +30C9;KATAKANA LETTER DO;Lo;0;L;30C8 3099;;;;N;;;;; +30CA;KATAKANA LETTER NA;Lo;0;L;;;;;N;;;;; +30CB;KATAKANA LETTER NI;Lo;0;L;;;;;N;;;;; +30CC;KATAKANA LETTER NU;Lo;0;L;;;;;N;;;;; +30CD;KATAKANA LETTER NE;Lo;0;L;;;;;N;;;;; +30CE;KATAKANA LETTER NO;Lo;0;L;;;;;N;;;;; +30CF;KATAKANA LETTER HA;Lo;0;L;;;;;N;;;;; +30D0;KATAKANA LETTER BA;Lo;0;L;30CF 3099;;;;N;;;;; +30D1;KATAKANA LETTER PA;Lo;0;L;30CF 309A;;;;N;;;;; +30D2;KATAKANA LETTER HI;Lo;0;L;;;;;N;;;;; +30D3;KATAKANA LETTER BI;Lo;0;L;30D2 3099;;;;N;;;;; +30D4;KATAKANA LETTER PI;Lo;0;L;30D2 309A;;;;N;;;;; +30D5;KATAKANA LETTER HU;Lo;0;L;;;;;N;;;;; +30D6;KATAKANA LETTER BU;Lo;0;L;30D5 3099;;;;N;;;;; +30D7;KATAKANA LETTER PU;Lo;0;L;30D5 309A;;;;N;;;;; +30D8;KATAKANA LETTER HE;Lo;0;L;;;;;N;;;;; +30D9;KATAKANA LETTER BE;Lo;0;L;30D8 3099;;;;N;;;;; +30DA;KATAKANA LETTER PE;Lo;0;L;30D8 309A;;;;N;;;;; +30DB;KATAKANA LETTER HO;Lo;0;L;;;;;N;;;;; +30DC;KATAKANA LETTER BO;Lo;0;L;30DB 3099;;;;N;;;;; +30DD;KATAKANA LETTER PO;Lo;0;L;30DB 309A;;;;N;;;;; +30DE;KATAKANA LETTER MA;Lo;0;L;;;;;N;;;;; +30DF;KATAKANA LETTER MI;Lo;0;L;;;;;N;;;;; +30E0;KATAKANA LETTER MU;Lo;0;L;;;;;N;;;;; +30E1;KATAKANA LETTER ME;Lo;0;L;;;;;N;;;;; +30E2;KATAKANA LETTER MO;Lo;0;L;;;;;N;;;;; +30E3;KATAKANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; +30E4;KATAKANA LETTER YA;Lo;0;L;;;;;N;;;;; +30E5;KATAKANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; +30E6;KATAKANA LETTER YU;Lo;0;L;;;;;N;;;;; +30E7;KATAKANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; +30E8;KATAKANA LETTER YO;Lo;0;L;;;;;N;;;;; +30E9;KATAKANA LETTER RA;Lo;0;L;;;;;N;;;;; +30EA;KATAKANA LETTER RI;Lo;0;L;;;;;N;;;;; +30EB;KATAKANA LETTER RU;Lo;0;L;;;;;N;;;;; +30EC;KATAKANA LETTER RE;Lo;0;L;;;;;N;;;;; +30ED;KATAKANA LETTER RO;Lo;0;L;;;;;N;;;;; +30EE;KATAKANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; +30EF;KATAKANA LETTER WA;Lo;0;L;;;;;N;;;;; +30F0;KATAKANA LETTER WI;Lo;0;L;;;;;N;;;;; +30F1;KATAKANA LETTER WE;Lo;0;L;;;;;N;;;;; +30F2;KATAKANA LETTER WO;Lo;0;L;;;;;N;;;;; +30F3;KATAKANA LETTER N;Lo;0;L;;;;;N;;;;; +30F4;KATAKANA LETTER VU;Lo;0;L;30A6 3099;;;;N;;;;; +30F5;KATAKANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; +30F6;KATAKANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; +30F7;KATAKANA LETTER VA;Lo;0;L;30EF 3099;;;;N;;;;; +30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;; +30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;; +30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;; +30FB;KATAKANA MIDDLE DOT;Pc;0;ON;;;;;N;;;;; +30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;; +30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;; +30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;; +30FF;KATAKANA DIGRAPH KOTO;Lo;0;L;<vertical> 30B3 30C8;;;;N;;;;; +3105;BOPOMOFO LETTER B;Lo;0;L;;;;;N;;;;; +3106;BOPOMOFO LETTER P;Lo;0;L;;;;;N;;;;; +3107;BOPOMOFO LETTER M;Lo;0;L;;;;;N;;;;; +3108;BOPOMOFO LETTER F;Lo;0;L;;;;;N;;;;; +3109;BOPOMOFO LETTER D;Lo;0;L;;;;;N;;;;; +310A;BOPOMOFO LETTER T;Lo;0;L;;;;;N;;;;; +310B;BOPOMOFO LETTER N;Lo;0;L;;;;;N;;;;; +310C;BOPOMOFO LETTER L;Lo;0;L;;;;;N;;;;; +310D;BOPOMOFO LETTER G;Lo;0;L;;;;;N;;;;; +310E;BOPOMOFO LETTER K;Lo;0;L;;;;;N;;;;; +310F;BOPOMOFO LETTER H;Lo;0;L;;;;;N;;;;; +3110;BOPOMOFO LETTER J;Lo;0;L;;;;;N;;;;; +3111;BOPOMOFO LETTER Q;Lo;0;L;;;;;N;;;;; +3112;BOPOMOFO LETTER X;Lo;0;L;;;;;N;;;;; +3113;BOPOMOFO LETTER ZH;Lo;0;L;;;;;N;;;;; +3114;BOPOMOFO LETTER CH;Lo;0;L;;;;;N;;;;; +3115;BOPOMOFO LETTER SH;Lo;0;L;;;;;N;;;;; +3116;BOPOMOFO LETTER R;Lo;0;L;;;;;N;;;;; +3117;BOPOMOFO LETTER Z;Lo;0;L;;;;;N;;;;; +3118;BOPOMOFO LETTER C;Lo;0;L;;;;;N;;;;; +3119;BOPOMOFO LETTER S;Lo;0;L;;;;;N;;;;; +311A;BOPOMOFO LETTER A;Lo;0;L;;;;;N;;;;; +311B;BOPOMOFO LETTER O;Lo;0;L;;;;;N;;;;; +311C;BOPOMOFO LETTER E;Lo;0;L;;;;;N;;;;; +311D;BOPOMOFO LETTER EH;Lo;0;L;;;;;N;;;;; +311E;BOPOMOFO LETTER AI;Lo;0;L;;;;;N;;;;; +311F;BOPOMOFO LETTER EI;Lo;0;L;;;;;N;;;;; +3120;BOPOMOFO LETTER AU;Lo;0;L;;;;;N;;;;; +3121;BOPOMOFO LETTER OU;Lo;0;L;;;;;N;;;;; +3122;BOPOMOFO LETTER AN;Lo;0;L;;;;;N;;;;; +3123;BOPOMOFO LETTER EN;Lo;0;L;;;;;N;;;;; +3124;BOPOMOFO LETTER ANG;Lo;0;L;;;;;N;;;;; +3125;BOPOMOFO LETTER ENG;Lo;0;L;;;;;N;;;;; +3126;BOPOMOFO LETTER ER;Lo;0;L;;;;;N;;;;; +3127;BOPOMOFO LETTER I;Lo;0;L;;;;;N;;;;; +3128;BOPOMOFO LETTER U;Lo;0;L;;;;;N;;;;; +3129;BOPOMOFO LETTER IU;Lo;0;L;;;;;N;;;;; +312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;; +312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;; +312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;; +3131;HANGUL LETTER KIYEOK;Lo;0;L;<compat> 1100;;;;N;HANGUL LETTER GIYEOG;;;; +3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L;<compat> 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;; +3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<compat> 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; +3134;HANGUL LETTER NIEUN;Lo;0;L;<compat> 1102;;;;N;;;;; +3135;HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<compat> 11AC;;;;N;HANGUL LETTER NIEUN JIEUJ;;;; +3136;HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<compat> 11AD;;;;N;HANGUL LETTER NIEUN HIEUH;;;; +3137;HANGUL LETTER TIKEUT;Lo;0;L;<compat> 1103;;;;N;HANGUL LETTER DIGEUD;;;; +3138;HANGUL LETTER SSANGTIKEUT;Lo;0;L;<compat> 1104;;;;N;HANGUL LETTER SSANG DIGEUD;;;; +3139;HANGUL LETTER RIEUL;Lo;0;L;<compat> 1105;;;;N;HANGUL LETTER LIEUL;;;; +313A;HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<compat> 11B0;;;;N;HANGUL LETTER LIEUL GIYEOG;;;; +313B;HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<compat> 11B1;;;;N;HANGUL LETTER LIEUL MIEUM;;;; +313C;HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<compat> 11B2;;;;N;HANGUL LETTER LIEUL BIEUB;;;; +313D;HANGUL LETTER RIEUL-SIOS;Lo;0;L;<compat> 11B3;;;;N;HANGUL LETTER LIEUL SIOS;;;; +313E;HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<compat> 11B4;;;;N;HANGUL LETTER LIEUL TIEUT;;;; +313F;HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<compat> 11B5;;;;N;HANGUL LETTER LIEUL PIEUP;;;; +3140;HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<compat> 111A;;;;N;HANGUL LETTER LIEUL HIEUH;;;; +3141;HANGUL LETTER MIEUM;Lo;0;L;<compat> 1106;;;;N;;;;; +3142;HANGUL LETTER PIEUP;Lo;0;L;<compat> 1107;;;;N;HANGUL LETTER BIEUB;;;; +3143;HANGUL LETTER SSANGPIEUP;Lo;0;L;<compat> 1108;;;;N;HANGUL LETTER SSANG BIEUB;;;; +3144;HANGUL LETTER PIEUP-SIOS;Lo;0;L;<compat> 1121;;;;N;HANGUL LETTER BIEUB SIOS;;;; +3145;HANGUL LETTER SIOS;Lo;0;L;<compat> 1109;;;;N;;;;; +3146;HANGUL LETTER SSANGSIOS;Lo;0;L;<compat> 110A;;;;N;HANGUL LETTER SSANG SIOS;;;; +3147;HANGUL LETTER IEUNG;Lo;0;L;<compat> 110B;;;;N;;;;; +3148;HANGUL LETTER CIEUC;Lo;0;L;<compat> 110C;;;;N;HANGUL LETTER JIEUJ;;;; +3149;HANGUL LETTER SSANGCIEUC;Lo;0;L;<compat> 110D;;;;N;HANGUL LETTER SSANG JIEUJ;;;; +314A;HANGUL LETTER CHIEUCH;Lo;0;L;<compat> 110E;;;;N;HANGUL LETTER CIEUC;;;; +314B;HANGUL LETTER KHIEUKH;Lo;0;L;<compat> 110F;;;;N;HANGUL LETTER KIYEOK;;;; +314C;HANGUL LETTER THIEUTH;Lo;0;L;<compat> 1110;;;;N;HANGUL LETTER TIEUT;;;; +314D;HANGUL LETTER PHIEUPH;Lo;0;L;<compat> 1111;;;;N;HANGUL LETTER PIEUP;;;; +314E;HANGUL LETTER HIEUH;Lo;0;L;<compat> 1112;;;;N;;;;; +314F;HANGUL LETTER A;Lo;0;L;<compat> 1161;;;;N;;;;; +3150;HANGUL LETTER AE;Lo;0;L;<compat> 1162;;;;N;;;;; +3151;HANGUL LETTER YA;Lo;0;L;<compat> 1163;;;;N;;;;; +3152;HANGUL LETTER YAE;Lo;0;L;<compat> 1164;;;;N;;;;; +3153;HANGUL LETTER EO;Lo;0;L;<compat> 1165;;;;N;;;;; +3154;HANGUL LETTER E;Lo;0;L;<compat> 1166;;;;N;;;;; +3155;HANGUL LETTER YEO;Lo;0;L;<compat> 1167;;;;N;;;;; +3156;HANGUL LETTER YE;Lo;0;L;<compat> 1168;;;;N;;;;; +3157;HANGUL LETTER O;Lo;0;L;<compat> 1169;;;;N;;;;; +3158;HANGUL LETTER WA;Lo;0;L;<compat> 116A;;;;N;;;;; +3159;HANGUL LETTER WAE;Lo;0;L;<compat> 116B;;;;N;;;;; +315A;HANGUL LETTER OE;Lo;0;L;<compat> 116C;;;;N;;;;; +315B;HANGUL LETTER YO;Lo;0;L;<compat> 116D;;;;N;;;;; +315C;HANGUL LETTER U;Lo;0;L;<compat> 116E;;;;N;;;;; +315D;HANGUL LETTER WEO;Lo;0;L;<compat> 116F;;;;N;;;;; +315E;HANGUL LETTER WE;Lo;0;L;<compat> 1170;;;;N;;;;; +315F;HANGUL LETTER WI;Lo;0;L;<compat> 1171;;;;N;;;;; +3160;HANGUL LETTER YU;Lo;0;L;<compat> 1172;;;;N;;;;; +3161;HANGUL LETTER EU;Lo;0;L;<compat> 1173;;;;N;;;;; +3162;HANGUL LETTER YI;Lo;0;L;<compat> 1174;;;;N;;;;; +3163;HANGUL LETTER I;Lo;0;L;<compat> 1175;;;;N;;;;; +3164;HANGUL FILLER;Lo;0;L;<compat> 1160;;;;N;HANGUL CAE OM;;;; +3165;HANGUL LETTER SSANGNIEUN;Lo;0;L;<compat> 1114;;;;N;HANGUL LETTER SSANG NIEUN;;;; +3166;HANGUL LETTER NIEUN-TIKEUT;Lo;0;L;<compat> 1115;;;;N;HANGUL LETTER NIEUN DIGEUD;;;; +3167;HANGUL LETTER NIEUN-SIOS;Lo;0;L;<compat> 11C7;;;;N;HANGUL LETTER NIEUN SIOS;;;; +3168;HANGUL LETTER NIEUN-PANSIOS;Lo;0;L;<compat> 11C8;;;;N;HANGUL LETTER NIEUN BAN CHI EUM;;;; +3169;HANGUL LETTER RIEUL-KIYEOK-SIOS;Lo;0;L;<compat> 11CC;;;;N;HANGUL LETTER LIEUL GIYEOG SIOS;;;; +316A;HANGUL LETTER RIEUL-TIKEUT;Lo;0;L;<compat> 11CE;;;;N;HANGUL LETTER LIEUL DIGEUD;;;; +316B;HANGUL LETTER RIEUL-PIEUP-SIOS;Lo;0;L;<compat> 11D3;;;;N;HANGUL LETTER LIEUL BIEUB SIOS;;;; +316C;HANGUL LETTER RIEUL-PANSIOS;Lo;0;L;<compat> 11D7;;;;N;HANGUL LETTER LIEUL BAN CHI EUM;;;; +316D;HANGUL LETTER RIEUL-YEORINHIEUH;Lo;0;L;<compat> 11D9;;;;N;HANGUL LETTER LIEUL YEOLIN HIEUH;;;; +316E;HANGUL LETTER MIEUM-PIEUP;Lo;0;L;<compat> 111C;;;;N;HANGUL LETTER MIEUM BIEUB;;;; +316F;HANGUL LETTER MIEUM-SIOS;Lo;0;L;<compat> 11DD;;;;N;HANGUL LETTER MIEUM SIOS;;;; +3170;HANGUL LETTER MIEUM-PANSIOS;Lo;0;L;<compat> 11DF;;;;N;HANGUL LETTER BIEUB BAN CHI EUM;;;; +3171;HANGUL LETTER KAPYEOUNMIEUM;Lo;0;L;<compat> 111D;;;;N;HANGUL LETTER MIEUM SUN GYEONG EUM;;;; +3172;HANGUL LETTER PIEUP-KIYEOK;Lo;0;L;<compat> 111E;;;;N;HANGUL LETTER BIEUB GIYEOG;;;; +3173;HANGUL LETTER PIEUP-TIKEUT;Lo;0;L;<compat> 1120;;;;N;HANGUL LETTER BIEUB DIGEUD;;;; +3174;HANGUL LETTER PIEUP-SIOS-KIYEOK;Lo;0;L;<compat> 1122;;;;N;HANGUL LETTER BIEUB SIOS GIYEOG;;;; +3175;HANGUL LETTER PIEUP-SIOS-TIKEUT;Lo;0;L;<compat> 1123;;;;N;HANGUL LETTER BIEUB SIOS DIGEUD;;;; +3176;HANGUL LETTER PIEUP-CIEUC;Lo;0;L;<compat> 1127;;;;N;HANGUL LETTER BIEUB JIEUJ;;;; +3177;HANGUL LETTER PIEUP-THIEUTH;Lo;0;L;<compat> 1129;;;;N;HANGUL LETTER BIEUB TIEUT;;;; +3178;HANGUL LETTER KAPYEOUNPIEUP;Lo;0;L;<compat> 112B;;;;N;HANGUL LETTER BIEUB SUN GYEONG EUM;;;; +3179;HANGUL LETTER KAPYEOUNSSANGPIEUP;Lo;0;L;<compat> 112C;;;;N;HANGUL LETTER SSANG BIEUB SUN GYEONG EUM;;;; +317A;HANGUL LETTER SIOS-KIYEOK;Lo;0;L;<compat> 112D;;;;N;HANGUL LETTER SIOS GIYEOG;;;; +317B;HANGUL LETTER SIOS-NIEUN;Lo;0;L;<compat> 112E;;;;N;HANGUL LETTER SIOS NIEUN;;;; +317C;HANGUL LETTER SIOS-TIKEUT;Lo;0;L;<compat> 112F;;;;N;HANGUL LETTER SIOS DIGEUD;;;; +317D;HANGUL LETTER SIOS-PIEUP;Lo;0;L;<compat> 1132;;;;N;HANGUL LETTER SIOS BIEUB;;;; +317E;HANGUL LETTER SIOS-CIEUC;Lo;0;L;<compat> 1136;;;;N;HANGUL LETTER SIOS JIEUJ;;;; +317F;HANGUL LETTER PANSIOS;Lo;0;L;<compat> 1140;;;;N;HANGUL LETTER BAN CHI EUM;;;; +3180;HANGUL LETTER SSANGIEUNG;Lo;0;L;<compat> 1147;;;;N;HANGUL LETTER SSANG IEUNG;;;; +3181;HANGUL LETTER YESIEUNG;Lo;0;L;<compat> 114C;;;;N;HANGUL LETTER NGIEUNG;;;; +3182;HANGUL LETTER YESIEUNG-SIOS;Lo;0;L;<compat> 11F1;;;;N;HANGUL LETTER NGIEUNG SIOS;;;; +3183;HANGUL LETTER YESIEUNG-PANSIOS;Lo;0;L;<compat> 11F2;;;;N;HANGUL LETTER NGIEUNG BAN CHI EUM;;;; +3184;HANGUL LETTER KAPYEOUNPHIEUPH;Lo;0;L;<compat> 1157;;;;N;HANGUL LETTER PIEUP SUN GYEONG EUM;;;; +3185;HANGUL LETTER SSANGHIEUH;Lo;0;L;<compat> 1158;;;;N;HANGUL LETTER SSANG HIEUH;;;; +3186;HANGUL LETTER YEORINHIEUH;Lo;0;L;<compat> 1159;;;;N;HANGUL LETTER YEOLIN HIEUH;;;; +3187;HANGUL LETTER YO-YA;Lo;0;L;<compat> 1184;;;;N;HANGUL LETTER YOYA;;;; +3188;HANGUL LETTER YO-YAE;Lo;0;L;<compat> 1185;;;;N;HANGUL LETTER YOYAE;;;; +3189;HANGUL LETTER YO-I;Lo;0;L;<compat> 1188;;;;N;HANGUL LETTER YOI;;;; +318A;HANGUL LETTER YU-YEO;Lo;0;L;<compat> 1191;;;;N;HANGUL LETTER YUYEO;;;; +318B;HANGUL LETTER YU-YE;Lo;0;L;<compat> 1192;;;;N;HANGUL LETTER YUYE;;;; +318C;HANGUL LETTER YU-I;Lo;0;L;<compat> 1194;;;;N;HANGUL LETTER YUI;;;; +318D;HANGUL LETTER ARAEA;Lo;0;L;<compat> 119E;;;;N;HANGUL LETTER ALAE A;;;; +318E;HANGUL LETTER ARAEAE;Lo;0;L;<compat> 11A1;;;;N;HANGUL LETTER ALAE AE;;;; +3190;IDEOGRAPHIC ANNOTATION LINKING MARK;So;0;L;;;;;N;KANBUN TATETEN;Kanbun Tateten;;; +3191;IDEOGRAPHIC ANNOTATION REVERSE MARK;So;0;L;;;;;N;KAERITEN RE;Kaeriten;;; +3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L;<super> 4E00;;;1;N;KAERITEN ITI;Kaeriten;;; +3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L;<super> 4E8C;;;2;N;KAERITEN NI;Kaeriten;;; +3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L;<super> 4E09;;;3;N;KAERITEN SAN;Kaeriten;;; +3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L;<super> 56DB;;;4;N;KAERITEN SI;Kaeriten;;; +3196;IDEOGRAPHIC ANNOTATION TOP MARK;So;0;L;<super> 4E0A;;;;N;KAERITEN ZYOU;Kaeriten;;; +3197;IDEOGRAPHIC ANNOTATION MIDDLE MARK;So;0;L;<super> 4E2D;;;;N;KAERITEN TYUU;Kaeriten;;; +3198;IDEOGRAPHIC ANNOTATION BOTTOM MARK;So;0;L;<super> 4E0B;;;;N;KAERITEN GE;Kaeriten;;; +3199;IDEOGRAPHIC ANNOTATION FIRST MARK;So;0;L;<super> 7532;;;;N;KAERITEN KOU;Kaeriten;;; +319A;IDEOGRAPHIC ANNOTATION SECOND MARK;So;0;L;<super> 4E59;;;;N;KAERITEN OTU;Kaeriten;;; +319B;IDEOGRAPHIC ANNOTATION THIRD MARK;So;0;L;<super> 4E19;;;;N;KAERITEN HEI;Kaeriten;;; +319C;IDEOGRAPHIC ANNOTATION FOURTH MARK;So;0;L;<super> 4E01;;;;N;KAERITEN TEI;Kaeriten;;; +319D;IDEOGRAPHIC ANNOTATION HEAVEN MARK;So;0;L;<super> 5929;;;;N;KAERITEN TEN;Kaeriten;;; +319E;IDEOGRAPHIC ANNOTATION EARTH MARK;So;0;L;<super> 5730;;;;N;KAERITEN TI;Kaeriten;;; +319F;IDEOGRAPHIC ANNOTATION MAN MARK;So;0;L;<super> 4EBA;;;;N;KAERITEN ZIN;Kaeriten;;; +31A0;BOPOMOFO LETTER BU;Lo;0;L;;;;;N;;;;; +31A1;BOPOMOFO LETTER ZI;Lo;0;L;;;;;N;;;;; +31A2;BOPOMOFO LETTER JI;Lo;0;L;;;;;N;;;;; +31A3;BOPOMOFO LETTER GU;Lo;0;L;;;;;N;;;;; +31A4;BOPOMOFO LETTER EE;Lo;0;L;;;;;N;;;;; +31A5;BOPOMOFO LETTER ENN;Lo;0;L;;;;;N;;;;; +31A6;BOPOMOFO LETTER OO;Lo;0;L;;;;;N;;;;; +31A7;BOPOMOFO LETTER ONN;Lo;0;L;;;;;N;;;;; +31A8;BOPOMOFO LETTER IR;Lo;0;L;;;;;N;;;;; +31A9;BOPOMOFO LETTER ANN;Lo;0;L;;;;;N;;;;; +31AA;BOPOMOFO LETTER INN;Lo;0;L;;;;;N;;;;; +31AB;BOPOMOFO LETTER UNN;Lo;0;L;;;;;N;;;;; +31AC;BOPOMOFO LETTER IM;Lo;0;L;;;;;N;;;;; +31AD;BOPOMOFO LETTER NGG;Lo;0;L;;;;;N;;;;; +31AE;BOPOMOFO LETTER AINN;Lo;0;L;;;;;N;;;;; +31AF;BOPOMOFO LETTER AUNN;Lo;0;L;;;;;N;;;;; +31B0;BOPOMOFO LETTER AM;Lo;0;L;;;;;N;;;;; +31B1;BOPOMOFO LETTER OM;Lo;0;L;;;;;N;;;;; +31B2;BOPOMOFO LETTER ONG;Lo;0;L;;;;;N;;;;; +31B3;BOPOMOFO LETTER INNN;Lo;0;L;;;;;N;;;;; +31B4;BOPOMOFO FINAL LETTER P;Lo;0;L;;;;;N;;;;; +31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;; +31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;; +31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;; +31F0;KATAKANA LETTER SMALL KU;Lo;0;L;;;;;N;;;;; +31F1;KATAKANA LETTER SMALL SI;Lo;0;L;;;;;N;;;;; +31F2;KATAKANA LETTER SMALL SU;Lo;0;L;;;;;N;;;;; +31F3;KATAKANA LETTER SMALL TO;Lo;0;L;;;;;N;;;;; +31F4;KATAKANA LETTER SMALL NU;Lo;0;L;;;;;N;;;;; +31F5;KATAKANA LETTER SMALL HA;Lo;0;L;;;;;N;;;;; +31F6;KATAKANA LETTER SMALL HI;Lo;0;L;;;;;N;;;;; +31F7;KATAKANA LETTER SMALL HU;Lo;0;L;;;;;N;;;;; +31F8;KATAKANA LETTER SMALL HE;Lo;0;L;;;;;N;;;;; +31F9;KATAKANA LETTER SMALL HO;Lo;0;L;;;;;N;;;;; +31FA;KATAKANA LETTER SMALL MU;Lo;0;L;;;;;N;;;;; +31FB;KATAKANA LETTER SMALL RA;Lo;0;L;;;;;N;;;;; +31FC;KATAKANA LETTER SMALL RI;Lo;0;L;;;;;N;;;;; +31FD;KATAKANA LETTER SMALL RU;Lo;0;L;;;;;N;;;;; +31FE;KATAKANA LETTER SMALL RE;Lo;0;L;;;;;N;;;;; +31FF;KATAKANA LETTER SMALL RO;Lo;0;L;;;;;N;;;;; +3200;PARENTHESIZED HANGUL KIYEOK;So;0;L;<compat> 0028 1100 0029;;;;N;PARENTHESIZED HANGUL GIYEOG;;;; +3201;PARENTHESIZED HANGUL NIEUN;So;0;L;<compat> 0028 1102 0029;;;;N;;;;; +3202;PARENTHESIZED HANGUL TIKEUT;So;0;L;<compat> 0028 1103 0029;;;;N;PARENTHESIZED HANGUL DIGEUD;;;; +3203;PARENTHESIZED HANGUL RIEUL;So;0;L;<compat> 0028 1105 0029;;;;N;PARENTHESIZED HANGUL LIEUL;;;; +3204;PARENTHESIZED HANGUL MIEUM;So;0;L;<compat> 0028 1106 0029;;;;N;;;;; +3205;PARENTHESIZED HANGUL PIEUP;So;0;L;<compat> 0028 1107 0029;;;;N;PARENTHESIZED HANGUL BIEUB;;;; +3206;PARENTHESIZED HANGUL SIOS;So;0;L;<compat> 0028 1109 0029;;;;N;;;;; +3207;PARENTHESIZED HANGUL IEUNG;So;0;L;<compat> 0028 110B 0029;;;;N;;;;; +3208;PARENTHESIZED HANGUL CIEUC;So;0;L;<compat> 0028 110C 0029;;;;N;PARENTHESIZED HANGUL JIEUJ;;;; +3209;PARENTHESIZED HANGUL CHIEUCH;So;0;L;<compat> 0028 110E 0029;;;;N;PARENTHESIZED HANGUL CIEUC;;;; +320A;PARENTHESIZED HANGUL KHIEUKH;So;0;L;<compat> 0028 110F 0029;;;;N;PARENTHESIZED HANGUL KIYEOK;;;; +320B;PARENTHESIZED HANGUL THIEUTH;So;0;L;<compat> 0028 1110 0029;;;;N;PARENTHESIZED HANGUL TIEUT;;;; +320C;PARENTHESIZED HANGUL PHIEUPH;So;0;L;<compat> 0028 1111 0029;;;;N;PARENTHESIZED HANGUL PIEUP;;;; +320D;PARENTHESIZED HANGUL HIEUH;So;0;L;<compat> 0028 1112 0029;;;;N;;;;; +320E;PARENTHESIZED HANGUL KIYEOK A;So;0;L;<compat> 0028 1100 1161 0029;;;;N;PARENTHESIZED HANGUL GA;;;; +320F;PARENTHESIZED HANGUL NIEUN A;So;0;L;<compat> 0028 1102 1161 0029;;;;N;PARENTHESIZED HANGUL NA;;;; +3210;PARENTHESIZED HANGUL TIKEUT A;So;0;L;<compat> 0028 1103 1161 0029;;;;N;PARENTHESIZED HANGUL DA;;;; +3211;PARENTHESIZED HANGUL RIEUL A;So;0;L;<compat> 0028 1105 1161 0029;;;;N;PARENTHESIZED HANGUL LA;;;; +3212;PARENTHESIZED HANGUL MIEUM A;So;0;L;<compat> 0028 1106 1161 0029;;;;N;PARENTHESIZED HANGUL MA;;;; +3213;PARENTHESIZED HANGUL PIEUP A;So;0;L;<compat> 0028 1107 1161 0029;;;;N;PARENTHESIZED HANGUL BA;;;; +3214;PARENTHESIZED HANGUL SIOS A;So;0;L;<compat> 0028 1109 1161 0029;;;;N;PARENTHESIZED HANGUL SA;;;; +3215;PARENTHESIZED HANGUL IEUNG A;So;0;L;<compat> 0028 110B 1161 0029;;;;N;PARENTHESIZED HANGUL A;;;; +3216;PARENTHESIZED HANGUL CIEUC A;So;0;L;<compat> 0028 110C 1161 0029;;;;N;PARENTHESIZED HANGUL JA;;;; +3217;PARENTHESIZED HANGUL CHIEUCH A;So;0;L;<compat> 0028 110E 1161 0029;;;;N;PARENTHESIZED HANGUL CA;;;; +3218;PARENTHESIZED HANGUL KHIEUKH A;So;0;L;<compat> 0028 110F 1161 0029;;;;N;PARENTHESIZED HANGUL KA;;;; +3219;PARENTHESIZED HANGUL THIEUTH A;So;0;L;<compat> 0028 1110 1161 0029;;;;N;PARENTHESIZED HANGUL TA;;;; +321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L;<compat> 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;; +321B;PARENTHESIZED HANGUL HIEUH A;So;0;L;<compat> 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;; +321C;PARENTHESIZED HANGUL CIEUC U;So;0;L;<compat> 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;; +3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L;<compat> 0028 4E00 0029;;;1;N;;;;; +3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L;<compat> 0028 4E8C 0029;;;2;N;;;;; +3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L;<compat> 0028 4E09 0029;;;3;N;;;;; +3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L;<compat> 0028 56DB 0029;;;4;N;;;;; +3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L;<compat> 0028 4E94 0029;;;5;N;;;;; +3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L;<compat> 0028 516D 0029;;;6;N;;;;; +3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L;<compat> 0028 4E03 0029;;;7;N;;;;; +3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L;<compat> 0028 516B 0029;;;8;N;;;;; +3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L;<compat> 0028 4E5D 0029;;;9;N;;;;; +3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L;<compat> 0028 5341 0029;;;10;N;;;;; +322A;PARENTHESIZED IDEOGRAPH MOON;So;0;L;<compat> 0028 6708 0029;;;;N;;;;; +322B;PARENTHESIZED IDEOGRAPH FIRE;So;0;L;<compat> 0028 706B 0029;;;;N;;;;; +322C;PARENTHESIZED IDEOGRAPH WATER;So;0;L;<compat> 0028 6C34 0029;;;;N;;;;; +322D;PARENTHESIZED IDEOGRAPH WOOD;So;0;L;<compat> 0028 6728 0029;;;;N;;;;; +322E;PARENTHESIZED IDEOGRAPH METAL;So;0;L;<compat> 0028 91D1 0029;;;;N;;;;; +322F;PARENTHESIZED IDEOGRAPH EARTH;So;0;L;<compat> 0028 571F 0029;;;;N;;;;; +3230;PARENTHESIZED IDEOGRAPH SUN;So;0;L;<compat> 0028 65E5 0029;;;;N;;;;; +3231;PARENTHESIZED IDEOGRAPH STOCK;So;0;L;<compat> 0028 682A 0029;;;;N;;;;; +3232;PARENTHESIZED IDEOGRAPH HAVE;So;0;L;<compat> 0028 6709 0029;;;;N;;;;; +3233;PARENTHESIZED IDEOGRAPH SOCIETY;So;0;L;<compat> 0028 793E 0029;;;;N;;;;; +3234;PARENTHESIZED IDEOGRAPH NAME;So;0;L;<compat> 0028 540D 0029;;;;N;;;;; +3235;PARENTHESIZED IDEOGRAPH SPECIAL;So;0;L;<compat> 0028 7279 0029;;;;N;;;;; +3236;PARENTHESIZED IDEOGRAPH FINANCIAL;So;0;L;<compat> 0028 8CA1 0029;;;;N;;;;; +3237;PARENTHESIZED IDEOGRAPH CONGRATULATION;So;0;L;<compat> 0028 795D 0029;;;;N;;;;; +3238;PARENTHESIZED IDEOGRAPH LABOR;So;0;L;<compat> 0028 52B4 0029;;;;N;;;;; +3239;PARENTHESIZED IDEOGRAPH REPRESENT;So;0;L;<compat> 0028 4EE3 0029;;;;N;;;;; +323A;PARENTHESIZED IDEOGRAPH CALL;So;0;L;<compat> 0028 547C 0029;;;;N;;;;; +323B;PARENTHESIZED IDEOGRAPH STUDY;So;0;L;<compat> 0028 5B66 0029;;;;N;;;;; +323C;PARENTHESIZED IDEOGRAPH SUPERVISE;So;0;L;<compat> 0028 76E3 0029;;;;N;;;;; +323D;PARENTHESIZED IDEOGRAPH ENTERPRISE;So;0;L;<compat> 0028 4F01 0029;;;;N;;;;; +323E;PARENTHESIZED IDEOGRAPH RESOURCE;So;0;L;<compat> 0028 8CC7 0029;;;;N;;;;; +323F;PARENTHESIZED IDEOGRAPH ALLIANCE;So;0;L;<compat> 0028 5354 0029;;;;N;;;;; +3240;PARENTHESIZED IDEOGRAPH FESTIVAL;So;0;L;<compat> 0028 796D 0029;;;;N;;;;; +3241;PARENTHESIZED IDEOGRAPH REST;So;0;L;<compat> 0028 4F11 0029;;;;N;;;;; +3242;PARENTHESIZED IDEOGRAPH SELF;So;0;L;<compat> 0028 81EA 0029;;;;N;;;;; +3243;PARENTHESIZED IDEOGRAPH REACH;So;0;L;<compat> 0028 81F3 0029;;;;N;;;;; +3251;CIRCLED NUMBER TWENTY ONE;No;0;ON;<circle> 0032 0031;;;21;N;;;;; +3252;CIRCLED NUMBER TWENTY TWO;No;0;ON;<circle> 0032 0032;;;22;N;;;;; +3253;CIRCLED NUMBER TWENTY THREE;No;0;ON;<circle> 0032 0033;;;23;N;;;;; +3254;CIRCLED NUMBER TWENTY FOUR;No;0;ON;<circle> 0032 0034;;;24;N;;;;; +3255;CIRCLED NUMBER TWENTY FIVE;No;0;ON;<circle> 0032 0035;;;25;N;;;;; +3256;CIRCLED NUMBER TWENTY SIX;No;0;ON;<circle> 0032 0036;;;26;N;;;;; +3257;CIRCLED NUMBER TWENTY SEVEN;No;0;ON;<circle> 0032 0037;;;27;N;;;;; +3258;CIRCLED NUMBER TWENTY EIGHT;No;0;ON;<circle> 0032 0038;;;28;N;;;;; +3259;CIRCLED NUMBER TWENTY NINE;No;0;ON;<circle> 0032 0039;;;29;N;;;;; +325A;CIRCLED NUMBER THIRTY;No;0;ON;<circle> 0033 0030;;;30;N;;;;; +325B;CIRCLED NUMBER THIRTY ONE;No;0;ON;<circle> 0033 0031;;;31;N;;;;; +325C;CIRCLED NUMBER THIRTY TWO;No;0;ON;<circle> 0033 0032;;;32;N;;;;; +325D;CIRCLED NUMBER THIRTY THREE;No;0;ON;<circle> 0033 0033;;;33;N;;;;; +325E;CIRCLED NUMBER THIRTY FOUR;No;0;ON;<circle> 0033 0034;;;34;N;;;;; +325F;CIRCLED NUMBER THIRTY FIVE;No;0;ON;<circle> 0033 0035;;;35;N;;;;; +3260;CIRCLED HANGUL KIYEOK;So;0;L;<circle> 1100;;;;N;CIRCLED HANGUL GIYEOG;;;; +3261;CIRCLED HANGUL NIEUN;So;0;L;<circle> 1102;;;;N;;;;; +3262;CIRCLED HANGUL TIKEUT;So;0;L;<circle> 1103;;;;N;CIRCLED HANGUL DIGEUD;;;; +3263;CIRCLED HANGUL RIEUL;So;0;L;<circle> 1105;;;;N;CIRCLED HANGUL LIEUL;;;; +3264;CIRCLED HANGUL MIEUM;So;0;L;<circle> 1106;;;;N;;;;; +3265;CIRCLED HANGUL PIEUP;So;0;L;<circle> 1107;;;;N;CIRCLED HANGUL BIEUB;;;; +3266;CIRCLED HANGUL SIOS;So;0;L;<circle> 1109;;;;N;;;;; +3267;CIRCLED HANGUL IEUNG;So;0;L;<circle> 110B;;;;N;;;;; +3268;CIRCLED HANGUL CIEUC;So;0;L;<circle> 110C;;;;N;CIRCLED HANGUL JIEUJ;;;; +3269;CIRCLED HANGUL CHIEUCH;So;0;L;<circle> 110E;;;;N;CIRCLED HANGUL CIEUC;;;; +326A;CIRCLED HANGUL KHIEUKH;So;0;L;<circle> 110F;;;;N;CIRCLED HANGUL KIYEOK;;;; +326B;CIRCLED HANGUL THIEUTH;So;0;L;<circle> 1110;;;;N;CIRCLED HANGUL TIEUT;;;; +326C;CIRCLED HANGUL PHIEUPH;So;0;L;<circle> 1111;;;;N;CIRCLED HANGUL PIEUP;;;; +326D;CIRCLED HANGUL HIEUH;So;0;L;<circle> 1112;;;;N;;;;; +326E;CIRCLED HANGUL KIYEOK A;So;0;L;<circle> 1100 1161;;;;N;CIRCLED HANGUL GA;;;; +326F;CIRCLED HANGUL NIEUN A;So;0;L;<circle> 1102 1161;;;;N;CIRCLED HANGUL NA;;;; +3270;CIRCLED HANGUL TIKEUT A;So;0;L;<circle> 1103 1161;;;;N;CIRCLED HANGUL DA;;;; +3271;CIRCLED HANGUL RIEUL A;So;0;L;<circle> 1105 1161;;;;N;CIRCLED HANGUL LA;;;; +3272;CIRCLED HANGUL MIEUM A;So;0;L;<circle> 1106 1161;;;;N;CIRCLED HANGUL MA;;;; +3273;CIRCLED HANGUL PIEUP A;So;0;L;<circle> 1107 1161;;;;N;CIRCLED HANGUL BA;;;; +3274;CIRCLED HANGUL SIOS A;So;0;L;<circle> 1109 1161;;;;N;CIRCLED HANGUL SA;;;; +3275;CIRCLED HANGUL IEUNG A;So;0;L;<circle> 110B 1161;;;;N;CIRCLED HANGUL A;;;; +3276;CIRCLED HANGUL CIEUC A;So;0;L;<circle> 110C 1161;;;;N;CIRCLED HANGUL JA;;;; +3277;CIRCLED HANGUL CHIEUCH A;So;0;L;<circle> 110E 1161;;;;N;CIRCLED HANGUL CA;;;; +3278;CIRCLED HANGUL KHIEUKH A;So;0;L;<circle> 110F 1161;;;;N;CIRCLED HANGUL KA;;;; +3279;CIRCLED HANGUL THIEUTH A;So;0;L;<circle> 1110 1161;;;;N;CIRCLED HANGUL TA;;;; +327A;CIRCLED HANGUL PHIEUPH A;So;0;L;<circle> 1111 1161;;;;N;CIRCLED HANGUL PA;;;; +327B;CIRCLED HANGUL HIEUH A;So;0;L;<circle> 1112 1161;;;;N;CIRCLED HANGUL HA;;;; +327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;; +3280;CIRCLED IDEOGRAPH ONE;No;0;L;<circle> 4E00;;;1;N;;;;; +3281;CIRCLED IDEOGRAPH TWO;No;0;L;<circle> 4E8C;;;2;N;;;;; +3282;CIRCLED IDEOGRAPH THREE;No;0;L;<circle> 4E09;;;3;N;;;;; +3283;CIRCLED IDEOGRAPH FOUR;No;0;L;<circle> 56DB;;;4;N;;;;; +3284;CIRCLED IDEOGRAPH FIVE;No;0;L;<circle> 4E94;;;5;N;;;;; +3285;CIRCLED IDEOGRAPH SIX;No;0;L;<circle> 516D;;;6;N;;;;; +3286;CIRCLED IDEOGRAPH SEVEN;No;0;L;<circle> 4E03;;;7;N;;;;; +3287;CIRCLED IDEOGRAPH EIGHT;No;0;L;<circle> 516B;;;8;N;;;;; +3288;CIRCLED IDEOGRAPH NINE;No;0;L;<circle> 4E5D;;;9;N;;;;; +3289;CIRCLED IDEOGRAPH TEN;No;0;L;<circle> 5341;;;10;N;;;;; +328A;CIRCLED IDEOGRAPH MOON;So;0;L;<circle> 6708;;;;N;;;;; +328B;CIRCLED IDEOGRAPH FIRE;So;0;L;<circle> 706B;;;;N;;;;; +328C;CIRCLED IDEOGRAPH WATER;So;0;L;<circle> 6C34;;;;N;;;;; +328D;CIRCLED IDEOGRAPH WOOD;So;0;L;<circle> 6728;;;;N;;;;; +328E;CIRCLED IDEOGRAPH METAL;So;0;L;<circle> 91D1;;;;N;;;;; +328F;CIRCLED IDEOGRAPH EARTH;So;0;L;<circle> 571F;;;;N;;;;; +3290;CIRCLED IDEOGRAPH SUN;So;0;L;<circle> 65E5;;;;N;;;;; +3291;CIRCLED IDEOGRAPH STOCK;So;0;L;<circle> 682A;;;;N;;;;; +3292;CIRCLED IDEOGRAPH HAVE;So;0;L;<circle> 6709;;;;N;;;;; +3293;CIRCLED IDEOGRAPH SOCIETY;So;0;L;<circle> 793E;;;;N;;;;; +3294;CIRCLED IDEOGRAPH NAME;So;0;L;<circle> 540D;;;;N;;;;; +3295;CIRCLED IDEOGRAPH SPECIAL;So;0;L;<circle> 7279;;;;N;;;;; +3296;CIRCLED IDEOGRAPH FINANCIAL;So;0;L;<circle> 8CA1;;;;N;;;;; +3297;CIRCLED IDEOGRAPH CONGRATULATION;So;0;L;<circle> 795D;;;;N;;;;; +3298;CIRCLED IDEOGRAPH LABOR;So;0;L;<circle> 52B4;;;;N;;;;; +3299;CIRCLED IDEOGRAPH SECRET;So;0;L;<circle> 79D8;;;;N;;;;; +329A;CIRCLED IDEOGRAPH MALE;So;0;L;<circle> 7537;;;;N;;;;; +329B;CIRCLED IDEOGRAPH FEMALE;So;0;L;<circle> 5973;;;;N;;;;; +329C;CIRCLED IDEOGRAPH SUITABLE;So;0;L;<circle> 9069;;;;N;;;;; +329D;CIRCLED IDEOGRAPH EXCELLENT;So;0;L;<circle> 512A;;;;N;;;;; +329E;CIRCLED IDEOGRAPH PRINT;So;0;L;<circle> 5370;;;;N;;;;; +329F;CIRCLED IDEOGRAPH ATTENTION;So;0;L;<circle> 6CE8;;;;N;;;;; +32A0;CIRCLED IDEOGRAPH ITEM;So;0;L;<circle> 9805;;;;N;;;;; +32A1;CIRCLED IDEOGRAPH REST;So;0;L;<circle> 4F11;;;;N;;;;; +32A2;CIRCLED IDEOGRAPH COPY;So;0;L;<circle> 5199;;;;N;;;;; +32A3;CIRCLED IDEOGRAPH CORRECT;So;0;L;<circle> 6B63;;;;N;;;;; +32A4;CIRCLED IDEOGRAPH HIGH;So;0;L;<circle> 4E0A;;;;N;;;;; +32A5;CIRCLED IDEOGRAPH CENTRE;So;0;L;<circle> 4E2D;;;;N;CIRCLED IDEOGRAPH CENTER;;;; +32A6;CIRCLED IDEOGRAPH LOW;So;0;L;<circle> 4E0B;;;;N;;;;; +32A7;CIRCLED IDEOGRAPH LEFT;So;0;L;<circle> 5DE6;;;;N;;;;; +32A8;CIRCLED IDEOGRAPH RIGHT;So;0;L;<circle> 53F3;;;;N;;;;; +32A9;CIRCLED IDEOGRAPH MEDICINE;So;0;L;<circle> 533B;;;;N;;;;; +32AA;CIRCLED IDEOGRAPH RELIGION;So;0;L;<circle> 5B97;;;;N;;;;; +32AB;CIRCLED IDEOGRAPH STUDY;So;0;L;<circle> 5B66;;;;N;;;;; +32AC;CIRCLED IDEOGRAPH SUPERVISE;So;0;L;<circle> 76E3;;;;N;;;;; +32AD;CIRCLED IDEOGRAPH ENTERPRISE;So;0;L;<circle> 4F01;;;;N;;;;; +32AE;CIRCLED IDEOGRAPH RESOURCE;So;0;L;<circle> 8CC7;;;;N;;;;; +32AF;CIRCLED IDEOGRAPH ALLIANCE;So;0;L;<circle> 5354;;;;N;;;;; +32B0;CIRCLED IDEOGRAPH NIGHT;So;0;L;<circle> 591C;;;;N;;;;; +32B1;CIRCLED NUMBER THIRTY SIX;No;0;ON;<circle> 0033 0036;;;36;N;;;;; +32B2;CIRCLED NUMBER THIRTY SEVEN;No;0;ON;<circle> 0033 0037;;;37;N;;;;; +32B3;CIRCLED NUMBER THIRTY EIGHT;No;0;ON;<circle> 0033 0038;;;38;N;;;;; +32B4;CIRCLED NUMBER THIRTY NINE;No;0;ON;<circle> 0033 0039;;;39;N;;;;; +32B5;CIRCLED NUMBER FORTY;No;0;ON;<circle> 0034 0030;;;40;N;;;;; +32B6;CIRCLED NUMBER FORTY ONE;No;0;ON;<circle> 0034 0031;;;41;N;;;;; +32B7;CIRCLED NUMBER FORTY TWO;No;0;ON;<circle> 0034 0032;;;42;N;;;;; +32B8;CIRCLED NUMBER FORTY THREE;No;0;ON;<circle> 0034 0033;;;43;N;;;;; +32B9;CIRCLED NUMBER FORTY FOUR;No;0;ON;<circle> 0034 0034;;;44;N;;;;; +32BA;CIRCLED NUMBER FORTY FIVE;No;0;ON;<circle> 0034 0035;;;45;N;;;;; +32BB;CIRCLED NUMBER FORTY SIX;No;0;ON;<circle> 0034 0036;;;46;N;;;;; +32BC;CIRCLED NUMBER FORTY SEVEN;No;0;ON;<circle> 0034 0037;;;47;N;;;;; +32BD;CIRCLED NUMBER FORTY EIGHT;No;0;ON;<circle> 0034 0038;;;48;N;;;;; +32BE;CIRCLED NUMBER FORTY NINE;No;0;ON;<circle> 0034 0039;;;49;N;;;;; +32BF;CIRCLED NUMBER FIFTY;No;0;ON;<circle> 0035 0030;;;50;N;;;;; +32C0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY;So;0;L;<compat> 0031 6708;;;;N;;;;; +32C1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY;So;0;L;<compat> 0032 6708;;;;N;;;;; +32C2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH;So;0;L;<compat> 0033 6708;;;;N;;;;; +32C3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL;So;0;L;<compat> 0034 6708;;;;N;;;;; +32C4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY;So;0;L;<compat> 0035 6708;;;;N;;;;; +32C5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE;So;0;L;<compat> 0036 6708;;;;N;;;;; +32C6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY;So;0;L;<compat> 0037 6708;;;;N;;;;; +32C7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST;So;0;L;<compat> 0038 6708;;;;N;;;;; +32C8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER;So;0;L;<compat> 0039 6708;;;;N;;;;; +32C9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER;So;0;L;<compat> 0031 0030 6708;;;;N;;;;; +32CA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER;So;0;L;<compat> 0031 0031 6708;;;;N;;;;; +32CB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER;So;0;L;<compat> 0031 0032 6708;;;;N;;;;; +32D0;CIRCLED KATAKANA A;So;0;L;<circle> 30A2;;;;N;;;;; +32D1;CIRCLED KATAKANA I;So;0;L;<circle> 30A4;;;;N;;;;; +32D2;CIRCLED KATAKANA U;So;0;L;<circle> 30A6;;;;N;;;;; +32D3;CIRCLED KATAKANA E;So;0;L;<circle> 30A8;;;;N;;;;; +32D4;CIRCLED KATAKANA O;So;0;L;<circle> 30AA;;;;N;;;;; +32D5;CIRCLED KATAKANA KA;So;0;L;<circle> 30AB;;;;N;;;;; +32D6;CIRCLED KATAKANA KI;So;0;L;<circle> 30AD;;;;N;;;;; +32D7;CIRCLED KATAKANA KU;So;0;L;<circle> 30AF;;;;N;;;;; +32D8;CIRCLED KATAKANA KE;So;0;L;<circle> 30B1;;;;N;;;;; +32D9;CIRCLED KATAKANA KO;So;0;L;<circle> 30B3;;;;N;;;;; +32DA;CIRCLED KATAKANA SA;So;0;L;<circle> 30B5;;;;N;;;;; +32DB;CIRCLED KATAKANA SI;So;0;L;<circle> 30B7;;;;N;;;;; +32DC;CIRCLED KATAKANA SU;So;0;L;<circle> 30B9;;;;N;;;;; +32DD;CIRCLED KATAKANA SE;So;0;L;<circle> 30BB;;;;N;;;;; +32DE;CIRCLED KATAKANA SO;So;0;L;<circle> 30BD;;;;N;;;;; +32DF;CIRCLED KATAKANA TA;So;0;L;<circle> 30BF;;;;N;;;;; +32E0;CIRCLED KATAKANA TI;So;0;L;<circle> 30C1;;;;N;;;;; +32E1;CIRCLED KATAKANA TU;So;0;L;<circle> 30C4;;;;N;;;;; +32E2;CIRCLED KATAKANA TE;So;0;L;<circle> 30C6;;;;N;;;;; +32E3;CIRCLED KATAKANA TO;So;0;L;<circle> 30C8;;;;N;;;;; +32E4;CIRCLED KATAKANA NA;So;0;L;<circle> 30CA;;;;N;;;;; +32E5;CIRCLED KATAKANA NI;So;0;L;<circle> 30CB;;;;N;;;;; +32E6;CIRCLED KATAKANA NU;So;0;L;<circle> 30CC;;;;N;;;;; +32E7;CIRCLED KATAKANA NE;So;0;L;<circle> 30CD;;;;N;;;;; +32E8;CIRCLED KATAKANA NO;So;0;L;<circle> 30CE;;;;N;;;;; +32E9;CIRCLED KATAKANA HA;So;0;L;<circle> 30CF;;;;N;;;;; +32EA;CIRCLED KATAKANA HI;So;0;L;<circle> 30D2;;;;N;;;;; +32EB;CIRCLED KATAKANA HU;So;0;L;<circle> 30D5;;;;N;;;;; +32EC;CIRCLED KATAKANA HE;So;0;L;<circle> 30D8;;;;N;;;;; +32ED;CIRCLED KATAKANA HO;So;0;L;<circle> 30DB;;;;N;;;;; +32EE;CIRCLED KATAKANA MA;So;0;L;<circle> 30DE;;;;N;;;;; +32EF;CIRCLED KATAKANA MI;So;0;L;<circle> 30DF;;;;N;;;;; +32F0;CIRCLED KATAKANA MU;So;0;L;<circle> 30E0;;;;N;;;;; +32F1;CIRCLED KATAKANA ME;So;0;L;<circle> 30E1;;;;N;;;;; +32F2;CIRCLED KATAKANA MO;So;0;L;<circle> 30E2;;;;N;;;;; +32F3;CIRCLED KATAKANA YA;So;0;L;<circle> 30E4;;;;N;;;;; +32F4;CIRCLED KATAKANA YU;So;0;L;<circle> 30E6;;;;N;;;;; +32F5;CIRCLED KATAKANA YO;So;0;L;<circle> 30E8;;;;N;;;;; +32F6;CIRCLED KATAKANA RA;So;0;L;<circle> 30E9;;;;N;;;;; +32F7;CIRCLED KATAKANA RI;So;0;L;<circle> 30EA;;;;N;;;;; +32F8;CIRCLED KATAKANA RU;So;0;L;<circle> 30EB;;;;N;;;;; +32F9;CIRCLED KATAKANA RE;So;0;L;<circle> 30EC;;;;N;;;;; +32FA;CIRCLED KATAKANA RO;So;0;L;<circle> 30ED;;;;N;;;;; +32FB;CIRCLED KATAKANA WA;So;0;L;<circle> 30EF;;;;N;;;;; +32FC;CIRCLED KATAKANA WI;So;0;L;<circle> 30F0;;;;N;;;;; +32FD;CIRCLED KATAKANA WE;So;0;L;<circle> 30F1;;;;N;;;;; +32FE;CIRCLED KATAKANA WO;So;0;L;<circle> 30F2;;;;N;;;;; +3300;SQUARE APAATO;So;0;L;<square> 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;; +3301;SQUARE ARUHUA;So;0;L;<square> 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;; +3302;SQUARE ANPEA;So;0;L;<square> 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;; +3303;SQUARE AARU;So;0;L;<square> 30A2 30FC 30EB;;;;N;SQUARED AARU;;;; +3304;SQUARE ININGU;So;0;L;<square> 30A4 30CB 30F3 30B0;;;;N;SQUARED ININGU;;;; +3305;SQUARE INTI;So;0;L;<square> 30A4 30F3 30C1;;;;N;SQUARED INTI;;;; +3306;SQUARE UON;So;0;L;<square> 30A6 30A9 30F3;;;;N;SQUARED UON;;;; +3307;SQUARE ESUKUUDO;So;0;L;<square> 30A8 30B9 30AF 30FC 30C9;;;;N;SQUARED ESUKUUDO;;;; +3308;SQUARE EEKAA;So;0;L;<square> 30A8 30FC 30AB 30FC;;;;N;SQUARED EEKAA;;;; +3309;SQUARE ONSU;So;0;L;<square> 30AA 30F3 30B9;;;;N;SQUARED ONSU;;;; +330A;SQUARE OOMU;So;0;L;<square> 30AA 30FC 30E0;;;;N;SQUARED OOMU;;;; +330B;SQUARE KAIRI;So;0;L;<square> 30AB 30A4 30EA;;;;N;SQUARED KAIRI;;;; +330C;SQUARE KARATTO;So;0;L;<square> 30AB 30E9 30C3 30C8;;;;N;SQUARED KARATTO;;;; +330D;SQUARE KARORII;So;0;L;<square> 30AB 30ED 30EA 30FC;;;;N;SQUARED KARORII;;;; +330E;SQUARE GARON;So;0;L;<square> 30AC 30ED 30F3;;;;N;SQUARED GARON;;;; +330F;SQUARE GANMA;So;0;L;<square> 30AC 30F3 30DE;;;;N;SQUARED GANMA;;;; +3310;SQUARE GIGA;So;0;L;<square> 30AE 30AC;;;;N;SQUARED GIGA;;;; +3311;SQUARE GINII;So;0;L;<square> 30AE 30CB 30FC;;;;N;SQUARED GINII;;;; +3312;SQUARE KYURII;So;0;L;<square> 30AD 30E5 30EA 30FC;;;;N;SQUARED KYURII;;;; +3313;SQUARE GIRUDAA;So;0;L;<square> 30AE 30EB 30C0 30FC;;;;N;SQUARED GIRUDAA;;;; +3314;SQUARE KIRO;So;0;L;<square> 30AD 30ED;;;;N;SQUARED KIRO;;;; +3315;SQUARE KIROGURAMU;So;0;L;<square> 30AD 30ED 30B0 30E9 30E0;;;;N;SQUARED KIROGURAMU;;;; +3316;SQUARE KIROMEETORU;So;0;L;<square> 30AD 30ED 30E1 30FC 30C8 30EB;;;;N;SQUARED KIROMEETORU;;;; +3317;SQUARE KIROWATTO;So;0;L;<square> 30AD 30ED 30EF 30C3 30C8;;;;N;SQUARED KIROWATTO;;;; +3318;SQUARE GURAMU;So;0;L;<square> 30B0 30E9 30E0;;;;N;SQUARED GURAMU;;;; +3319;SQUARE GURAMUTON;So;0;L;<square> 30B0 30E9 30E0 30C8 30F3;;;;N;SQUARED GURAMUTON;;;; +331A;SQUARE KURUZEIRO;So;0;L;<square> 30AF 30EB 30BC 30A4 30ED;;;;N;SQUARED KURUZEIRO;;;; +331B;SQUARE KUROONE;So;0;L;<square> 30AF 30ED 30FC 30CD;;;;N;SQUARED KUROONE;;;; +331C;SQUARE KEESU;So;0;L;<square> 30B1 30FC 30B9;;;;N;SQUARED KEESU;;;; +331D;SQUARE KORUNA;So;0;L;<square> 30B3 30EB 30CA;;;;N;SQUARED KORUNA;;;; +331E;SQUARE KOOPO;So;0;L;<square> 30B3 30FC 30DD;;;;N;SQUARED KOOPO;;;; +331F;SQUARE SAIKURU;So;0;L;<square> 30B5 30A4 30AF 30EB;;;;N;SQUARED SAIKURU;;;; +3320;SQUARE SANTIIMU;So;0;L;<square> 30B5 30F3 30C1 30FC 30E0;;;;N;SQUARED SANTIIMU;;;; +3321;SQUARE SIRINGU;So;0;L;<square> 30B7 30EA 30F3 30B0;;;;N;SQUARED SIRINGU;;;; +3322;SQUARE SENTI;So;0;L;<square> 30BB 30F3 30C1;;;;N;SQUARED SENTI;;;; +3323;SQUARE SENTO;So;0;L;<square> 30BB 30F3 30C8;;;;N;SQUARED SENTO;;;; +3324;SQUARE DAASU;So;0;L;<square> 30C0 30FC 30B9;;;;N;SQUARED DAASU;;;; +3325;SQUARE DESI;So;0;L;<square> 30C7 30B7;;;;N;SQUARED DESI;;;; +3326;SQUARE DORU;So;0;L;<square> 30C9 30EB;;;;N;SQUARED DORU;;;; +3327;SQUARE TON;So;0;L;<square> 30C8 30F3;;;;N;SQUARED TON;;;; +3328;SQUARE NANO;So;0;L;<square> 30CA 30CE;;;;N;SQUARED NANO;;;; +3329;SQUARE NOTTO;So;0;L;<square> 30CE 30C3 30C8;;;;N;SQUARED NOTTO;;;; +332A;SQUARE HAITU;So;0;L;<square> 30CF 30A4 30C4;;;;N;SQUARED HAITU;;;; +332B;SQUARE PAASENTO;So;0;L;<square> 30D1 30FC 30BB 30F3 30C8;;;;N;SQUARED PAASENTO;;;; +332C;SQUARE PAATU;So;0;L;<square> 30D1 30FC 30C4;;;;N;SQUARED PAATU;;;; +332D;SQUARE BAARERU;So;0;L;<square> 30D0 30FC 30EC 30EB;;;;N;SQUARED BAARERU;;;; +332E;SQUARE PIASUTORU;So;0;L;<square> 30D4 30A2 30B9 30C8 30EB;;;;N;SQUARED PIASUTORU;;;; +332F;SQUARE PIKURU;So;0;L;<square> 30D4 30AF 30EB;;;;N;SQUARED PIKURU;;;; +3330;SQUARE PIKO;So;0;L;<square> 30D4 30B3;;;;N;SQUARED PIKO;;;; +3331;SQUARE BIRU;So;0;L;<square> 30D3 30EB;;;;N;SQUARED BIRU;;;; +3332;SQUARE HUARADDO;So;0;L;<square> 30D5 30A1 30E9 30C3 30C9;;;;N;SQUARED HUARADDO;;;; +3333;SQUARE HUIITO;So;0;L;<square> 30D5 30A3 30FC 30C8;;;;N;SQUARED HUIITO;;;; +3334;SQUARE BUSSYERU;So;0;L;<square> 30D6 30C3 30B7 30A7 30EB;;;;N;SQUARED BUSSYERU;;;; +3335;SQUARE HURAN;So;0;L;<square> 30D5 30E9 30F3;;;;N;SQUARED HURAN;;;; +3336;SQUARE HEKUTAARU;So;0;L;<square> 30D8 30AF 30BF 30FC 30EB;;;;N;SQUARED HEKUTAARU;;;; +3337;SQUARE PESO;So;0;L;<square> 30DA 30BD;;;;N;SQUARED PESO;;;; +3338;SQUARE PENIHI;So;0;L;<square> 30DA 30CB 30D2;;;;N;SQUARED PENIHI;;;; +3339;SQUARE HERUTU;So;0;L;<square> 30D8 30EB 30C4;;;;N;SQUARED HERUTU;;;; +333A;SQUARE PENSU;So;0;L;<square> 30DA 30F3 30B9;;;;N;SQUARED PENSU;;;; +333B;SQUARE PEEZI;So;0;L;<square> 30DA 30FC 30B8;;;;N;SQUARED PEEZI;;;; +333C;SQUARE BEETA;So;0;L;<square> 30D9 30FC 30BF;;;;N;SQUARED BEETA;;;; +333D;SQUARE POINTO;So;0;L;<square> 30DD 30A4 30F3 30C8;;;;N;SQUARED POINTO;;;; +333E;SQUARE BORUTO;So;0;L;<square> 30DC 30EB 30C8;;;;N;SQUARED BORUTO;;;; +333F;SQUARE HON;So;0;L;<square> 30DB 30F3;;;;N;SQUARED HON;;;; +3340;SQUARE PONDO;So;0;L;<square> 30DD 30F3 30C9;;;;N;SQUARED PONDO;;;; +3341;SQUARE HOORU;So;0;L;<square> 30DB 30FC 30EB;;;;N;SQUARED HOORU;;;; +3342;SQUARE HOON;So;0;L;<square> 30DB 30FC 30F3;;;;N;SQUARED HOON;;;; +3343;SQUARE MAIKURO;So;0;L;<square> 30DE 30A4 30AF 30ED;;;;N;SQUARED MAIKURO;;;; +3344;SQUARE MAIRU;So;0;L;<square> 30DE 30A4 30EB;;;;N;SQUARED MAIRU;;;; +3345;SQUARE MAHHA;So;0;L;<square> 30DE 30C3 30CF;;;;N;SQUARED MAHHA;;;; +3346;SQUARE MARUKU;So;0;L;<square> 30DE 30EB 30AF;;;;N;SQUARED MARUKU;;;; +3347;SQUARE MANSYON;So;0;L;<square> 30DE 30F3 30B7 30E7 30F3;;;;N;SQUARED MANSYON;;;; +3348;SQUARE MIKURON;So;0;L;<square> 30DF 30AF 30ED 30F3;;;;N;SQUARED MIKURON;;;; +3349;SQUARE MIRI;So;0;L;<square> 30DF 30EA;;;;N;SQUARED MIRI;;;; +334A;SQUARE MIRIBAARU;So;0;L;<square> 30DF 30EA 30D0 30FC 30EB;;;;N;SQUARED MIRIBAARU;;;; +334B;SQUARE MEGA;So;0;L;<square> 30E1 30AC;;;;N;SQUARED MEGA;;;; +334C;SQUARE MEGATON;So;0;L;<square> 30E1 30AC 30C8 30F3;;;;N;SQUARED MEGATON;;;; +334D;SQUARE MEETORU;So;0;L;<square> 30E1 30FC 30C8 30EB;;;;N;SQUARED MEETORU;;;; +334E;SQUARE YAADO;So;0;L;<square> 30E4 30FC 30C9;;;;N;SQUARED YAADO;;;; +334F;SQUARE YAARU;So;0;L;<square> 30E4 30FC 30EB;;;;N;SQUARED YAARU;;;; +3350;SQUARE YUAN;So;0;L;<square> 30E6 30A2 30F3;;;;N;SQUARED YUAN;;;; +3351;SQUARE RITTORU;So;0;L;<square> 30EA 30C3 30C8 30EB;;;;N;SQUARED RITTORU;;;; +3352;SQUARE RIRA;So;0;L;<square> 30EA 30E9;;;;N;SQUARED RIRA;;;; +3353;SQUARE RUPII;So;0;L;<square> 30EB 30D4 30FC;;;;N;SQUARED RUPII;;;; +3354;SQUARE RUUBURU;So;0;L;<square> 30EB 30FC 30D6 30EB;;;;N;SQUARED RUUBURU;;;; +3355;SQUARE REMU;So;0;L;<square> 30EC 30E0;;;;N;SQUARED REMU;;;; +3356;SQUARE RENTOGEN;So;0;L;<square> 30EC 30F3 30C8 30B2 30F3;;;;N;SQUARED RENTOGEN;;;; +3357;SQUARE WATTO;So;0;L;<square> 30EF 30C3 30C8;;;;N;SQUARED WATTO;;;; +3358;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO;So;0;L;<compat> 0030 70B9;;;;N;;;;; +3359;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE;So;0;L;<compat> 0031 70B9;;;;N;;;;; +335A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO;So;0;L;<compat> 0032 70B9;;;;N;;;;; +335B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE;So;0;L;<compat> 0033 70B9;;;;N;;;;; +335C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR;So;0;L;<compat> 0034 70B9;;;;N;;;;; +335D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE;So;0;L;<compat> 0035 70B9;;;;N;;;;; +335E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX;So;0;L;<compat> 0036 70B9;;;;N;;;;; +335F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN;So;0;L;<compat> 0037 70B9;;;;N;;;;; +3360;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT;So;0;L;<compat> 0038 70B9;;;;N;;;;; +3361;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE;So;0;L;<compat> 0039 70B9;;;;N;;;;; +3362;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN;So;0;L;<compat> 0031 0030 70B9;;;;N;;;;; +3363;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN;So;0;L;<compat> 0031 0031 70B9;;;;N;;;;; +3364;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE;So;0;L;<compat> 0031 0032 70B9;;;;N;;;;; +3365;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN;So;0;L;<compat> 0031 0033 70B9;;;;N;;;;; +3366;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN;So;0;L;<compat> 0031 0034 70B9;;;;N;;;;; +3367;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN;So;0;L;<compat> 0031 0035 70B9;;;;N;;;;; +3368;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN;So;0;L;<compat> 0031 0036 70B9;;;;N;;;;; +3369;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN;So;0;L;<compat> 0031 0037 70B9;;;;N;;;;; +336A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN;So;0;L;<compat> 0031 0038 70B9;;;;N;;;;; +336B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN;So;0;L;<compat> 0031 0039 70B9;;;;N;;;;; +336C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY;So;0;L;<compat> 0032 0030 70B9;;;;N;;;;; +336D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE;So;0;L;<compat> 0032 0031 70B9;;;;N;;;;; +336E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO;So;0;L;<compat> 0032 0032 70B9;;;;N;;;;; +336F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE;So;0;L;<compat> 0032 0033 70B9;;;;N;;;;; +3370;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR;So;0;L;<compat> 0032 0034 70B9;;;;N;;;;; +3371;SQUARE HPA;So;0;L;<square> 0068 0050 0061;;;;N;;;;; +3372;SQUARE DA;So;0;L;<square> 0064 0061;;;;N;;;;; +3373;SQUARE AU;So;0;L;<square> 0041 0055;;;;N;;;;; +3374;SQUARE BAR;So;0;L;<square> 0062 0061 0072;;;;N;;;;; +3375;SQUARE OV;So;0;L;<square> 006F 0056;;;;N;;;;; +3376;SQUARE PC;So;0;L;<square> 0070 0063;;;;N;;;;; +337B;SQUARE ERA NAME HEISEI;So;0;L;<square> 5E73 6210;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME HEISEI;;;; +337C;SQUARE ERA NAME SYOUWA;So;0;L;<square> 662D 548C;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA;;;; +337D;SQUARE ERA NAME TAISYOU;So;0;L;<square> 5927 6B63;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU;;;; +337E;SQUARE ERA NAME MEIZI;So;0;L;<square> 660E 6CBB;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME MEIZI;;;; +337F;SQUARE CORPORATION;So;0;L;<square> 682A 5F0F 4F1A 793E;;;;N;SQUARED FOUR IDEOGRAPHS CORPORATION;;;; +3380;SQUARE PA AMPS;So;0;L;<square> 0070 0041;;;;N;SQUARED PA AMPS;;;; +3381;SQUARE NA;So;0;L;<square> 006E 0041;;;;N;SQUARED NA;;;; +3382;SQUARE MU A;So;0;L;<square> 03BC 0041;;;;N;SQUARED MU A;;;; +3383;SQUARE MA;So;0;L;<square> 006D 0041;;;;N;SQUARED MA;;;; +3384;SQUARE KA;So;0;L;<square> 006B 0041;;;;N;SQUARED KA;;;; +3385;SQUARE KB;So;0;L;<square> 004B 0042;;;;N;SQUARED KB;;;; +3386;SQUARE MB;So;0;L;<square> 004D 0042;;;;N;SQUARED MB;;;; +3387;SQUARE GB;So;0;L;<square> 0047 0042;;;;N;SQUARED GB;;;; +3388;SQUARE CAL;So;0;L;<square> 0063 0061 006C;;;;N;SQUARED CAL;;;; +3389;SQUARE KCAL;So;0;L;<square> 006B 0063 0061 006C;;;;N;SQUARED KCAL;;;; +338A;SQUARE PF;So;0;L;<square> 0070 0046;;;;N;SQUARED PF;;;; +338B;SQUARE NF;So;0;L;<square> 006E 0046;;;;N;SQUARED NF;;;; +338C;SQUARE MU F;So;0;L;<square> 03BC 0046;;;;N;SQUARED MU F;;;; +338D;SQUARE MU G;So;0;L;<square> 03BC 0067;;;;N;SQUARED MU G;;;; +338E;SQUARE MG;So;0;L;<square> 006D 0067;;;;N;SQUARED MG;;;; +338F;SQUARE KG;So;0;L;<square> 006B 0067;;;;N;SQUARED KG;;;; +3390;SQUARE HZ;So;0;L;<square> 0048 007A;;;;N;SQUARED HZ;;;; +3391;SQUARE KHZ;So;0;L;<square> 006B 0048 007A;;;;N;SQUARED KHZ;;;; +3392;SQUARE MHZ;So;0;L;<square> 004D 0048 007A;;;;N;SQUARED MHZ;;;; +3393;SQUARE GHZ;So;0;L;<square> 0047 0048 007A;;;;N;SQUARED GHZ;;;; +3394;SQUARE THZ;So;0;L;<square> 0054 0048 007A;;;;N;SQUARED THZ;;;; +3395;SQUARE MU L;So;0;L;<square> 03BC 2113;;;;N;SQUARED MU L;;;; +3396;SQUARE ML;So;0;L;<square> 006D 2113;;;;N;SQUARED ML;;;; +3397;SQUARE DL;So;0;L;<square> 0064 2113;;;;N;SQUARED DL;;;; +3398;SQUARE KL;So;0;L;<square> 006B 2113;;;;N;SQUARED KL;;;; +3399;SQUARE FM;So;0;L;<square> 0066 006D;;;;N;SQUARED FM;;;; +339A;SQUARE NM;So;0;L;<square> 006E 006D;;;;N;SQUARED NM;;;; +339B;SQUARE MU M;So;0;L;<square> 03BC 006D;;;;N;SQUARED MU M;;;; +339C;SQUARE MM;So;0;L;<square> 006D 006D;;;;N;SQUARED MM;;;; +339D;SQUARE CM;So;0;L;<square> 0063 006D;;;;N;SQUARED CM;;;; +339E;SQUARE KM;So;0;L;<square> 006B 006D;;;;N;SQUARED KM;;;; +339F;SQUARE MM SQUARED;So;0;L;<square> 006D 006D 00B2;;;;N;SQUARED MM SQUARED;;;; +33A0;SQUARE CM SQUARED;So;0;L;<square> 0063 006D 00B2;;;;N;SQUARED CM SQUARED;;;; +33A1;SQUARE M SQUARED;So;0;L;<square> 006D 00B2;;;;N;SQUARED M SQUARED;;;; +33A2;SQUARE KM SQUARED;So;0;L;<square> 006B 006D 00B2;;;;N;SQUARED KM SQUARED;;;; +33A3;SQUARE MM CUBED;So;0;L;<square> 006D 006D 00B3;;;;N;SQUARED MM CUBED;;;; +33A4;SQUARE CM CUBED;So;0;L;<square> 0063 006D 00B3;;;;N;SQUARED CM CUBED;;;; +33A5;SQUARE M CUBED;So;0;L;<square> 006D 00B3;;;;N;SQUARED M CUBED;;;; +33A6;SQUARE KM CUBED;So;0;L;<square> 006B 006D 00B3;;;;N;SQUARED KM CUBED;;;; +33A7;SQUARE M OVER S;So;0;L;<square> 006D 2215 0073;;;;N;SQUARED M OVER S;;;; +33A8;SQUARE M OVER S SQUARED;So;0;L;<square> 006D 2215 0073 00B2;;;;N;SQUARED M OVER S SQUARED;;;; +33A9;SQUARE PA;So;0;L;<square> 0050 0061;;;;N;SQUARED PA;;;; +33AA;SQUARE KPA;So;0;L;<square> 006B 0050 0061;;;;N;SQUARED KPA;;;; +33AB;SQUARE MPA;So;0;L;<square> 004D 0050 0061;;;;N;SQUARED MPA;;;; +33AC;SQUARE GPA;So;0;L;<square> 0047 0050 0061;;;;N;SQUARED GPA;;;; +33AD;SQUARE RAD;So;0;L;<square> 0072 0061 0064;;;;N;SQUARED RAD;;;; +33AE;SQUARE RAD OVER S;So;0;L;<square> 0072 0061 0064 2215 0073;;;;N;SQUARED RAD OVER S;;;; +33AF;SQUARE RAD OVER S SQUARED;So;0;L;<square> 0072 0061 0064 2215 0073 00B2;;;;N;SQUARED RAD OVER S SQUARED;;;; +33B0;SQUARE PS;So;0;L;<square> 0070 0073;;;;N;SQUARED PS;;;; +33B1;SQUARE NS;So;0;L;<square> 006E 0073;;;;N;SQUARED NS;;;; +33B2;SQUARE MU S;So;0;L;<square> 03BC 0073;;;;N;SQUARED MU S;;;; +33B3;SQUARE MS;So;0;L;<square> 006D 0073;;;;N;SQUARED MS;;;; +33B4;SQUARE PV;So;0;L;<square> 0070 0056;;;;N;SQUARED PV;;;; +33B5;SQUARE NV;So;0;L;<square> 006E 0056;;;;N;SQUARED NV;;;; +33B6;SQUARE MU V;So;0;L;<square> 03BC 0056;;;;N;SQUARED MU V;;;; +33B7;SQUARE MV;So;0;L;<square> 006D 0056;;;;N;SQUARED MV;;;; +33B8;SQUARE KV;So;0;L;<square> 006B 0056;;;;N;SQUARED KV;;;; +33B9;SQUARE MV MEGA;So;0;L;<square> 004D 0056;;;;N;SQUARED MV MEGA;;;; +33BA;SQUARE PW;So;0;L;<square> 0070 0057;;;;N;SQUARED PW;;;; +33BB;SQUARE NW;So;0;L;<square> 006E 0057;;;;N;SQUARED NW;;;; +33BC;SQUARE MU W;So;0;L;<square> 03BC 0057;;;;N;SQUARED MU W;;;; +33BD;SQUARE MW;So;0;L;<square> 006D 0057;;;;N;SQUARED MW;;;; +33BE;SQUARE KW;So;0;L;<square> 006B 0057;;;;N;SQUARED KW;;;; +33BF;SQUARE MW MEGA;So;0;L;<square> 004D 0057;;;;N;SQUARED MW MEGA;;;; +33C0;SQUARE K OHM;So;0;L;<square> 006B 03A9;;;;N;SQUARED K OHM;;;; +33C1;SQUARE M OHM;So;0;L;<square> 004D 03A9;;;;N;SQUARED M OHM;;;; +33C2;SQUARE AM;So;0;L;<square> 0061 002E 006D 002E;;;;N;SQUARED AM;;;; +33C3;SQUARE BQ;So;0;L;<square> 0042 0071;;;;N;SQUARED BQ;;;; +33C4;SQUARE CC;So;0;L;<square> 0063 0063;;;;N;SQUARED CC;;;; +33C5;SQUARE CD;So;0;L;<square> 0063 0064;;;;N;SQUARED CD;;;; +33C6;SQUARE C OVER KG;So;0;L;<square> 0043 2215 006B 0067;;;;N;SQUARED C OVER KG;;;; +33C7;SQUARE CO;So;0;L;<square> 0043 006F 002E;;;;N;SQUARED CO;;;; +33C8;SQUARE DB;So;0;L;<square> 0064 0042;;;;N;SQUARED DB;;;; +33C9;SQUARE GY;So;0;L;<square> 0047 0079;;;;N;SQUARED GY;;;; +33CA;SQUARE HA;So;0;L;<square> 0068 0061;;;;N;SQUARED HA;;;; +33CB;SQUARE HP;So;0;L;<square> 0048 0050;;;;N;SQUARED HP;;;; +33CC;SQUARE IN;So;0;L;<square> 0069 006E;;;;N;SQUARED IN;;;; +33CD;SQUARE KK;So;0;L;<square> 004B 004B;;;;N;SQUARED KK;;;; +33CE;SQUARE KM CAPITAL;So;0;L;<square> 004B 004D;;;;N;SQUARED KM CAPITAL;;;; +33CF;SQUARE KT;So;0;L;<square> 006B 0074;;;;N;SQUARED KT;;;; +33D0;SQUARE LM;So;0;L;<square> 006C 006D;;;;N;SQUARED LM;;;; +33D1;SQUARE LN;So;0;L;<square> 006C 006E;;;;N;SQUARED LN;;;; +33D2;SQUARE LOG;So;0;L;<square> 006C 006F 0067;;;;N;SQUARED LOG;;;; +33D3;SQUARE LX;So;0;L;<square> 006C 0078;;;;N;SQUARED LX;;;; +33D4;SQUARE MB SMALL;So;0;L;<square> 006D 0062;;;;N;SQUARED MB SMALL;;;; +33D5;SQUARE MIL;So;0;L;<square> 006D 0069 006C;;;;N;SQUARED MIL;;;; +33D6;SQUARE MOL;So;0;L;<square> 006D 006F 006C;;;;N;SQUARED MOL;;;; +33D7;SQUARE PH;So;0;L;<square> 0050 0048;;;;N;SQUARED PH;;;; +33D8;SQUARE PM;So;0;L;<square> 0070 002E 006D 002E;;;;N;SQUARED PM;;;; +33D9;SQUARE PPM;So;0;L;<square> 0050 0050 004D;;;;N;SQUARED PPM;;;; +33DA;SQUARE PR;So;0;L;<square> 0050 0052;;;;N;SQUARED PR;;;; +33DB;SQUARE SR;So;0;L;<square> 0073 0072;;;;N;SQUARED SR;;;; +33DC;SQUARE SV;So;0;L;<square> 0053 0076;;;;N;SQUARED SV;;;; +33DD;SQUARE WB;So;0;L;<square> 0057 0062;;;;N;SQUARED WB;;;; +33E0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE;So;0;L;<compat> 0031 65E5;;;;N;;;;; +33E1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO;So;0;L;<compat> 0032 65E5;;;;N;;;;; +33E2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE;So;0;L;<compat> 0033 65E5;;;;N;;;;; +33E3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR;So;0;L;<compat> 0034 65E5;;;;N;;;;; +33E4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE;So;0;L;<compat> 0035 65E5;;;;N;;;;; +33E5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX;So;0;L;<compat> 0036 65E5;;;;N;;;;; +33E6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN;So;0;L;<compat> 0037 65E5;;;;N;;;;; +33E7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT;So;0;L;<compat> 0038 65E5;;;;N;;;;; +33E8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE;So;0;L;<compat> 0039 65E5;;;;N;;;;; +33E9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN;So;0;L;<compat> 0031 0030 65E5;;;;N;;;;; +33EA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN;So;0;L;<compat> 0031 0031 65E5;;;;N;;;;; +33EB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE;So;0;L;<compat> 0031 0032 65E5;;;;N;;;;; +33EC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN;So;0;L;<compat> 0031 0033 65E5;;;;N;;;;; +33ED;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN;So;0;L;<compat> 0031 0034 65E5;;;;N;;;;; +33EE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN;So;0;L;<compat> 0031 0035 65E5;;;;N;;;;; +33EF;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN;So;0;L;<compat> 0031 0036 65E5;;;;N;;;;; +33F0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN;So;0;L;<compat> 0031 0037 65E5;;;;N;;;;; +33F1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN;So;0;L;<compat> 0031 0038 65E5;;;;N;;;;; +33F2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN;So;0;L;<compat> 0031 0039 65E5;;;;N;;;;; +33F3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY;So;0;L;<compat> 0032 0030 65E5;;;;N;;;;; +33F4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE;So;0;L;<compat> 0032 0031 65E5;;;;N;;;;; +33F5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO;So;0;L;<compat> 0032 0032 65E5;;;;N;;;;; +33F6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE;So;0;L;<compat> 0032 0033 65E5;;;;N;;;;; +33F7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR;So;0;L;<compat> 0032 0034 65E5;;;;N;;;;; +33F8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE;So;0;L;<compat> 0032 0035 65E5;;;;N;;;;; +33F9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX;So;0;L;<compat> 0032 0036 65E5;;;;N;;;;; +33FA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN;So;0;L;<compat> 0032 0037 65E5;;;;N;;;;; +33FB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT;So;0;L;<compat> 0032 0038 65E5;;;;N;;;;; +33FC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE;So;0;L;<compat> 0032 0039 65E5;;;;N;;;;; +33FD;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY;So;0;L;<compat> 0033 0030 65E5;;;;N;;;;; +33FE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE;So;0;L;<compat> 0033 0031 65E5;;;;N;;;;; +3400;<CJK Ideograph Extension A, First>;Lo;0;L;;;;;N;;;;; +4DB5;<CJK Ideograph Extension A, Last>;Lo;0;L;;;;;N;;;;; +4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;; +9FA5;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;; +A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;; +A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;; +A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;; +A003;YI SYLLABLE IP;Lo;0;L;;;;;N;;;;; +A004;YI SYLLABLE IET;Lo;0;L;;;;;N;;;;; +A005;YI SYLLABLE IEX;Lo;0;L;;;;;N;;;;; +A006;YI SYLLABLE IE;Lo;0;L;;;;;N;;;;; +A007;YI SYLLABLE IEP;Lo;0;L;;;;;N;;;;; +A008;YI SYLLABLE AT;Lo;0;L;;;;;N;;;;; +A009;YI SYLLABLE AX;Lo;0;L;;;;;N;;;;; +A00A;YI SYLLABLE A;Lo;0;L;;;;;N;;;;; +A00B;YI SYLLABLE AP;Lo;0;L;;;;;N;;;;; +A00C;YI SYLLABLE UOX;Lo;0;L;;;;;N;;;;; +A00D;YI SYLLABLE UO;Lo;0;L;;;;;N;;;;; +A00E;YI SYLLABLE UOP;Lo;0;L;;;;;N;;;;; +A00F;YI SYLLABLE OT;Lo;0;L;;;;;N;;;;; +A010;YI SYLLABLE OX;Lo;0;L;;;;;N;;;;; +A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;; +A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;; +A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;; +A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;; +A015;YI SYLLABLE WU;Lo;0;L;;;;;N;;;;; +A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;; +A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;; +A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;; +A019;YI SYLLABLE BIP;Lo;0;L;;;;;N;;;;; +A01A;YI SYLLABLE BIET;Lo;0;L;;;;;N;;;;; +A01B;YI SYLLABLE BIEX;Lo;0;L;;;;;N;;;;; +A01C;YI SYLLABLE BIE;Lo;0;L;;;;;N;;;;; +A01D;YI SYLLABLE BIEP;Lo;0;L;;;;;N;;;;; +A01E;YI SYLLABLE BAT;Lo;0;L;;;;;N;;;;; +A01F;YI SYLLABLE BAX;Lo;0;L;;;;;N;;;;; +A020;YI SYLLABLE BA;Lo;0;L;;;;;N;;;;; +A021;YI SYLLABLE BAP;Lo;0;L;;;;;N;;;;; +A022;YI SYLLABLE BUOX;Lo;0;L;;;;;N;;;;; +A023;YI SYLLABLE BUO;Lo;0;L;;;;;N;;;;; +A024;YI SYLLABLE BUOP;Lo;0;L;;;;;N;;;;; +A025;YI SYLLABLE BOT;Lo;0;L;;;;;N;;;;; +A026;YI SYLLABLE BOX;Lo;0;L;;;;;N;;;;; +A027;YI SYLLABLE BO;Lo;0;L;;;;;N;;;;; +A028;YI SYLLABLE BOP;Lo;0;L;;;;;N;;;;; +A029;YI SYLLABLE BEX;Lo;0;L;;;;;N;;;;; +A02A;YI SYLLABLE BE;Lo;0;L;;;;;N;;;;; +A02B;YI SYLLABLE BEP;Lo;0;L;;;;;N;;;;; +A02C;YI SYLLABLE BUT;Lo;0;L;;;;;N;;;;; +A02D;YI SYLLABLE BUX;Lo;0;L;;;;;N;;;;; +A02E;YI SYLLABLE BU;Lo;0;L;;;;;N;;;;; +A02F;YI SYLLABLE BUP;Lo;0;L;;;;;N;;;;; +A030;YI SYLLABLE BURX;Lo;0;L;;;;;N;;;;; +A031;YI SYLLABLE BUR;Lo;0;L;;;;;N;;;;; +A032;YI SYLLABLE BYT;Lo;0;L;;;;;N;;;;; +A033;YI SYLLABLE BYX;Lo;0;L;;;;;N;;;;; +A034;YI SYLLABLE BY;Lo;0;L;;;;;N;;;;; +A035;YI SYLLABLE BYP;Lo;0;L;;;;;N;;;;; +A036;YI SYLLABLE BYRX;Lo;0;L;;;;;N;;;;; +A037;YI SYLLABLE BYR;Lo;0;L;;;;;N;;;;; +A038;YI SYLLABLE PIT;Lo;0;L;;;;;N;;;;; +A039;YI SYLLABLE PIX;Lo;0;L;;;;;N;;;;; +A03A;YI SYLLABLE PI;Lo;0;L;;;;;N;;;;; +A03B;YI SYLLABLE PIP;Lo;0;L;;;;;N;;;;; +A03C;YI SYLLABLE PIEX;Lo;0;L;;;;;N;;;;; +A03D;YI SYLLABLE PIE;Lo;0;L;;;;;N;;;;; +A03E;YI SYLLABLE PIEP;Lo;0;L;;;;;N;;;;; +A03F;YI SYLLABLE PAT;Lo;0;L;;;;;N;;;;; +A040;YI SYLLABLE PAX;Lo;0;L;;;;;N;;;;; +A041;YI SYLLABLE PA;Lo;0;L;;;;;N;;;;; +A042;YI SYLLABLE PAP;Lo;0;L;;;;;N;;;;; +A043;YI SYLLABLE PUOX;Lo;0;L;;;;;N;;;;; +A044;YI SYLLABLE PUO;Lo;0;L;;;;;N;;;;; +A045;YI SYLLABLE PUOP;Lo;0;L;;;;;N;;;;; +A046;YI SYLLABLE POT;Lo;0;L;;;;;N;;;;; +A047;YI SYLLABLE POX;Lo;0;L;;;;;N;;;;; +A048;YI SYLLABLE PO;Lo;0;L;;;;;N;;;;; +A049;YI SYLLABLE POP;Lo;0;L;;;;;N;;;;; +A04A;YI SYLLABLE PUT;Lo;0;L;;;;;N;;;;; +A04B;YI SYLLABLE PUX;Lo;0;L;;;;;N;;;;; +A04C;YI SYLLABLE PU;Lo;0;L;;;;;N;;;;; +A04D;YI SYLLABLE PUP;Lo;0;L;;;;;N;;;;; +A04E;YI SYLLABLE PURX;Lo;0;L;;;;;N;;;;; +A04F;YI SYLLABLE PUR;Lo;0;L;;;;;N;;;;; +A050;YI SYLLABLE PYT;Lo;0;L;;;;;N;;;;; +A051;YI SYLLABLE PYX;Lo;0;L;;;;;N;;;;; +A052;YI SYLLABLE PY;Lo;0;L;;;;;N;;;;; +A053;YI SYLLABLE PYP;Lo;0;L;;;;;N;;;;; +A054;YI SYLLABLE PYRX;Lo;0;L;;;;;N;;;;; +A055;YI SYLLABLE PYR;Lo;0;L;;;;;N;;;;; +A056;YI SYLLABLE BBIT;Lo;0;L;;;;;N;;;;; +A057;YI SYLLABLE BBIX;Lo;0;L;;;;;N;;;;; +A058;YI SYLLABLE BBI;Lo;0;L;;;;;N;;;;; +A059;YI SYLLABLE BBIP;Lo;0;L;;;;;N;;;;; +A05A;YI SYLLABLE BBIET;Lo;0;L;;;;;N;;;;; +A05B;YI SYLLABLE BBIEX;Lo;0;L;;;;;N;;;;; +A05C;YI SYLLABLE BBIE;Lo;0;L;;;;;N;;;;; +A05D;YI SYLLABLE BBIEP;Lo;0;L;;;;;N;;;;; +A05E;YI SYLLABLE BBAT;Lo;0;L;;;;;N;;;;; +A05F;YI SYLLABLE BBAX;Lo;0;L;;;;;N;;;;; +A060;YI SYLLABLE BBA;Lo;0;L;;;;;N;;;;; +A061;YI SYLLABLE BBAP;Lo;0;L;;;;;N;;;;; +A062;YI SYLLABLE BBUOX;Lo;0;L;;;;;N;;;;; +A063;YI SYLLABLE BBUO;Lo;0;L;;;;;N;;;;; +A064;YI SYLLABLE BBUOP;Lo;0;L;;;;;N;;;;; +A065;YI SYLLABLE BBOT;Lo;0;L;;;;;N;;;;; +A066;YI SYLLABLE BBOX;Lo;0;L;;;;;N;;;;; +A067;YI SYLLABLE BBO;Lo;0;L;;;;;N;;;;; +A068;YI SYLLABLE BBOP;Lo;0;L;;;;;N;;;;; +A069;YI SYLLABLE BBEX;Lo;0;L;;;;;N;;;;; +A06A;YI SYLLABLE BBE;Lo;0;L;;;;;N;;;;; +A06B;YI SYLLABLE BBEP;Lo;0;L;;;;;N;;;;; +A06C;YI SYLLABLE BBUT;Lo;0;L;;;;;N;;;;; +A06D;YI SYLLABLE BBUX;Lo;0;L;;;;;N;;;;; +A06E;YI SYLLABLE BBU;Lo;0;L;;;;;N;;;;; +A06F;YI SYLLABLE BBUP;Lo;0;L;;;;;N;;;;; +A070;YI SYLLABLE BBURX;Lo;0;L;;;;;N;;;;; +A071;YI SYLLABLE BBUR;Lo;0;L;;;;;N;;;;; +A072;YI SYLLABLE BBYT;Lo;0;L;;;;;N;;;;; +A073;YI SYLLABLE BBYX;Lo;0;L;;;;;N;;;;; +A074;YI SYLLABLE BBY;Lo;0;L;;;;;N;;;;; +A075;YI SYLLABLE BBYP;Lo;0;L;;;;;N;;;;; +A076;YI SYLLABLE NBIT;Lo;0;L;;;;;N;;;;; +A077;YI SYLLABLE NBIX;Lo;0;L;;;;;N;;;;; +A078;YI SYLLABLE NBI;Lo;0;L;;;;;N;;;;; +A079;YI SYLLABLE NBIP;Lo;0;L;;;;;N;;;;; +A07A;YI SYLLABLE NBIEX;Lo;0;L;;;;;N;;;;; +A07B;YI SYLLABLE NBIE;Lo;0;L;;;;;N;;;;; +A07C;YI SYLLABLE NBIEP;Lo;0;L;;;;;N;;;;; +A07D;YI SYLLABLE NBAT;Lo;0;L;;;;;N;;;;; +A07E;YI SYLLABLE NBAX;Lo;0;L;;;;;N;;;;; +A07F;YI SYLLABLE NBA;Lo;0;L;;;;;N;;;;; +A080;YI SYLLABLE NBAP;Lo;0;L;;;;;N;;;;; +A081;YI SYLLABLE NBOT;Lo;0;L;;;;;N;;;;; +A082;YI SYLLABLE NBOX;Lo;0;L;;;;;N;;;;; +A083;YI SYLLABLE NBO;Lo;0;L;;;;;N;;;;; +A084;YI SYLLABLE NBOP;Lo;0;L;;;;;N;;;;; +A085;YI SYLLABLE NBUT;Lo;0;L;;;;;N;;;;; +A086;YI SYLLABLE NBUX;Lo;0;L;;;;;N;;;;; +A087;YI SYLLABLE NBU;Lo;0;L;;;;;N;;;;; +A088;YI SYLLABLE NBUP;Lo;0;L;;;;;N;;;;; +A089;YI SYLLABLE NBURX;Lo;0;L;;;;;N;;;;; +A08A;YI SYLLABLE NBUR;Lo;0;L;;;;;N;;;;; +A08B;YI SYLLABLE NBYT;Lo;0;L;;;;;N;;;;; +A08C;YI SYLLABLE NBYX;Lo;0;L;;;;;N;;;;; +A08D;YI SYLLABLE NBY;Lo;0;L;;;;;N;;;;; +A08E;YI SYLLABLE NBYP;Lo;0;L;;;;;N;;;;; +A08F;YI SYLLABLE NBYRX;Lo;0;L;;;;;N;;;;; +A090;YI SYLLABLE NBYR;Lo;0;L;;;;;N;;;;; +A091;YI SYLLABLE HMIT;Lo;0;L;;;;;N;;;;; +A092;YI SYLLABLE HMIX;Lo;0;L;;;;;N;;;;; +A093;YI SYLLABLE HMI;Lo;0;L;;;;;N;;;;; +A094;YI SYLLABLE HMIP;Lo;0;L;;;;;N;;;;; +A095;YI SYLLABLE HMIEX;Lo;0;L;;;;;N;;;;; +A096;YI SYLLABLE HMIE;Lo;0;L;;;;;N;;;;; +A097;YI SYLLABLE HMIEP;Lo;0;L;;;;;N;;;;; +A098;YI SYLLABLE HMAT;Lo;0;L;;;;;N;;;;; +A099;YI SYLLABLE HMAX;Lo;0;L;;;;;N;;;;; +A09A;YI SYLLABLE HMA;Lo;0;L;;;;;N;;;;; +A09B;YI SYLLABLE HMAP;Lo;0;L;;;;;N;;;;; +A09C;YI SYLLABLE HMUOX;Lo;0;L;;;;;N;;;;; +A09D;YI SYLLABLE HMUO;Lo;0;L;;;;;N;;;;; +A09E;YI SYLLABLE HMUOP;Lo;0;L;;;;;N;;;;; +A09F;YI SYLLABLE HMOT;Lo;0;L;;;;;N;;;;; +A0A0;YI SYLLABLE HMOX;Lo;0;L;;;;;N;;;;; +A0A1;YI SYLLABLE HMO;Lo;0;L;;;;;N;;;;; +A0A2;YI SYLLABLE HMOP;Lo;0;L;;;;;N;;;;; +A0A3;YI SYLLABLE HMUT;Lo;0;L;;;;;N;;;;; +A0A4;YI SYLLABLE HMUX;Lo;0;L;;;;;N;;;;; +A0A5;YI SYLLABLE HMU;Lo;0;L;;;;;N;;;;; +A0A6;YI SYLLABLE HMUP;Lo;0;L;;;;;N;;;;; +A0A7;YI SYLLABLE HMURX;Lo;0;L;;;;;N;;;;; +A0A8;YI SYLLABLE HMUR;Lo;0;L;;;;;N;;;;; +A0A9;YI SYLLABLE HMYX;Lo;0;L;;;;;N;;;;; +A0AA;YI SYLLABLE HMY;Lo;0;L;;;;;N;;;;; +A0AB;YI SYLLABLE HMYP;Lo;0;L;;;;;N;;;;; +A0AC;YI SYLLABLE HMYRX;Lo;0;L;;;;;N;;;;; +A0AD;YI SYLLABLE HMYR;Lo;0;L;;;;;N;;;;; +A0AE;YI SYLLABLE MIT;Lo;0;L;;;;;N;;;;; +A0AF;YI SYLLABLE MIX;Lo;0;L;;;;;N;;;;; +A0B0;YI SYLLABLE MI;Lo;0;L;;;;;N;;;;; +A0B1;YI SYLLABLE MIP;Lo;0;L;;;;;N;;;;; +A0B2;YI SYLLABLE MIEX;Lo;0;L;;;;;N;;;;; +A0B3;YI SYLLABLE MIE;Lo;0;L;;;;;N;;;;; +A0B4;YI SYLLABLE MIEP;Lo;0;L;;;;;N;;;;; +A0B5;YI SYLLABLE MAT;Lo;0;L;;;;;N;;;;; +A0B6;YI SYLLABLE MAX;Lo;0;L;;;;;N;;;;; +A0B7;YI SYLLABLE MA;Lo;0;L;;;;;N;;;;; +A0B8;YI SYLLABLE MAP;Lo;0;L;;;;;N;;;;; +A0B9;YI SYLLABLE MUOT;Lo;0;L;;;;;N;;;;; +A0BA;YI SYLLABLE MUOX;Lo;0;L;;;;;N;;;;; +A0BB;YI SYLLABLE MUO;Lo;0;L;;;;;N;;;;; +A0BC;YI SYLLABLE MUOP;Lo;0;L;;;;;N;;;;; +A0BD;YI SYLLABLE MOT;Lo;0;L;;;;;N;;;;; +A0BE;YI SYLLABLE MOX;Lo;0;L;;;;;N;;;;; +A0BF;YI SYLLABLE MO;Lo;0;L;;;;;N;;;;; +A0C0;YI SYLLABLE MOP;Lo;0;L;;;;;N;;;;; +A0C1;YI SYLLABLE MEX;Lo;0;L;;;;;N;;;;; +A0C2;YI SYLLABLE ME;Lo;0;L;;;;;N;;;;; +A0C3;YI SYLLABLE MUT;Lo;0;L;;;;;N;;;;; +A0C4;YI SYLLABLE MUX;Lo;0;L;;;;;N;;;;; +A0C5;YI SYLLABLE MU;Lo;0;L;;;;;N;;;;; +A0C6;YI SYLLABLE MUP;Lo;0;L;;;;;N;;;;; +A0C7;YI SYLLABLE MURX;Lo;0;L;;;;;N;;;;; +A0C8;YI SYLLABLE MUR;Lo;0;L;;;;;N;;;;; +A0C9;YI SYLLABLE MYT;Lo;0;L;;;;;N;;;;; +A0CA;YI SYLLABLE MYX;Lo;0;L;;;;;N;;;;; +A0CB;YI SYLLABLE MY;Lo;0;L;;;;;N;;;;; +A0CC;YI SYLLABLE MYP;Lo;0;L;;;;;N;;;;; +A0CD;YI SYLLABLE FIT;Lo;0;L;;;;;N;;;;; +A0CE;YI SYLLABLE FIX;Lo;0;L;;;;;N;;;;; +A0CF;YI SYLLABLE FI;Lo;0;L;;;;;N;;;;; +A0D0;YI SYLLABLE FIP;Lo;0;L;;;;;N;;;;; +A0D1;YI SYLLABLE FAT;Lo;0;L;;;;;N;;;;; +A0D2;YI SYLLABLE FAX;Lo;0;L;;;;;N;;;;; +A0D3;YI SYLLABLE FA;Lo;0;L;;;;;N;;;;; +A0D4;YI SYLLABLE FAP;Lo;0;L;;;;;N;;;;; +A0D5;YI SYLLABLE FOX;Lo;0;L;;;;;N;;;;; +A0D6;YI SYLLABLE FO;Lo;0;L;;;;;N;;;;; +A0D7;YI SYLLABLE FOP;Lo;0;L;;;;;N;;;;; +A0D8;YI SYLLABLE FUT;Lo;0;L;;;;;N;;;;; +A0D9;YI SYLLABLE FUX;Lo;0;L;;;;;N;;;;; +A0DA;YI SYLLABLE FU;Lo;0;L;;;;;N;;;;; +A0DB;YI SYLLABLE FUP;Lo;0;L;;;;;N;;;;; +A0DC;YI SYLLABLE FURX;Lo;0;L;;;;;N;;;;; +A0DD;YI SYLLABLE FUR;Lo;0;L;;;;;N;;;;; +A0DE;YI SYLLABLE FYT;Lo;0;L;;;;;N;;;;; +A0DF;YI SYLLABLE FYX;Lo;0;L;;;;;N;;;;; +A0E0;YI SYLLABLE FY;Lo;0;L;;;;;N;;;;; +A0E1;YI SYLLABLE FYP;Lo;0;L;;;;;N;;;;; +A0E2;YI SYLLABLE VIT;Lo;0;L;;;;;N;;;;; +A0E3;YI SYLLABLE VIX;Lo;0;L;;;;;N;;;;; +A0E4;YI SYLLABLE VI;Lo;0;L;;;;;N;;;;; +A0E5;YI SYLLABLE VIP;Lo;0;L;;;;;N;;;;; +A0E6;YI SYLLABLE VIET;Lo;0;L;;;;;N;;;;; +A0E7;YI SYLLABLE VIEX;Lo;0;L;;;;;N;;;;; +A0E8;YI SYLLABLE VIE;Lo;0;L;;;;;N;;;;; +A0E9;YI SYLLABLE VIEP;Lo;0;L;;;;;N;;;;; +A0EA;YI SYLLABLE VAT;Lo;0;L;;;;;N;;;;; +A0EB;YI SYLLABLE VAX;Lo;0;L;;;;;N;;;;; +A0EC;YI SYLLABLE VA;Lo;0;L;;;;;N;;;;; +A0ED;YI SYLLABLE VAP;Lo;0;L;;;;;N;;;;; +A0EE;YI SYLLABLE VOT;Lo;0;L;;;;;N;;;;; +A0EF;YI SYLLABLE VOX;Lo;0;L;;;;;N;;;;; +A0F0;YI SYLLABLE VO;Lo;0;L;;;;;N;;;;; +A0F1;YI SYLLABLE VOP;Lo;0;L;;;;;N;;;;; +A0F2;YI SYLLABLE VEX;Lo;0;L;;;;;N;;;;; +A0F3;YI SYLLABLE VEP;Lo;0;L;;;;;N;;;;; +A0F4;YI SYLLABLE VUT;Lo;0;L;;;;;N;;;;; +A0F5;YI SYLLABLE VUX;Lo;0;L;;;;;N;;;;; +A0F6;YI SYLLABLE VU;Lo;0;L;;;;;N;;;;; +A0F7;YI SYLLABLE VUP;Lo;0;L;;;;;N;;;;; +A0F8;YI SYLLABLE VURX;Lo;0;L;;;;;N;;;;; +A0F9;YI SYLLABLE VUR;Lo;0;L;;;;;N;;;;; +A0FA;YI SYLLABLE VYT;Lo;0;L;;;;;N;;;;; +A0FB;YI SYLLABLE VYX;Lo;0;L;;;;;N;;;;; +A0FC;YI SYLLABLE VY;Lo;0;L;;;;;N;;;;; +A0FD;YI SYLLABLE VYP;Lo;0;L;;;;;N;;;;; +A0FE;YI SYLLABLE VYRX;Lo;0;L;;;;;N;;;;; +A0FF;YI SYLLABLE VYR;Lo;0;L;;;;;N;;;;; +A100;YI SYLLABLE DIT;Lo;0;L;;;;;N;;;;; +A101;YI SYLLABLE DIX;Lo;0;L;;;;;N;;;;; +A102;YI SYLLABLE DI;Lo;0;L;;;;;N;;;;; +A103;YI SYLLABLE DIP;Lo;0;L;;;;;N;;;;; +A104;YI SYLLABLE DIEX;Lo;0;L;;;;;N;;;;; +A105;YI SYLLABLE DIE;Lo;0;L;;;;;N;;;;; +A106;YI SYLLABLE DIEP;Lo;0;L;;;;;N;;;;; +A107;YI SYLLABLE DAT;Lo;0;L;;;;;N;;;;; +A108;YI SYLLABLE DAX;Lo;0;L;;;;;N;;;;; +A109;YI SYLLABLE DA;Lo;0;L;;;;;N;;;;; +A10A;YI SYLLABLE DAP;Lo;0;L;;;;;N;;;;; +A10B;YI SYLLABLE DUOX;Lo;0;L;;;;;N;;;;; +A10C;YI SYLLABLE DUO;Lo;0;L;;;;;N;;;;; +A10D;YI SYLLABLE DOT;Lo;0;L;;;;;N;;;;; +A10E;YI SYLLABLE DOX;Lo;0;L;;;;;N;;;;; +A10F;YI SYLLABLE DO;Lo;0;L;;;;;N;;;;; +A110;YI SYLLABLE DOP;Lo;0;L;;;;;N;;;;; +A111;YI SYLLABLE DEX;Lo;0;L;;;;;N;;;;; +A112;YI SYLLABLE DE;Lo;0;L;;;;;N;;;;; +A113;YI SYLLABLE DEP;Lo;0;L;;;;;N;;;;; +A114;YI SYLLABLE DUT;Lo;0;L;;;;;N;;;;; +A115;YI SYLLABLE DUX;Lo;0;L;;;;;N;;;;; +A116;YI SYLLABLE DU;Lo;0;L;;;;;N;;;;; +A117;YI SYLLABLE DUP;Lo;0;L;;;;;N;;;;; +A118;YI SYLLABLE DURX;Lo;0;L;;;;;N;;;;; +A119;YI SYLLABLE DUR;Lo;0;L;;;;;N;;;;; +A11A;YI SYLLABLE TIT;Lo;0;L;;;;;N;;;;; +A11B;YI SYLLABLE TIX;Lo;0;L;;;;;N;;;;; +A11C;YI SYLLABLE TI;Lo;0;L;;;;;N;;;;; +A11D;YI SYLLABLE TIP;Lo;0;L;;;;;N;;;;; +A11E;YI SYLLABLE TIEX;Lo;0;L;;;;;N;;;;; +A11F;YI SYLLABLE TIE;Lo;0;L;;;;;N;;;;; +A120;YI SYLLABLE TIEP;Lo;0;L;;;;;N;;;;; +A121;YI SYLLABLE TAT;Lo;0;L;;;;;N;;;;; +A122;YI SYLLABLE TAX;Lo;0;L;;;;;N;;;;; +A123;YI SYLLABLE TA;Lo;0;L;;;;;N;;;;; +A124;YI SYLLABLE TAP;Lo;0;L;;;;;N;;;;; +A125;YI SYLLABLE TUOT;Lo;0;L;;;;;N;;;;; +A126;YI SYLLABLE TUOX;Lo;0;L;;;;;N;;;;; +A127;YI SYLLABLE TUO;Lo;0;L;;;;;N;;;;; +A128;YI SYLLABLE TUOP;Lo;0;L;;;;;N;;;;; +A129;YI SYLLABLE TOT;Lo;0;L;;;;;N;;;;; +A12A;YI SYLLABLE TOX;Lo;0;L;;;;;N;;;;; +A12B;YI SYLLABLE TO;Lo;0;L;;;;;N;;;;; +A12C;YI SYLLABLE TOP;Lo;0;L;;;;;N;;;;; +A12D;YI SYLLABLE TEX;Lo;0;L;;;;;N;;;;; +A12E;YI SYLLABLE TE;Lo;0;L;;;;;N;;;;; +A12F;YI SYLLABLE TEP;Lo;0;L;;;;;N;;;;; +A130;YI SYLLABLE TUT;Lo;0;L;;;;;N;;;;; +A131;YI SYLLABLE TUX;Lo;0;L;;;;;N;;;;; +A132;YI SYLLABLE TU;Lo;0;L;;;;;N;;;;; +A133;YI SYLLABLE TUP;Lo;0;L;;;;;N;;;;; +A134;YI SYLLABLE TURX;Lo;0;L;;;;;N;;;;; +A135;YI SYLLABLE TUR;Lo;0;L;;;;;N;;;;; +A136;YI SYLLABLE DDIT;Lo;0;L;;;;;N;;;;; +A137;YI SYLLABLE DDIX;Lo;0;L;;;;;N;;;;; +A138;YI SYLLABLE DDI;Lo;0;L;;;;;N;;;;; +A139;YI SYLLABLE DDIP;Lo;0;L;;;;;N;;;;; +A13A;YI SYLLABLE DDIEX;Lo;0;L;;;;;N;;;;; +A13B;YI SYLLABLE DDIE;Lo;0;L;;;;;N;;;;; +A13C;YI SYLLABLE DDIEP;Lo;0;L;;;;;N;;;;; +A13D;YI SYLLABLE DDAT;Lo;0;L;;;;;N;;;;; +A13E;YI SYLLABLE DDAX;Lo;0;L;;;;;N;;;;; +A13F;YI SYLLABLE DDA;Lo;0;L;;;;;N;;;;; +A140;YI SYLLABLE DDAP;Lo;0;L;;;;;N;;;;; +A141;YI SYLLABLE DDUOX;Lo;0;L;;;;;N;;;;; +A142;YI SYLLABLE DDUO;Lo;0;L;;;;;N;;;;; +A143;YI SYLLABLE DDUOP;Lo;0;L;;;;;N;;;;; +A144;YI SYLLABLE DDOT;Lo;0;L;;;;;N;;;;; +A145;YI SYLLABLE DDOX;Lo;0;L;;;;;N;;;;; +A146;YI SYLLABLE DDO;Lo;0;L;;;;;N;;;;; +A147;YI SYLLABLE DDOP;Lo;0;L;;;;;N;;;;; +A148;YI SYLLABLE DDEX;Lo;0;L;;;;;N;;;;; +A149;YI SYLLABLE DDE;Lo;0;L;;;;;N;;;;; +A14A;YI SYLLABLE DDEP;Lo;0;L;;;;;N;;;;; +A14B;YI SYLLABLE DDUT;Lo;0;L;;;;;N;;;;; +A14C;YI SYLLABLE DDUX;Lo;0;L;;;;;N;;;;; +A14D;YI SYLLABLE DDU;Lo;0;L;;;;;N;;;;; +A14E;YI SYLLABLE DDUP;Lo;0;L;;;;;N;;;;; +A14F;YI SYLLABLE DDURX;Lo;0;L;;;;;N;;;;; +A150;YI SYLLABLE DDUR;Lo;0;L;;;;;N;;;;; +A151;YI SYLLABLE NDIT;Lo;0;L;;;;;N;;;;; +A152;YI SYLLABLE NDIX;Lo;0;L;;;;;N;;;;; +A153;YI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; +A154;YI SYLLABLE NDIP;Lo;0;L;;;;;N;;;;; +A155;YI SYLLABLE NDIEX;Lo;0;L;;;;;N;;;;; +A156;YI SYLLABLE NDIE;Lo;0;L;;;;;N;;;;; +A157;YI SYLLABLE NDAT;Lo;0;L;;;;;N;;;;; +A158;YI SYLLABLE NDAX;Lo;0;L;;;;;N;;;;; +A159;YI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; +A15A;YI SYLLABLE NDAP;Lo;0;L;;;;;N;;;;; +A15B;YI SYLLABLE NDOT;Lo;0;L;;;;;N;;;;; +A15C;YI SYLLABLE NDOX;Lo;0;L;;;;;N;;;;; +A15D;YI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; +A15E;YI SYLLABLE NDOP;Lo;0;L;;;;;N;;;;; +A15F;YI SYLLABLE NDEX;Lo;0;L;;;;;N;;;;; +A160;YI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; +A161;YI SYLLABLE NDEP;Lo;0;L;;;;;N;;;;; +A162;YI SYLLABLE NDUT;Lo;0;L;;;;;N;;;;; +A163;YI SYLLABLE NDUX;Lo;0;L;;;;;N;;;;; +A164;YI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; +A165;YI SYLLABLE NDUP;Lo;0;L;;;;;N;;;;; +A166;YI SYLLABLE NDURX;Lo;0;L;;;;;N;;;;; +A167;YI SYLLABLE NDUR;Lo;0;L;;;;;N;;;;; +A168;YI SYLLABLE HNIT;Lo;0;L;;;;;N;;;;; +A169;YI SYLLABLE HNIX;Lo;0;L;;;;;N;;;;; +A16A;YI SYLLABLE HNI;Lo;0;L;;;;;N;;;;; +A16B;YI SYLLABLE HNIP;Lo;0;L;;;;;N;;;;; +A16C;YI SYLLABLE HNIET;Lo;0;L;;;;;N;;;;; +A16D;YI SYLLABLE HNIEX;Lo;0;L;;;;;N;;;;; +A16E;YI SYLLABLE HNIE;Lo;0;L;;;;;N;;;;; +A16F;YI SYLLABLE HNIEP;Lo;0;L;;;;;N;;;;; +A170;YI SYLLABLE HNAT;Lo;0;L;;;;;N;;;;; +A171;YI SYLLABLE HNAX;Lo;0;L;;;;;N;;;;; +A172;YI SYLLABLE HNA;Lo;0;L;;;;;N;;;;; +A173;YI SYLLABLE HNAP;Lo;0;L;;;;;N;;;;; +A174;YI SYLLABLE HNUOX;Lo;0;L;;;;;N;;;;; +A175;YI SYLLABLE HNUO;Lo;0;L;;;;;N;;;;; +A176;YI SYLLABLE HNOT;Lo;0;L;;;;;N;;;;; +A177;YI SYLLABLE HNOX;Lo;0;L;;;;;N;;;;; +A178;YI SYLLABLE HNOP;Lo;0;L;;;;;N;;;;; +A179;YI SYLLABLE HNEX;Lo;0;L;;;;;N;;;;; +A17A;YI SYLLABLE HNE;Lo;0;L;;;;;N;;;;; +A17B;YI SYLLABLE HNEP;Lo;0;L;;;;;N;;;;; +A17C;YI SYLLABLE HNUT;Lo;0;L;;;;;N;;;;; +A17D;YI SYLLABLE NIT;Lo;0;L;;;;;N;;;;; +A17E;YI SYLLABLE NIX;Lo;0;L;;;;;N;;;;; +A17F;YI SYLLABLE NI;Lo;0;L;;;;;N;;;;; +A180;YI SYLLABLE NIP;Lo;0;L;;;;;N;;;;; +A181;YI SYLLABLE NIEX;Lo;0;L;;;;;N;;;;; +A182;YI SYLLABLE NIE;Lo;0;L;;;;;N;;;;; +A183;YI SYLLABLE NIEP;Lo;0;L;;;;;N;;;;; +A184;YI SYLLABLE NAX;Lo;0;L;;;;;N;;;;; +A185;YI SYLLABLE NA;Lo;0;L;;;;;N;;;;; +A186;YI SYLLABLE NAP;Lo;0;L;;;;;N;;;;; +A187;YI SYLLABLE NUOX;Lo;0;L;;;;;N;;;;; +A188;YI SYLLABLE NUO;Lo;0;L;;;;;N;;;;; +A189;YI SYLLABLE NUOP;Lo;0;L;;;;;N;;;;; +A18A;YI SYLLABLE NOT;Lo;0;L;;;;;N;;;;; +A18B;YI SYLLABLE NOX;Lo;0;L;;;;;N;;;;; +A18C;YI SYLLABLE NO;Lo;0;L;;;;;N;;;;; +A18D;YI SYLLABLE NOP;Lo;0;L;;;;;N;;;;; +A18E;YI SYLLABLE NEX;Lo;0;L;;;;;N;;;;; +A18F;YI SYLLABLE NE;Lo;0;L;;;;;N;;;;; +A190;YI SYLLABLE NEP;Lo;0;L;;;;;N;;;;; +A191;YI SYLLABLE NUT;Lo;0;L;;;;;N;;;;; +A192;YI SYLLABLE NUX;Lo;0;L;;;;;N;;;;; +A193;YI SYLLABLE NU;Lo;0;L;;;;;N;;;;; +A194;YI SYLLABLE NUP;Lo;0;L;;;;;N;;;;; +A195;YI SYLLABLE NURX;Lo;0;L;;;;;N;;;;; +A196;YI SYLLABLE NUR;Lo;0;L;;;;;N;;;;; +A197;YI SYLLABLE HLIT;Lo;0;L;;;;;N;;;;; +A198;YI SYLLABLE HLIX;Lo;0;L;;;;;N;;;;; +A199;YI SYLLABLE HLI;Lo;0;L;;;;;N;;;;; +A19A;YI SYLLABLE HLIP;Lo;0;L;;;;;N;;;;; +A19B;YI SYLLABLE HLIEX;Lo;0;L;;;;;N;;;;; +A19C;YI SYLLABLE HLIE;Lo;0;L;;;;;N;;;;; +A19D;YI SYLLABLE HLIEP;Lo;0;L;;;;;N;;;;; +A19E;YI SYLLABLE HLAT;Lo;0;L;;;;;N;;;;; +A19F;YI SYLLABLE HLAX;Lo;0;L;;;;;N;;;;; +A1A0;YI SYLLABLE HLA;Lo;0;L;;;;;N;;;;; +A1A1;YI SYLLABLE HLAP;Lo;0;L;;;;;N;;;;; +A1A2;YI SYLLABLE HLUOX;Lo;0;L;;;;;N;;;;; +A1A3;YI SYLLABLE HLUO;Lo;0;L;;;;;N;;;;; +A1A4;YI SYLLABLE HLUOP;Lo;0;L;;;;;N;;;;; +A1A5;YI SYLLABLE HLOX;Lo;0;L;;;;;N;;;;; +A1A6;YI SYLLABLE HLO;Lo;0;L;;;;;N;;;;; +A1A7;YI SYLLABLE HLOP;Lo;0;L;;;;;N;;;;; +A1A8;YI SYLLABLE HLEX;Lo;0;L;;;;;N;;;;; +A1A9;YI SYLLABLE HLE;Lo;0;L;;;;;N;;;;; +A1AA;YI SYLLABLE HLEP;Lo;0;L;;;;;N;;;;; +A1AB;YI SYLLABLE HLUT;Lo;0;L;;;;;N;;;;; +A1AC;YI SYLLABLE HLUX;Lo;0;L;;;;;N;;;;; +A1AD;YI SYLLABLE HLU;Lo;0;L;;;;;N;;;;; +A1AE;YI SYLLABLE HLUP;Lo;0;L;;;;;N;;;;; +A1AF;YI SYLLABLE HLURX;Lo;0;L;;;;;N;;;;; +A1B0;YI SYLLABLE HLUR;Lo;0;L;;;;;N;;;;; +A1B1;YI SYLLABLE HLYT;Lo;0;L;;;;;N;;;;; +A1B2;YI SYLLABLE HLYX;Lo;0;L;;;;;N;;;;; +A1B3;YI SYLLABLE HLY;Lo;0;L;;;;;N;;;;; +A1B4;YI SYLLABLE HLYP;Lo;0;L;;;;;N;;;;; +A1B5;YI SYLLABLE HLYRX;Lo;0;L;;;;;N;;;;; +A1B6;YI SYLLABLE HLYR;Lo;0;L;;;;;N;;;;; +A1B7;YI SYLLABLE LIT;Lo;0;L;;;;;N;;;;; +A1B8;YI SYLLABLE LIX;Lo;0;L;;;;;N;;;;; +A1B9;YI SYLLABLE LI;Lo;0;L;;;;;N;;;;; +A1BA;YI SYLLABLE LIP;Lo;0;L;;;;;N;;;;; +A1BB;YI SYLLABLE LIET;Lo;0;L;;;;;N;;;;; +A1BC;YI SYLLABLE LIEX;Lo;0;L;;;;;N;;;;; +A1BD;YI SYLLABLE LIE;Lo;0;L;;;;;N;;;;; +A1BE;YI SYLLABLE LIEP;Lo;0;L;;;;;N;;;;; +A1BF;YI SYLLABLE LAT;Lo;0;L;;;;;N;;;;; +A1C0;YI SYLLABLE LAX;Lo;0;L;;;;;N;;;;; +A1C1;YI SYLLABLE LA;Lo;0;L;;;;;N;;;;; +A1C2;YI SYLLABLE LAP;Lo;0;L;;;;;N;;;;; +A1C3;YI SYLLABLE LUOT;Lo;0;L;;;;;N;;;;; +A1C4;YI SYLLABLE LUOX;Lo;0;L;;;;;N;;;;; +A1C5;YI SYLLABLE LUO;Lo;0;L;;;;;N;;;;; +A1C6;YI SYLLABLE LUOP;Lo;0;L;;;;;N;;;;; +A1C7;YI SYLLABLE LOT;Lo;0;L;;;;;N;;;;; +A1C8;YI SYLLABLE LOX;Lo;0;L;;;;;N;;;;; +A1C9;YI SYLLABLE LO;Lo;0;L;;;;;N;;;;; +A1CA;YI SYLLABLE LOP;Lo;0;L;;;;;N;;;;; +A1CB;YI SYLLABLE LEX;Lo;0;L;;;;;N;;;;; +A1CC;YI SYLLABLE LE;Lo;0;L;;;;;N;;;;; +A1CD;YI SYLLABLE LEP;Lo;0;L;;;;;N;;;;; +A1CE;YI SYLLABLE LUT;Lo;0;L;;;;;N;;;;; +A1CF;YI SYLLABLE LUX;Lo;0;L;;;;;N;;;;; +A1D0;YI SYLLABLE LU;Lo;0;L;;;;;N;;;;; +A1D1;YI SYLLABLE LUP;Lo;0;L;;;;;N;;;;; +A1D2;YI SYLLABLE LURX;Lo;0;L;;;;;N;;;;; +A1D3;YI SYLLABLE LUR;Lo;0;L;;;;;N;;;;; +A1D4;YI SYLLABLE LYT;Lo;0;L;;;;;N;;;;; +A1D5;YI SYLLABLE LYX;Lo;0;L;;;;;N;;;;; +A1D6;YI SYLLABLE LY;Lo;0;L;;;;;N;;;;; +A1D7;YI SYLLABLE LYP;Lo;0;L;;;;;N;;;;; +A1D8;YI SYLLABLE LYRX;Lo;0;L;;;;;N;;;;; +A1D9;YI SYLLABLE LYR;Lo;0;L;;;;;N;;;;; +A1DA;YI SYLLABLE GIT;Lo;0;L;;;;;N;;;;; +A1DB;YI SYLLABLE GIX;Lo;0;L;;;;;N;;;;; +A1DC;YI SYLLABLE GI;Lo;0;L;;;;;N;;;;; +A1DD;YI SYLLABLE GIP;Lo;0;L;;;;;N;;;;; +A1DE;YI SYLLABLE GIET;Lo;0;L;;;;;N;;;;; +A1DF;YI SYLLABLE GIEX;Lo;0;L;;;;;N;;;;; +A1E0;YI SYLLABLE GIE;Lo;0;L;;;;;N;;;;; +A1E1;YI SYLLABLE GIEP;Lo;0;L;;;;;N;;;;; +A1E2;YI SYLLABLE GAT;Lo;0;L;;;;;N;;;;; +A1E3;YI SYLLABLE GAX;Lo;0;L;;;;;N;;;;; +A1E4;YI SYLLABLE GA;Lo;0;L;;;;;N;;;;; +A1E5;YI SYLLABLE GAP;Lo;0;L;;;;;N;;;;; +A1E6;YI SYLLABLE GUOT;Lo;0;L;;;;;N;;;;; +A1E7;YI SYLLABLE GUOX;Lo;0;L;;;;;N;;;;; +A1E8;YI SYLLABLE GUO;Lo;0;L;;;;;N;;;;; +A1E9;YI SYLLABLE GUOP;Lo;0;L;;;;;N;;;;; +A1EA;YI SYLLABLE GOT;Lo;0;L;;;;;N;;;;; +A1EB;YI SYLLABLE GOX;Lo;0;L;;;;;N;;;;; +A1EC;YI SYLLABLE GO;Lo;0;L;;;;;N;;;;; +A1ED;YI SYLLABLE GOP;Lo;0;L;;;;;N;;;;; +A1EE;YI SYLLABLE GET;Lo;0;L;;;;;N;;;;; +A1EF;YI SYLLABLE GEX;Lo;0;L;;;;;N;;;;; +A1F0;YI SYLLABLE GE;Lo;0;L;;;;;N;;;;; +A1F1;YI SYLLABLE GEP;Lo;0;L;;;;;N;;;;; +A1F2;YI SYLLABLE GUT;Lo;0;L;;;;;N;;;;; +A1F3;YI SYLLABLE GUX;Lo;0;L;;;;;N;;;;; +A1F4;YI SYLLABLE GU;Lo;0;L;;;;;N;;;;; +A1F5;YI SYLLABLE GUP;Lo;0;L;;;;;N;;;;; +A1F6;YI SYLLABLE GURX;Lo;0;L;;;;;N;;;;; +A1F7;YI SYLLABLE GUR;Lo;0;L;;;;;N;;;;; +A1F8;YI SYLLABLE KIT;Lo;0;L;;;;;N;;;;; +A1F9;YI SYLLABLE KIX;Lo;0;L;;;;;N;;;;; +A1FA;YI SYLLABLE KI;Lo;0;L;;;;;N;;;;; +A1FB;YI SYLLABLE KIP;Lo;0;L;;;;;N;;;;; +A1FC;YI SYLLABLE KIEX;Lo;0;L;;;;;N;;;;; +A1FD;YI SYLLABLE KIE;Lo;0;L;;;;;N;;;;; +A1FE;YI SYLLABLE KIEP;Lo;0;L;;;;;N;;;;; +A1FF;YI SYLLABLE KAT;Lo;0;L;;;;;N;;;;; +A200;YI SYLLABLE KAX;Lo;0;L;;;;;N;;;;; +A201;YI SYLLABLE KA;Lo;0;L;;;;;N;;;;; +A202;YI SYLLABLE KAP;Lo;0;L;;;;;N;;;;; +A203;YI SYLLABLE KUOX;Lo;0;L;;;;;N;;;;; +A204;YI SYLLABLE KUO;Lo;0;L;;;;;N;;;;; +A205;YI SYLLABLE KUOP;Lo;0;L;;;;;N;;;;; +A206;YI SYLLABLE KOT;Lo;0;L;;;;;N;;;;; +A207;YI SYLLABLE KOX;Lo;0;L;;;;;N;;;;; +A208;YI SYLLABLE KO;Lo;0;L;;;;;N;;;;; +A209;YI SYLLABLE KOP;Lo;0;L;;;;;N;;;;; +A20A;YI SYLLABLE KET;Lo;0;L;;;;;N;;;;; +A20B;YI SYLLABLE KEX;Lo;0;L;;;;;N;;;;; +A20C;YI SYLLABLE KE;Lo;0;L;;;;;N;;;;; +A20D;YI SYLLABLE KEP;Lo;0;L;;;;;N;;;;; +A20E;YI SYLLABLE KUT;Lo;0;L;;;;;N;;;;; +A20F;YI SYLLABLE KUX;Lo;0;L;;;;;N;;;;; +A210;YI SYLLABLE KU;Lo;0;L;;;;;N;;;;; +A211;YI SYLLABLE KUP;Lo;0;L;;;;;N;;;;; +A212;YI SYLLABLE KURX;Lo;0;L;;;;;N;;;;; +A213;YI SYLLABLE KUR;Lo;0;L;;;;;N;;;;; +A214;YI SYLLABLE GGIT;Lo;0;L;;;;;N;;;;; +A215;YI SYLLABLE GGIX;Lo;0;L;;;;;N;;;;; +A216;YI SYLLABLE GGI;Lo;0;L;;;;;N;;;;; +A217;YI SYLLABLE GGIEX;Lo;0;L;;;;;N;;;;; +A218;YI SYLLABLE GGIE;Lo;0;L;;;;;N;;;;; +A219;YI SYLLABLE GGIEP;Lo;0;L;;;;;N;;;;; +A21A;YI SYLLABLE GGAT;Lo;0;L;;;;;N;;;;; +A21B;YI SYLLABLE GGAX;Lo;0;L;;;;;N;;;;; +A21C;YI SYLLABLE GGA;Lo;0;L;;;;;N;;;;; +A21D;YI SYLLABLE GGAP;Lo;0;L;;;;;N;;;;; +A21E;YI SYLLABLE GGUOT;Lo;0;L;;;;;N;;;;; +A21F;YI SYLLABLE GGUOX;Lo;0;L;;;;;N;;;;; +A220;YI SYLLABLE GGUO;Lo;0;L;;;;;N;;;;; +A221;YI SYLLABLE GGUOP;Lo;0;L;;;;;N;;;;; +A222;YI SYLLABLE GGOT;Lo;0;L;;;;;N;;;;; +A223;YI SYLLABLE GGOX;Lo;0;L;;;;;N;;;;; +A224;YI SYLLABLE GGO;Lo;0;L;;;;;N;;;;; +A225;YI SYLLABLE GGOP;Lo;0;L;;;;;N;;;;; +A226;YI SYLLABLE GGET;Lo;0;L;;;;;N;;;;; +A227;YI SYLLABLE GGEX;Lo;0;L;;;;;N;;;;; +A228;YI SYLLABLE GGE;Lo;0;L;;;;;N;;;;; +A229;YI SYLLABLE GGEP;Lo;0;L;;;;;N;;;;; +A22A;YI SYLLABLE GGUT;Lo;0;L;;;;;N;;;;; +A22B;YI SYLLABLE GGUX;Lo;0;L;;;;;N;;;;; +A22C;YI SYLLABLE GGU;Lo;0;L;;;;;N;;;;; +A22D;YI SYLLABLE GGUP;Lo;0;L;;;;;N;;;;; +A22E;YI SYLLABLE GGURX;Lo;0;L;;;;;N;;;;; +A22F;YI SYLLABLE GGUR;Lo;0;L;;;;;N;;;;; +A230;YI SYLLABLE MGIEX;Lo;0;L;;;;;N;;;;; +A231;YI SYLLABLE MGIE;Lo;0;L;;;;;N;;;;; +A232;YI SYLLABLE MGAT;Lo;0;L;;;;;N;;;;; +A233;YI SYLLABLE MGAX;Lo;0;L;;;;;N;;;;; +A234;YI SYLLABLE MGA;Lo;0;L;;;;;N;;;;; +A235;YI SYLLABLE MGAP;Lo;0;L;;;;;N;;;;; +A236;YI SYLLABLE MGUOX;Lo;0;L;;;;;N;;;;; +A237;YI SYLLABLE MGUO;Lo;0;L;;;;;N;;;;; +A238;YI SYLLABLE MGUOP;Lo;0;L;;;;;N;;;;; +A239;YI SYLLABLE MGOT;Lo;0;L;;;;;N;;;;; +A23A;YI SYLLABLE MGOX;Lo;0;L;;;;;N;;;;; +A23B;YI SYLLABLE MGO;Lo;0;L;;;;;N;;;;; +A23C;YI SYLLABLE MGOP;Lo;0;L;;;;;N;;;;; +A23D;YI SYLLABLE MGEX;Lo;0;L;;;;;N;;;;; +A23E;YI SYLLABLE MGE;Lo;0;L;;;;;N;;;;; +A23F;YI SYLLABLE MGEP;Lo;0;L;;;;;N;;;;; +A240;YI SYLLABLE MGUT;Lo;0;L;;;;;N;;;;; +A241;YI SYLLABLE MGUX;Lo;0;L;;;;;N;;;;; +A242;YI SYLLABLE MGU;Lo;0;L;;;;;N;;;;; +A243;YI SYLLABLE MGUP;Lo;0;L;;;;;N;;;;; +A244;YI SYLLABLE MGURX;Lo;0;L;;;;;N;;;;; +A245;YI SYLLABLE MGUR;Lo;0;L;;;;;N;;;;; +A246;YI SYLLABLE HXIT;Lo;0;L;;;;;N;;;;; +A247;YI SYLLABLE HXIX;Lo;0;L;;;;;N;;;;; +A248;YI SYLLABLE HXI;Lo;0;L;;;;;N;;;;; +A249;YI SYLLABLE HXIP;Lo;0;L;;;;;N;;;;; +A24A;YI SYLLABLE HXIET;Lo;0;L;;;;;N;;;;; +A24B;YI SYLLABLE HXIEX;Lo;0;L;;;;;N;;;;; +A24C;YI SYLLABLE HXIE;Lo;0;L;;;;;N;;;;; +A24D;YI SYLLABLE HXIEP;Lo;0;L;;;;;N;;;;; +A24E;YI SYLLABLE HXAT;Lo;0;L;;;;;N;;;;; +A24F;YI SYLLABLE HXAX;Lo;0;L;;;;;N;;;;; +A250;YI SYLLABLE HXA;Lo;0;L;;;;;N;;;;; +A251;YI SYLLABLE HXAP;Lo;0;L;;;;;N;;;;; +A252;YI SYLLABLE HXUOT;Lo;0;L;;;;;N;;;;; +A253;YI SYLLABLE HXUOX;Lo;0;L;;;;;N;;;;; +A254;YI SYLLABLE HXUO;Lo;0;L;;;;;N;;;;; +A255;YI SYLLABLE HXUOP;Lo;0;L;;;;;N;;;;; +A256;YI SYLLABLE HXOT;Lo;0;L;;;;;N;;;;; +A257;YI SYLLABLE HXOX;Lo;0;L;;;;;N;;;;; +A258;YI SYLLABLE HXO;Lo;0;L;;;;;N;;;;; +A259;YI SYLLABLE HXOP;Lo;0;L;;;;;N;;;;; +A25A;YI SYLLABLE HXEX;Lo;0;L;;;;;N;;;;; +A25B;YI SYLLABLE HXE;Lo;0;L;;;;;N;;;;; +A25C;YI SYLLABLE HXEP;Lo;0;L;;;;;N;;;;; +A25D;YI SYLLABLE NGIEX;Lo;0;L;;;;;N;;;;; +A25E;YI SYLLABLE NGIE;Lo;0;L;;;;;N;;;;; +A25F;YI SYLLABLE NGIEP;Lo;0;L;;;;;N;;;;; +A260;YI SYLLABLE NGAT;Lo;0;L;;;;;N;;;;; +A261;YI SYLLABLE NGAX;Lo;0;L;;;;;N;;;;; +A262;YI SYLLABLE NGA;Lo;0;L;;;;;N;;;;; +A263;YI SYLLABLE NGAP;Lo;0;L;;;;;N;;;;; +A264;YI SYLLABLE NGUOT;Lo;0;L;;;;;N;;;;; +A265;YI SYLLABLE NGUOX;Lo;0;L;;;;;N;;;;; +A266;YI SYLLABLE NGUO;Lo;0;L;;;;;N;;;;; +A267;YI SYLLABLE NGOT;Lo;0;L;;;;;N;;;;; +A268;YI SYLLABLE NGOX;Lo;0;L;;;;;N;;;;; +A269;YI SYLLABLE NGO;Lo;0;L;;;;;N;;;;; +A26A;YI SYLLABLE NGOP;Lo;0;L;;;;;N;;;;; +A26B;YI SYLLABLE NGEX;Lo;0;L;;;;;N;;;;; +A26C;YI SYLLABLE NGE;Lo;0;L;;;;;N;;;;; +A26D;YI SYLLABLE NGEP;Lo;0;L;;;;;N;;;;; +A26E;YI SYLLABLE HIT;Lo;0;L;;;;;N;;;;; +A26F;YI SYLLABLE HIEX;Lo;0;L;;;;;N;;;;; +A270;YI SYLLABLE HIE;Lo;0;L;;;;;N;;;;; +A271;YI SYLLABLE HAT;Lo;0;L;;;;;N;;;;; +A272;YI SYLLABLE HAX;Lo;0;L;;;;;N;;;;; +A273;YI SYLLABLE HA;Lo;0;L;;;;;N;;;;; +A274;YI SYLLABLE HAP;Lo;0;L;;;;;N;;;;; +A275;YI SYLLABLE HUOT;Lo;0;L;;;;;N;;;;; +A276;YI SYLLABLE HUOX;Lo;0;L;;;;;N;;;;; +A277;YI SYLLABLE HUO;Lo;0;L;;;;;N;;;;; +A278;YI SYLLABLE HUOP;Lo;0;L;;;;;N;;;;; +A279;YI SYLLABLE HOT;Lo;0;L;;;;;N;;;;; +A27A;YI SYLLABLE HOX;Lo;0;L;;;;;N;;;;; +A27B;YI SYLLABLE HO;Lo;0;L;;;;;N;;;;; +A27C;YI SYLLABLE HOP;Lo;0;L;;;;;N;;;;; +A27D;YI SYLLABLE HEX;Lo;0;L;;;;;N;;;;; +A27E;YI SYLLABLE HE;Lo;0;L;;;;;N;;;;; +A27F;YI SYLLABLE HEP;Lo;0;L;;;;;N;;;;; +A280;YI SYLLABLE WAT;Lo;0;L;;;;;N;;;;; +A281;YI SYLLABLE WAX;Lo;0;L;;;;;N;;;;; +A282;YI SYLLABLE WA;Lo;0;L;;;;;N;;;;; +A283;YI SYLLABLE WAP;Lo;0;L;;;;;N;;;;; +A284;YI SYLLABLE WUOX;Lo;0;L;;;;;N;;;;; +A285;YI SYLLABLE WUO;Lo;0;L;;;;;N;;;;; +A286;YI SYLLABLE WUOP;Lo;0;L;;;;;N;;;;; +A287;YI SYLLABLE WOX;Lo;0;L;;;;;N;;;;; +A288;YI SYLLABLE WO;Lo;0;L;;;;;N;;;;; +A289;YI SYLLABLE WOP;Lo;0;L;;;;;N;;;;; +A28A;YI SYLLABLE WEX;Lo;0;L;;;;;N;;;;; +A28B;YI SYLLABLE WE;Lo;0;L;;;;;N;;;;; +A28C;YI SYLLABLE WEP;Lo;0;L;;;;;N;;;;; +A28D;YI SYLLABLE ZIT;Lo;0;L;;;;;N;;;;; +A28E;YI SYLLABLE ZIX;Lo;0;L;;;;;N;;;;; +A28F;YI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +A290;YI SYLLABLE ZIP;Lo;0;L;;;;;N;;;;; +A291;YI SYLLABLE ZIEX;Lo;0;L;;;;;N;;;;; +A292;YI SYLLABLE ZIE;Lo;0;L;;;;;N;;;;; +A293;YI SYLLABLE ZIEP;Lo;0;L;;;;;N;;;;; +A294;YI SYLLABLE ZAT;Lo;0;L;;;;;N;;;;; +A295;YI SYLLABLE ZAX;Lo;0;L;;;;;N;;;;; +A296;YI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +A297;YI SYLLABLE ZAP;Lo;0;L;;;;;N;;;;; +A298;YI SYLLABLE ZUOX;Lo;0;L;;;;;N;;;;; +A299;YI SYLLABLE ZUO;Lo;0;L;;;;;N;;;;; +A29A;YI SYLLABLE ZUOP;Lo;0;L;;;;;N;;;;; +A29B;YI SYLLABLE ZOT;Lo;0;L;;;;;N;;;;; +A29C;YI SYLLABLE ZOX;Lo;0;L;;;;;N;;;;; +A29D;YI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +A29E;YI SYLLABLE ZOP;Lo;0;L;;;;;N;;;;; +A29F;YI SYLLABLE ZEX;Lo;0;L;;;;;N;;;;; +A2A0;YI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +A2A1;YI SYLLABLE ZEP;Lo;0;L;;;;;N;;;;; +A2A2;YI SYLLABLE ZUT;Lo;0;L;;;;;N;;;;; +A2A3;YI SYLLABLE ZUX;Lo;0;L;;;;;N;;;;; +A2A4;YI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +A2A5;YI SYLLABLE ZUP;Lo;0;L;;;;;N;;;;; +A2A6;YI SYLLABLE ZURX;Lo;0;L;;;;;N;;;;; +A2A7;YI SYLLABLE ZUR;Lo;0;L;;;;;N;;;;; +A2A8;YI SYLLABLE ZYT;Lo;0;L;;;;;N;;;;; +A2A9;YI SYLLABLE ZYX;Lo;0;L;;;;;N;;;;; +A2AA;YI SYLLABLE ZY;Lo;0;L;;;;;N;;;;; +A2AB;YI SYLLABLE ZYP;Lo;0;L;;;;;N;;;;; +A2AC;YI SYLLABLE ZYRX;Lo;0;L;;;;;N;;;;; +A2AD;YI SYLLABLE ZYR;Lo;0;L;;;;;N;;;;; +A2AE;YI SYLLABLE CIT;Lo;0;L;;;;;N;;;;; +A2AF;YI SYLLABLE CIX;Lo;0;L;;;;;N;;;;; +A2B0;YI SYLLABLE CI;Lo;0;L;;;;;N;;;;; +A2B1;YI SYLLABLE CIP;Lo;0;L;;;;;N;;;;; +A2B2;YI SYLLABLE CIET;Lo;0;L;;;;;N;;;;; +A2B3;YI SYLLABLE CIEX;Lo;0;L;;;;;N;;;;; +A2B4;YI SYLLABLE CIE;Lo;0;L;;;;;N;;;;; +A2B5;YI SYLLABLE CIEP;Lo;0;L;;;;;N;;;;; +A2B6;YI SYLLABLE CAT;Lo;0;L;;;;;N;;;;; +A2B7;YI SYLLABLE CAX;Lo;0;L;;;;;N;;;;; +A2B8;YI SYLLABLE CA;Lo;0;L;;;;;N;;;;; +A2B9;YI SYLLABLE CAP;Lo;0;L;;;;;N;;;;; +A2BA;YI SYLLABLE CUOX;Lo;0;L;;;;;N;;;;; +A2BB;YI SYLLABLE CUO;Lo;0;L;;;;;N;;;;; +A2BC;YI SYLLABLE CUOP;Lo;0;L;;;;;N;;;;; +A2BD;YI SYLLABLE COT;Lo;0;L;;;;;N;;;;; +A2BE;YI SYLLABLE COX;Lo;0;L;;;;;N;;;;; +A2BF;YI SYLLABLE CO;Lo;0;L;;;;;N;;;;; +A2C0;YI SYLLABLE COP;Lo;0;L;;;;;N;;;;; +A2C1;YI SYLLABLE CEX;Lo;0;L;;;;;N;;;;; +A2C2;YI SYLLABLE CE;Lo;0;L;;;;;N;;;;; +A2C3;YI SYLLABLE CEP;Lo;0;L;;;;;N;;;;; +A2C4;YI SYLLABLE CUT;Lo;0;L;;;;;N;;;;; +A2C5;YI SYLLABLE CUX;Lo;0;L;;;;;N;;;;; +A2C6;YI SYLLABLE CU;Lo;0;L;;;;;N;;;;; +A2C7;YI SYLLABLE CUP;Lo;0;L;;;;;N;;;;; +A2C8;YI SYLLABLE CURX;Lo;0;L;;;;;N;;;;; +A2C9;YI SYLLABLE CUR;Lo;0;L;;;;;N;;;;; +A2CA;YI SYLLABLE CYT;Lo;0;L;;;;;N;;;;; +A2CB;YI SYLLABLE CYX;Lo;0;L;;;;;N;;;;; +A2CC;YI SYLLABLE CY;Lo;0;L;;;;;N;;;;; +A2CD;YI SYLLABLE CYP;Lo;0;L;;;;;N;;;;; +A2CE;YI SYLLABLE CYRX;Lo;0;L;;;;;N;;;;; +A2CF;YI SYLLABLE CYR;Lo;0;L;;;;;N;;;;; +A2D0;YI SYLLABLE ZZIT;Lo;0;L;;;;;N;;;;; +A2D1;YI SYLLABLE ZZIX;Lo;0;L;;;;;N;;;;; +A2D2;YI SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; +A2D3;YI SYLLABLE ZZIP;Lo;0;L;;;;;N;;;;; +A2D4;YI SYLLABLE ZZIET;Lo;0;L;;;;;N;;;;; +A2D5;YI SYLLABLE ZZIEX;Lo;0;L;;;;;N;;;;; +A2D6;YI SYLLABLE ZZIE;Lo;0;L;;;;;N;;;;; +A2D7;YI SYLLABLE ZZIEP;Lo;0;L;;;;;N;;;;; +A2D8;YI SYLLABLE ZZAT;Lo;0;L;;;;;N;;;;; +A2D9;YI SYLLABLE ZZAX;Lo;0;L;;;;;N;;;;; +A2DA;YI SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; +A2DB;YI SYLLABLE ZZAP;Lo;0;L;;;;;N;;;;; +A2DC;YI SYLLABLE ZZOX;Lo;0;L;;;;;N;;;;; +A2DD;YI SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; +A2DE;YI SYLLABLE ZZOP;Lo;0;L;;;;;N;;;;; +A2DF;YI SYLLABLE ZZEX;Lo;0;L;;;;;N;;;;; +A2E0;YI SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; +A2E1;YI SYLLABLE ZZEP;Lo;0;L;;;;;N;;;;; +A2E2;YI SYLLABLE ZZUX;Lo;0;L;;;;;N;;;;; +A2E3;YI SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; +A2E4;YI SYLLABLE ZZUP;Lo;0;L;;;;;N;;;;; +A2E5;YI SYLLABLE ZZURX;Lo;0;L;;;;;N;;;;; +A2E6;YI SYLLABLE ZZUR;Lo;0;L;;;;;N;;;;; +A2E7;YI SYLLABLE ZZYT;Lo;0;L;;;;;N;;;;; +A2E8;YI SYLLABLE ZZYX;Lo;0;L;;;;;N;;;;; +A2E9;YI SYLLABLE ZZY;Lo;0;L;;;;;N;;;;; +A2EA;YI SYLLABLE ZZYP;Lo;0;L;;;;;N;;;;; +A2EB;YI SYLLABLE ZZYRX;Lo;0;L;;;;;N;;;;; +A2EC;YI SYLLABLE ZZYR;Lo;0;L;;;;;N;;;;; +A2ED;YI SYLLABLE NZIT;Lo;0;L;;;;;N;;;;; +A2EE;YI SYLLABLE NZIX;Lo;0;L;;;;;N;;;;; +A2EF;YI SYLLABLE NZI;Lo;0;L;;;;;N;;;;; +A2F0;YI SYLLABLE NZIP;Lo;0;L;;;;;N;;;;; +A2F1;YI SYLLABLE NZIEX;Lo;0;L;;;;;N;;;;; +A2F2;YI SYLLABLE NZIE;Lo;0;L;;;;;N;;;;; +A2F3;YI SYLLABLE NZIEP;Lo;0;L;;;;;N;;;;; +A2F4;YI SYLLABLE NZAT;Lo;0;L;;;;;N;;;;; +A2F5;YI SYLLABLE NZAX;Lo;0;L;;;;;N;;;;; +A2F6;YI SYLLABLE NZA;Lo;0;L;;;;;N;;;;; +A2F7;YI SYLLABLE NZAP;Lo;0;L;;;;;N;;;;; +A2F8;YI SYLLABLE NZUOX;Lo;0;L;;;;;N;;;;; +A2F9;YI SYLLABLE NZUO;Lo;0;L;;;;;N;;;;; +A2FA;YI SYLLABLE NZOX;Lo;0;L;;;;;N;;;;; +A2FB;YI SYLLABLE NZOP;Lo;0;L;;;;;N;;;;; +A2FC;YI SYLLABLE NZEX;Lo;0;L;;;;;N;;;;; +A2FD;YI SYLLABLE NZE;Lo;0;L;;;;;N;;;;; +A2FE;YI SYLLABLE NZUX;Lo;0;L;;;;;N;;;;; +A2FF;YI SYLLABLE NZU;Lo;0;L;;;;;N;;;;; +A300;YI SYLLABLE NZUP;Lo;0;L;;;;;N;;;;; +A301;YI SYLLABLE NZURX;Lo;0;L;;;;;N;;;;; +A302;YI SYLLABLE NZUR;Lo;0;L;;;;;N;;;;; +A303;YI SYLLABLE NZYT;Lo;0;L;;;;;N;;;;; +A304;YI SYLLABLE NZYX;Lo;0;L;;;;;N;;;;; +A305;YI SYLLABLE NZY;Lo;0;L;;;;;N;;;;; +A306;YI SYLLABLE NZYP;Lo;0;L;;;;;N;;;;; +A307;YI SYLLABLE NZYRX;Lo;0;L;;;;;N;;;;; +A308;YI SYLLABLE NZYR;Lo;0;L;;;;;N;;;;; +A309;YI SYLLABLE SIT;Lo;0;L;;;;;N;;;;; +A30A;YI SYLLABLE SIX;Lo;0;L;;;;;N;;;;; +A30B;YI SYLLABLE SI;Lo;0;L;;;;;N;;;;; +A30C;YI SYLLABLE SIP;Lo;0;L;;;;;N;;;;; +A30D;YI SYLLABLE SIEX;Lo;0;L;;;;;N;;;;; +A30E;YI SYLLABLE SIE;Lo;0;L;;;;;N;;;;; +A30F;YI SYLLABLE SIEP;Lo;0;L;;;;;N;;;;; +A310;YI SYLLABLE SAT;Lo;0;L;;;;;N;;;;; +A311;YI SYLLABLE SAX;Lo;0;L;;;;;N;;;;; +A312;YI SYLLABLE SA;Lo;0;L;;;;;N;;;;; +A313;YI SYLLABLE SAP;Lo;0;L;;;;;N;;;;; +A314;YI SYLLABLE SUOX;Lo;0;L;;;;;N;;;;; +A315;YI SYLLABLE SUO;Lo;0;L;;;;;N;;;;; +A316;YI SYLLABLE SUOP;Lo;0;L;;;;;N;;;;; +A317;YI SYLLABLE SOT;Lo;0;L;;;;;N;;;;; +A318;YI SYLLABLE SOX;Lo;0;L;;;;;N;;;;; +A319;YI SYLLABLE SO;Lo;0;L;;;;;N;;;;; +A31A;YI SYLLABLE SOP;Lo;0;L;;;;;N;;;;; +A31B;YI SYLLABLE SEX;Lo;0;L;;;;;N;;;;; +A31C;YI SYLLABLE SE;Lo;0;L;;;;;N;;;;; +A31D;YI SYLLABLE SEP;Lo;0;L;;;;;N;;;;; +A31E;YI SYLLABLE SUT;Lo;0;L;;;;;N;;;;; +A31F;YI SYLLABLE SUX;Lo;0;L;;;;;N;;;;; +A320;YI SYLLABLE SU;Lo;0;L;;;;;N;;;;; +A321;YI SYLLABLE SUP;Lo;0;L;;;;;N;;;;; +A322;YI SYLLABLE SURX;Lo;0;L;;;;;N;;;;; +A323;YI SYLLABLE SUR;Lo;0;L;;;;;N;;;;; +A324;YI SYLLABLE SYT;Lo;0;L;;;;;N;;;;; +A325;YI SYLLABLE SYX;Lo;0;L;;;;;N;;;;; +A326;YI SYLLABLE SY;Lo;0;L;;;;;N;;;;; +A327;YI SYLLABLE SYP;Lo;0;L;;;;;N;;;;; +A328;YI SYLLABLE SYRX;Lo;0;L;;;;;N;;;;; +A329;YI SYLLABLE SYR;Lo;0;L;;;;;N;;;;; +A32A;YI SYLLABLE SSIT;Lo;0;L;;;;;N;;;;; +A32B;YI SYLLABLE SSIX;Lo;0;L;;;;;N;;;;; +A32C;YI SYLLABLE SSI;Lo;0;L;;;;;N;;;;; +A32D;YI SYLLABLE SSIP;Lo;0;L;;;;;N;;;;; +A32E;YI SYLLABLE SSIEX;Lo;0;L;;;;;N;;;;; +A32F;YI SYLLABLE SSIE;Lo;0;L;;;;;N;;;;; +A330;YI SYLLABLE SSIEP;Lo;0;L;;;;;N;;;;; +A331;YI SYLLABLE SSAT;Lo;0;L;;;;;N;;;;; +A332;YI SYLLABLE SSAX;Lo;0;L;;;;;N;;;;; +A333;YI SYLLABLE SSA;Lo;0;L;;;;;N;;;;; +A334;YI SYLLABLE SSAP;Lo;0;L;;;;;N;;;;; +A335;YI SYLLABLE SSOT;Lo;0;L;;;;;N;;;;; +A336;YI SYLLABLE SSOX;Lo;0;L;;;;;N;;;;; +A337;YI SYLLABLE SSO;Lo;0;L;;;;;N;;;;; +A338;YI SYLLABLE SSOP;Lo;0;L;;;;;N;;;;; +A339;YI SYLLABLE SSEX;Lo;0;L;;;;;N;;;;; +A33A;YI SYLLABLE SSE;Lo;0;L;;;;;N;;;;; +A33B;YI SYLLABLE SSEP;Lo;0;L;;;;;N;;;;; +A33C;YI SYLLABLE SSUT;Lo;0;L;;;;;N;;;;; +A33D;YI SYLLABLE SSUX;Lo;0;L;;;;;N;;;;; +A33E;YI SYLLABLE SSU;Lo;0;L;;;;;N;;;;; +A33F;YI SYLLABLE SSUP;Lo;0;L;;;;;N;;;;; +A340;YI SYLLABLE SSYT;Lo;0;L;;;;;N;;;;; +A341;YI SYLLABLE SSYX;Lo;0;L;;;;;N;;;;; +A342;YI SYLLABLE SSY;Lo;0;L;;;;;N;;;;; +A343;YI SYLLABLE SSYP;Lo;0;L;;;;;N;;;;; +A344;YI SYLLABLE SSYRX;Lo;0;L;;;;;N;;;;; +A345;YI SYLLABLE SSYR;Lo;0;L;;;;;N;;;;; +A346;YI SYLLABLE ZHAT;Lo;0;L;;;;;N;;;;; +A347;YI SYLLABLE ZHAX;Lo;0;L;;;;;N;;;;; +A348;YI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +A349;YI SYLLABLE ZHAP;Lo;0;L;;;;;N;;;;; +A34A;YI SYLLABLE ZHUOX;Lo;0;L;;;;;N;;;;; +A34B;YI SYLLABLE ZHUO;Lo;0;L;;;;;N;;;;; +A34C;YI SYLLABLE ZHUOP;Lo;0;L;;;;;N;;;;; +A34D;YI SYLLABLE ZHOT;Lo;0;L;;;;;N;;;;; +A34E;YI SYLLABLE ZHOX;Lo;0;L;;;;;N;;;;; +A34F;YI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +A350;YI SYLLABLE ZHOP;Lo;0;L;;;;;N;;;;; +A351;YI SYLLABLE ZHET;Lo;0;L;;;;;N;;;;; +A352;YI SYLLABLE ZHEX;Lo;0;L;;;;;N;;;;; +A353;YI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +A354;YI SYLLABLE ZHEP;Lo;0;L;;;;;N;;;;; +A355;YI SYLLABLE ZHUT;Lo;0;L;;;;;N;;;;; +A356;YI SYLLABLE ZHUX;Lo;0;L;;;;;N;;;;; +A357;YI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +A358;YI SYLLABLE ZHUP;Lo;0;L;;;;;N;;;;; +A359;YI SYLLABLE ZHURX;Lo;0;L;;;;;N;;;;; +A35A;YI SYLLABLE ZHUR;Lo;0;L;;;;;N;;;;; +A35B;YI SYLLABLE ZHYT;Lo;0;L;;;;;N;;;;; +A35C;YI SYLLABLE ZHYX;Lo;0;L;;;;;N;;;;; +A35D;YI SYLLABLE ZHY;Lo;0;L;;;;;N;;;;; +A35E;YI SYLLABLE ZHYP;Lo;0;L;;;;;N;;;;; +A35F;YI SYLLABLE ZHYRX;Lo;0;L;;;;;N;;;;; +A360;YI SYLLABLE ZHYR;Lo;0;L;;;;;N;;;;; +A361;YI SYLLABLE CHAT;Lo;0;L;;;;;N;;;;; +A362;YI SYLLABLE CHAX;Lo;0;L;;;;;N;;;;; +A363;YI SYLLABLE CHA;Lo;0;L;;;;;N;;;;; +A364;YI SYLLABLE CHAP;Lo;0;L;;;;;N;;;;; +A365;YI SYLLABLE CHUOT;Lo;0;L;;;;;N;;;;; +A366;YI SYLLABLE CHUOX;Lo;0;L;;;;;N;;;;; +A367;YI SYLLABLE CHUO;Lo;0;L;;;;;N;;;;; +A368;YI SYLLABLE CHUOP;Lo;0;L;;;;;N;;;;; +A369;YI SYLLABLE CHOT;Lo;0;L;;;;;N;;;;; +A36A;YI SYLLABLE CHOX;Lo;0;L;;;;;N;;;;; +A36B;YI SYLLABLE CHO;Lo;0;L;;;;;N;;;;; +A36C;YI SYLLABLE CHOP;Lo;0;L;;;;;N;;;;; +A36D;YI SYLLABLE CHET;Lo;0;L;;;;;N;;;;; +A36E;YI SYLLABLE CHEX;Lo;0;L;;;;;N;;;;; +A36F;YI SYLLABLE CHE;Lo;0;L;;;;;N;;;;; +A370;YI SYLLABLE CHEP;Lo;0;L;;;;;N;;;;; +A371;YI SYLLABLE CHUX;Lo;0;L;;;;;N;;;;; +A372;YI SYLLABLE CHU;Lo;0;L;;;;;N;;;;; +A373;YI SYLLABLE CHUP;Lo;0;L;;;;;N;;;;; +A374;YI SYLLABLE CHURX;Lo;0;L;;;;;N;;;;; +A375;YI SYLLABLE CHUR;Lo;0;L;;;;;N;;;;; +A376;YI SYLLABLE CHYT;Lo;0;L;;;;;N;;;;; +A377;YI SYLLABLE CHYX;Lo;0;L;;;;;N;;;;; +A378;YI SYLLABLE CHY;Lo;0;L;;;;;N;;;;; +A379;YI SYLLABLE CHYP;Lo;0;L;;;;;N;;;;; +A37A;YI SYLLABLE CHYRX;Lo;0;L;;;;;N;;;;; +A37B;YI SYLLABLE CHYR;Lo;0;L;;;;;N;;;;; +A37C;YI SYLLABLE RRAX;Lo;0;L;;;;;N;;;;; +A37D;YI SYLLABLE RRA;Lo;0;L;;;;;N;;;;; +A37E;YI SYLLABLE RRUOX;Lo;0;L;;;;;N;;;;; +A37F;YI SYLLABLE RRUO;Lo;0;L;;;;;N;;;;; +A380;YI SYLLABLE RROT;Lo;0;L;;;;;N;;;;; +A381;YI SYLLABLE RROX;Lo;0;L;;;;;N;;;;; +A382;YI SYLLABLE RRO;Lo;0;L;;;;;N;;;;; +A383;YI SYLLABLE RROP;Lo;0;L;;;;;N;;;;; +A384;YI SYLLABLE RRET;Lo;0;L;;;;;N;;;;; +A385;YI SYLLABLE RREX;Lo;0;L;;;;;N;;;;; +A386;YI SYLLABLE RRE;Lo;0;L;;;;;N;;;;; +A387;YI SYLLABLE RREP;Lo;0;L;;;;;N;;;;; +A388;YI SYLLABLE RRUT;Lo;0;L;;;;;N;;;;; +A389;YI SYLLABLE RRUX;Lo;0;L;;;;;N;;;;; +A38A;YI SYLLABLE RRU;Lo;0;L;;;;;N;;;;; +A38B;YI SYLLABLE RRUP;Lo;0;L;;;;;N;;;;; +A38C;YI SYLLABLE RRURX;Lo;0;L;;;;;N;;;;; +A38D;YI SYLLABLE RRUR;Lo;0;L;;;;;N;;;;; +A38E;YI SYLLABLE RRYT;Lo;0;L;;;;;N;;;;; +A38F;YI SYLLABLE RRYX;Lo;0;L;;;;;N;;;;; +A390;YI SYLLABLE RRY;Lo;0;L;;;;;N;;;;; +A391;YI SYLLABLE RRYP;Lo;0;L;;;;;N;;;;; +A392;YI SYLLABLE RRYRX;Lo;0;L;;;;;N;;;;; +A393;YI SYLLABLE RRYR;Lo;0;L;;;;;N;;;;; +A394;YI SYLLABLE NRAT;Lo;0;L;;;;;N;;;;; +A395;YI SYLLABLE NRAX;Lo;0;L;;;;;N;;;;; +A396;YI SYLLABLE NRA;Lo;0;L;;;;;N;;;;; +A397;YI SYLLABLE NRAP;Lo;0;L;;;;;N;;;;; +A398;YI SYLLABLE NROX;Lo;0;L;;;;;N;;;;; +A399;YI SYLLABLE NRO;Lo;0;L;;;;;N;;;;; +A39A;YI SYLLABLE NROP;Lo;0;L;;;;;N;;;;; +A39B;YI SYLLABLE NRET;Lo;0;L;;;;;N;;;;; +A39C;YI SYLLABLE NREX;Lo;0;L;;;;;N;;;;; +A39D;YI SYLLABLE NRE;Lo;0;L;;;;;N;;;;; +A39E;YI SYLLABLE NREP;Lo;0;L;;;;;N;;;;; +A39F;YI SYLLABLE NRUT;Lo;0;L;;;;;N;;;;; +A3A0;YI SYLLABLE NRUX;Lo;0;L;;;;;N;;;;; +A3A1;YI SYLLABLE NRU;Lo;0;L;;;;;N;;;;; +A3A2;YI SYLLABLE NRUP;Lo;0;L;;;;;N;;;;; +A3A3;YI SYLLABLE NRURX;Lo;0;L;;;;;N;;;;; +A3A4;YI SYLLABLE NRUR;Lo;0;L;;;;;N;;;;; +A3A5;YI SYLLABLE NRYT;Lo;0;L;;;;;N;;;;; +A3A6;YI SYLLABLE NRYX;Lo;0;L;;;;;N;;;;; +A3A7;YI SYLLABLE NRY;Lo;0;L;;;;;N;;;;; +A3A8;YI SYLLABLE NRYP;Lo;0;L;;;;;N;;;;; +A3A9;YI SYLLABLE NRYRX;Lo;0;L;;;;;N;;;;; +A3AA;YI SYLLABLE NRYR;Lo;0;L;;;;;N;;;;; +A3AB;YI SYLLABLE SHAT;Lo;0;L;;;;;N;;;;; +A3AC;YI SYLLABLE SHAX;Lo;0;L;;;;;N;;;;; +A3AD;YI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +A3AE;YI SYLLABLE SHAP;Lo;0;L;;;;;N;;;;; +A3AF;YI SYLLABLE SHUOX;Lo;0;L;;;;;N;;;;; +A3B0;YI SYLLABLE SHUO;Lo;0;L;;;;;N;;;;; +A3B1;YI SYLLABLE SHUOP;Lo;0;L;;;;;N;;;;; +A3B2;YI SYLLABLE SHOT;Lo;0;L;;;;;N;;;;; +A3B3;YI SYLLABLE SHOX;Lo;0;L;;;;;N;;;;; +A3B4;YI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +A3B5;YI SYLLABLE SHOP;Lo;0;L;;;;;N;;;;; +A3B6;YI SYLLABLE SHET;Lo;0;L;;;;;N;;;;; +A3B7;YI SYLLABLE SHEX;Lo;0;L;;;;;N;;;;; +A3B8;YI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +A3B9;YI SYLLABLE SHEP;Lo;0;L;;;;;N;;;;; +A3BA;YI SYLLABLE SHUT;Lo;0;L;;;;;N;;;;; +A3BB;YI SYLLABLE SHUX;Lo;0;L;;;;;N;;;;; +A3BC;YI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +A3BD;YI SYLLABLE SHUP;Lo;0;L;;;;;N;;;;; +A3BE;YI SYLLABLE SHURX;Lo;0;L;;;;;N;;;;; +A3BF;YI SYLLABLE SHUR;Lo;0;L;;;;;N;;;;; +A3C0;YI SYLLABLE SHYT;Lo;0;L;;;;;N;;;;; +A3C1;YI SYLLABLE SHYX;Lo;0;L;;;;;N;;;;; +A3C2;YI SYLLABLE SHY;Lo;0;L;;;;;N;;;;; +A3C3;YI SYLLABLE SHYP;Lo;0;L;;;;;N;;;;; +A3C4;YI SYLLABLE SHYRX;Lo;0;L;;;;;N;;;;; +A3C5;YI SYLLABLE SHYR;Lo;0;L;;;;;N;;;;; +A3C6;YI SYLLABLE RAT;Lo;0;L;;;;;N;;;;; +A3C7;YI SYLLABLE RAX;Lo;0;L;;;;;N;;;;; +A3C8;YI SYLLABLE RA;Lo;0;L;;;;;N;;;;; +A3C9;YI SYLLABLE RAP;Lo;0;L;;;;;N;;;;; +A3CA;YI SYLLABLE RUOX;Lo;0;L;;;;;N;;;;; +A3CB;YI SYLLABLE RUO;Lo;0;L;;;;;N;;;;; +A3CC;YI SYLLABLE RUOP;Lo;0;L;;;;;N;;;;; +A3CD;YI SYLLABLE ROT;Lo;0;L;;;;;N;;;;; +A3CE;YI SYLLABLE ROX;Lo;0;L;;;;;N;;;;; +A3CF;YI SYLLABLE RO;Lo;0;L;;;;;N;;;;; +A3D0;YI SYLLABLE ROP;Lo;0;L;;;;;N;;;;; +A3D1;YI SYLLABLE REX;Lo;0;L;;;;;N;;;;; +A3D2;YI SYLLABLE RE;Lo;0;L;;;;;N;;;;; +A3D3;YI SYLLABLE REP;Lo;0;L;;;;;N;;;;; +A3D4;YI SYLLABLE RUT;Lo;0;L;;;;;N;;;;; +A3D5;YI SYLLABLE RUX;Lo;0;L;;;;;N;;;;; +A3D6;YI SYLLABLE RU;Lo;0;L;;;;;N;;;;; +A3D7;YI SYLLABLE RUP;Lo;0;L;;;;;N;;;;; +A3D8;YI SYLLABLE RURX;Lo;0;L;;;;;N;;;;; +A3D9;YI SYLLABLE RUR;Lo;0;L;;;;;N;;;;; +A3DA;YI SYLLABLE RYT;Lo;0;L;;;;;N;;;;; +A3DB;YI SYLLABLE RYX;Lo;0;L;;;;;N;;;;; +A3DC;YI SYLLABLE RY;Lo;0;L;;;;;N;;;;; +A3DD;YI SYLLABLE RYP;Lo;0;L;;;;;N;;;;; +A3DE;YI SYLLABLE RYRX;Lo;0;L;;;;;N;;;;; +A3DF;YI SYLLABLE RYR;Lo;0;L;;;;;N;;;;; +A3E0;YI SYLLABLE JIT;Lo;0;L;;;;;N;;;;; +A3E1;YI SYLLABLE JIX;Lo;0;L;;;;;N;;;;; +A3E2;YI SYLLABLE JI;Lo;0;L;;;;;N;;;;; +A3E3;YI SYLLABLE JIP;Lo;0;L;;;;;N;;;;; +A3E4;YI SYLLABLE JIET;Lo;0;L;;;;;N;;;;; +A3E5;YI SYLLABLE JIEX;Lo;0;L;;;;;N;;;;; +A3E6;YI SYLLABLE JIE;Lo;0;L;;;;;N;;;;; +A3E7;YI SYLLABLE JIEP;Lo;0;L;;;;;N;;;;; +A3E8;YI SYLLABLE JUOT;Lo;0;L;;;;;N;;;;; +A3E9;YI SYLLABLE JUOX;Lo;0;L;;;;;N;;;;; +A3EA;YI SYLLABLE JUO;Lo;0;L;;;;;N;;;;; +A3EB;YI SYLLABLE JUOP;Lo;0;L;;;;;N;;;;; +A3EC;YI SYLLABLE JOT;Lo;0;L;;;;;N;;;;; +A3ED;YI SYLLABLE JOX;Lo;0;L;;;;;N;;;;; +A3EE;YI SYLLABLE JO;Lo;0;L;;;;;N;;;;; +A3EF;YI SYLLABLE JOP;Lo;0;L;;;;;N;;;;; +A3F0;YI SYLLABLE JUT;Lo;0;L;;;;;N;;;;; +A3F1;YI SYLLABLE JUX;Lo;0;L;;;;;N;;;;; +A3F2;YI SYLLABLE JU;Lo;0;L;;;;;N;;;;; +A3F3;YI SYLLABLE JUP;Lo;0;L;;;;;N;;;;; +A3F4;YI SYLLABLE JURX;Lo;0;L;;;;;N;;;;; +A3F5;YI SYLLABLE JUR;Lo;0;L;;;;;N;;;;; +A3F6;YI SYLLABLE JYT;Lo;0;L;;;;;N;;;;; +A3F7;YI SYLLABLE JYX;Lo;0;L;;;;;N;;;;; +A3F8;YI SYLLABLE JY;Lo;0;L;;;;;N;;;;; +A3F9;YI SYLLABLE JYP;Lo;0;L;;;;;N;;;;; +A3FA;YI SYLLABLE JYRX;Lo;0;L;;;;;N;;;;; +A3FB;YI SYLLABLE JYR;Lo;0;L;;;;;N;;;;; +A3FC;YI SYLLABLE QIT;Lo;0;L;;;;;N;;;;; +A3FD;YI SYLLABLE QIX;Lo;0;L;;;;;N;;;;; +A3FE;YI SYLLABLE QI;Lo;0;L;;;;;N;;;;; +A3FF;YI SYLLABLE QIP;Lo;0;L;;;;;N;;;;; +A400;YI SYLLABLE QIET;Lo;0;L;;;;;N;;;;; +A401;YI SYLLABLE QIEX;Lo;0;L;;;;;N;;;;; +A402;YI SYLLABLE QIE;Lo;0;L;;;;;N;;;;; +A403;YI SYLLABLE QIEP;Lo;0;L;;;;;N;;;;; +A404;YI SYLLABLE QUOT;Lo;0;L;;;;;N;;;;; +A405;YI SYLLABLE QUOX;Lo;0;L;;;;;N;;;;; +A406;YI SYLLABLE QUO;Lo;0;L;;;;;N;;;;; +A407;YI SYLLABLE QUOP;Lo;0;L;;;;;N;;;;; +A408;YI SYLLABLE QOT;Lo;0;L;;;;;N;;;;; +A409;YI SYLLABLE QOX;Lo;0;L;;;;;N;;;;; +A40A;YI SYLLABLE QO;Lo;0;L;;;;;N;;;;; +A40B;YI SYLLABLE QOP;Lo;0;L;;;;;N;;;;; +A40C;YI SYLLABLE QUT;Lo;0;L;;;;;N;;;;; +A40D;YI SYLLABLE QUX;Lo;0;L;;;;;N;;;;; +A40E;YI SYLLABLE QU;Lo;0;L;;;;;N;;;;; +A40F;YI SYLLABLE QUP;Lo;0;L;;;;;N;;;;; +A410;YI SYLLABLE QURX;Lo;0;L;;;;;N;;;;; +A411;YI SYLLABLE QUR;Lo;0;L;;;;;N;;;;; +A412;YI SYLLABLE QYT;Lo;0;L;;;;;N;;;;; +A413;YI SYLLABLE QYX;Lo;0;L;;;;;N;;;;; +A414;YI SYLLABLE QY;Lo;0;L;;;;;N;;;;; +A415;YI SYLLABLE QYP;Lo;0;L;;;;;N;;;;; +A416;YI SYLLABLE QYRX;Lo;0;L;;;;;N;;;;; +A417;YI SYLLABLE QYR;Lo;0;L;;;;;N;;;;; +A418;YI SYLLABLE JJIT;Lo;0;L;;;;;N;;;;; +A419;YI SYLLABLE JJIX;Lo;0;L;;;;;N;;;;; +A41A;YI SYLLABLE JJI;Lo;0;L;;;;;N;;;;; +A41B;YI SYLLABLE JJIP;Lo;0;L;;;;;N;;;;; +A41C;YI SYLLABLE JJIET;Lo;0;L;;;;;N;;;;; +A41D;YI SYLLABLE JJIEX;Lo;0;L;;;;;N;;;;; +A41E;YI SYLLABLE JJIE;Lo;0;L;;;;;N;;;;; +A41F;YI SYLLABLE JJIEP;Lo;0;L;;;;;N;;;;; +A420;YI SYLLABLE JJUOX;Lo;0;L;;;;;N;;;;; +A421;YI SYLLABLE JJUO;Lo;0;L;;;;;N;;;;; +A422;YI SYLLABLE JJUOP;Lo;0;L;;;;;N;;;;; +A423;YI SYLLABLE JJOT;Lo;0;L;;;;;N;;;;; +A424;YI SYLLABLE JJOX;Lo;0;L;;;;;N;;;;; +A425;YI SYLLABLE JJO;Lo;0;L;;;;;N;;;;; +A426;YI SYLLABLE JJOP;Lo;0;L;;;;;N;;;;; +A427;YI SYLLABLE JJUT;Lo;0;L;;;;;N;;;;; +A428;YI SYLLABLE JJUX;Lo;0;L;;;;;N;;;;; +A429;YI SYLLABLE JJU;Lo;0;L;;;;;N;;;;; +A42A;YI SYLLABLE JJUP;Lo;0;L;;;;;N;;;;; +A42B;YI SYLLABLE JJURX;Lo;0;L;;;;;N;;;;; +A42C;YI SYLLABLE JJUR;Lo;0;L;;;;;N;;;;; +A42D;YI SYLLABLE JJYT;Lo;0;L;;;;;N;;;;; +A42E;YI SYLLABLE JJYX;Lo;0;L;;;;;N;;;;; +A42F;YI SYLLABLE JJY;Lo;0;L;;;;;N;;;;; +A430;YI SYLLABLE JJYP;Lo;0;L;;;;;N;;;;; +A431;YI SYLLABLE NJIT;Lo;0;L;;;;;N;;;;; +A432;YI SYLLABLE NJIX;Lo;0;L;;;;;N;;;;; +A433;YI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; +A434;YI SYLLABLE NJIP;Lo;0;L;;;;;N;;;;; +A435;YI SYLLABLE NJIET;Lo;0;L;;;;;N;;;;; +A436;YI SYLLABLE NJIEX;Lo;0;L;;;;;N;;;;; +A437;YI SYLLABLE NJIE;Lo;0;L;;;;;N;;;;; +A438;YI SYLLABLE NJIEP;Lo;0;L;;;;;N;;;;; +A439;YI SYLLABLE NJUOX;Lo;0;L;;;;;N;;;;; +A43A;YI SYLLABLE NJUO;Lo;0;L;;;;;N;;;;; +A43B;YI SYLLABLE NJOT;Lo;0;L;;;;;N;;;;; +A43C;YI SYLLABLE NJOX;Lo;0;L;;;;;N;;;;; +A43D;YI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; +A43E;YI SYLLABLE NJOP;Lo;0;L;;;;;N;;;;; +A43F;YI SYLLABLE NJUX;Lo;0;L;;;;;N;;;;; +A440;YI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; +A441;YI SYLLABLE NJUP;Lo;0;L;;;;;N;;;;; +A442;YI SYLLABLE NJURX;Lo;0;L;;;;;N;;;;; +A443;YI SYLLABLE NJUR;Lo;0;L;;;;;N;;;;; +A444;YI SYLLABLE NJYT;Lo;0;L;;;;;N;;;;; +A445;YI SYLLABLE NJYX;Lo;0;L;;;;;N;;;;; +A446;YI SYLLABLE NJY;Lo;0;L;;;;;N;;;;; +A447;YI SYLLABLE NJYP;Lo;0;L;;;;;N;;;;; +A448;YI SYLLABLE NJYRX;Lo;0;L;;;;;N;;;;; +A449;YI SYLLABLE NJYR;Lo;0;L;;;;;N;;;;; +A44A;YI SYLLABLE NYIT;Lo;0;L;;;;;N;;;;; +A44B;YI SYLLABLE NYIX;Lo;0;L;;;;;N;;;;; +A44C;YI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +A44D;YI SYLLABLE NYIP;Lo;0;L;;;;;N;;;;; +A44E;YI SYLLABLE NYIET;Lo;0;L;;;;;N;;;;; +A44F;YI SYLLABLE NYIEX;Lo;0;L;;;;;N;;;;; +A450;YI SYLLABLE NYIE;Lo;0;L;;;;;N;;;;; +A451;YI SYLLABLE NYIEP;Lo;0;L;;;;;N;;;;; +A452;YI SYLLABLE NYUOX;Lo;0;L;;;;;N;;;;; +A453;YI SYLLABLE NYUO;Lo;0;L;;;;;N;;;;; +A454;YI SYLLABLE NYUOP;Lo;0;L;;;;;N;;;;; +A455;YI SYLLABLE NYOT;Lo;0;L;;;;;N;;;;; +A456;YI SYLLABLE NYOX;Lo;0;L;;;;;N;;;;; +A457;YI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +A458;YI SYLLABLE NYOP;Lo;0;L;;;;;N;;;;; +A459;YI SYLLABLE NYUT;Lo;0;L;;;;;N;;;;; +A45A;YI SYLLABLE NYUX;Lo;0;L;;;;;N;;;;; +A45B;YI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +A45C;YI SYLLABLE NYUP;Lo;0;L;;;;;N;;;;; +A45D;YI SYLLABLE XIT;Lo;0;L;;;;;N;;;;; +A45E;YI SYLLABLE XIX;Lo;0;L;;;;;N;;;;; +A45F;YI SYLLABLE XI;Lo;0;L;;;;;N;;;;; +A460;YI SYLLABLE XIP;Lo;0;L;;;;;N;;;;; +A461;YI SYLLABLE XIET;Lo;0;L;;;;;N;;;;; +A462;YI SYLLABLE XIEX;Lo;0;L;;;;;N;;;;; +A463;YI SYLLABLE XIE;Lo;0;L;;;;;N;;;;; +A464;YI SYLLABLE XIEP;Lo;0;L;;;;;N;;;;; +A465;YI SYLLABLE XUOX;Lo;0;L;;;;;N;;;;; +A466;YI SYLLABLE XUO;Lo;0;L;;;;;N;;;;; +A467;YI SYLLABLE XOT;Lo;0;L;;;;;N;;;;; +A468;YI SYLLABLE XOX;Lo;0;L;;;;;N;;;;; +A469;YI SYLLABLE XO;Lo;0;L;;;;;N;;;;; +A46A;YI SYLLABLE XOP;Lo;0;L;;;;;N;;;;; +A46B;YI SYLLABLE XYT;Lo;0;L;;;;;N;;;;; +A46C;YI SYLLABLE XYX;Lo;0;L;;;;;N;;;;; +A46D;YI SYLLABLE XY;Lo;0;L;;;;;N;;;;; +A46E;YI SYLLABLE XYP;Lo;0;L;;;;;N;;;;; +A46F;YI SYLLABLE XYRX;Lo;0;L;;;;;N;;;;; +A470;YI SYLLABLE XYR;Lo;0;L;;;;;N;;;;; +A471;YI SYLLABLE YIT;Lo;0;L;;;;;N;;;;; +A472;YI SYLLABLE YIX;Lo;0;L;;;;;N;;;;; +A473;YI SYLLABLE YI;Lo;0;L;;;;;N;;;;; +A474;YI SYLLABLE YIP;Lo;0;L;;;;;N;;;;; +A475;YI SYLLABLE YIET;Lo;0;L;;;;;N;;;;; +A476;YI SYLLABLE YIEX;Lo;0;L;;;;;N;;;;; +A477;YI SYLLABLE YIE;Lo;0;L;;;;;N;;;;; +A478;YI SYLLABLE YIEP;Lo;0;L;;;;;N;;;;; +A479;YI SYLLABLE YUOT;Lo;0;L;;;;;N;;;;; +A47A;YI SYLLABLE YUOX;Lo;0;L;;;;;N;;;;; +A47B;YI SYLLABLE YUO;Lo;0;L;;;;;N;;;;; +A47C;YI SYLLABLE YUOP;Lo;0;L;;;;;N;;;;; +A47D;YI SYLLABLE YOT;Lo;0;L;;;;;N;;;;; +A47E;YI SYLLABLE YOX;Lo;0;L;;;;;N;;;;; +A47F;YI SYLLABLE YO;Lo;0;L;;;;;N;;;;; +A480;YI SYLLABLE YOP;Lo;0;L;;;;;N;;;;; +A481;YI SYLLABLE YUT;Lo;0;L;;;;;N;;;;; +A482;YI SYLLABLE YUX;Lo;0;L;;;;;N;;;;; +A483;YI SYLLABLE YU;Lo;0;L;;;;;N;;;;; +A484;YI SYLLABLE YUP;Lo;0;L;;;;;N;;;;; +A485;YI SYLLABLE YURX;Lo;0;L;;;;;N;;;;; +A486;YI SYLLABLE YUR;Lo;0;L;;;;;N;;;;; +A487;YI SYLLABLE YYT;Lo;0;L;;;;;N;;;;; +A488;YI SYLLABLE YYX;Lo;0;L;;;;;N;;;;; +A489;YI SYLLABLE YY;Lo;0;L;;;;;N;;;;; +A48A;YI SYLLABLE YYP;Lo;0;L;;;;;N;;;;; +A48B;YI SYLLABLE YYRX;Lo;0;L;;;;;N;;;;; +A48C;YI SYLLABLE YYR;Lo;0;L;;;;;N;;;;; +A490;YI RADICAL QOT;So;0;ON;;;;;N;;;;; +A491;YI RADICAL LI;So;0;ON;;;;;N;;;;; +A492;YI RADICAL KIT;So;0;ON;;;;;N;;;;; +A493;YI RADICAL NYIP;So;0;ON;;;;;N;;;;; +A494;YI RADICAL CYP;So;0;ON;;;;;N;;;;; +A495;YI RADICAL SSI;So;0;ON;;;;;N;;;;; +A496;YI RADICAL GGOP;So;0;ON;;;;;N;;;;; +A497;YI RADICAL GEP;So;0;ON;;;;;N;;;;; +A498;YI RADICAL MI;So;0;ON;;;;;N;;;;; +A499;YI RADICAL HXIT;So;0;ON;;;;;N;;;;; +A49A;YI RADICAL LYR;So;0;ON;;;;;N;;;;; +A49B;YI RADICAL BBUT;So;0;ON;;;;;N;;;;; +A49C;YI RADICAL MOP;So;0;ON;;;;;N;;;;; +A49D;YI RADICAL YO;So;0;ON;;;;;N;;;;; +A49E;YI RADICAL PUT;So;0;ON;;;;;N;;;;; +A49F;YI RADICAL HXUO;So;0;ON;;;;;N;;;;; +A4A0;YI RADICAL TAT;So;0;ON;;;;;N;;;;; +A4A1;YI RADICAL GA;So;0;ON;;;;;N;;;;; +A4A2;YI RADICAL ZUP;So;0;ON;;;;;N;;;;; +A4A3;YI RADICAL CYT;So;0;ON;;;;;N;;;;; +A4A4;YI RADICAL DDUR;So;0;ON;;;;;N;;;;; +A4A5;YI RADICAL BUR;So;0;ON;;;;;N;;;;; +A4A6;YI RADICAL GGUO;So;0;ON;;;;;N;;;;; +A4A7;YI RADICAL NYOP;So;0;ON;;;;;N;;;;; +A4A8;YI RADICAL TU;So;0;ON;;;;;N;;;;; +A4A9;YI RADICAL OP;So;0;ON;;;;;N;;;;; +A4AA;YI RADICAL JJUT;So;0;ON;;;;;N;;;;; +A4AB;YI RADICAL ZOT;So;0;ON;;;;;N;;;;; +A4AC;YI RADICAL PYT;So;0;ON;;;;;N;;;;; +A4AD;YI RADICAL HMO;So;0;ON;;;;;N;;;;; +A4AE;YI RADICAL YIT;So;0;ON;;;;;N;;;;; +A4AF;YI RADICAL VUR;So;0;ON;;;;;N;;;;; +A4B0;YI RADICAL SHY;So;0;ON;;;;;N;;;;; +A4B1;YI RADICAL VEP;So;0;ON;;;;;N;;;;; +A4B2;YI RADICAL ZA;So;0;ON;;;;;N;;;;; +A4B3;YI RADICAL JO;So;0;ON;;;;;N;;;;; +A4B4;YI RADICAL NZUP;So;0;ON;;;;;N;;;;; +A4B5;YI RADICAL JJY;So;0;ON;;;;;N;;;;; +A4B6;YI RADICAL GOT;So;0;ON;;;;;N;;;;; +A4B7;YI RADICAL JJIE;So;0;ON;;;;;N;;;;; +A4B8;YI RADICAL WO;So;0;ON;;;;;N;;;;; +A4B9;YI RADICAL DU;So;0;ON;;;;;N;;;;; +A4BA;YI RADICAL SHUR;So;0;ON;;;;;N;;;;; +A4BB;YI RADICAL LIE;So;0;ON;;;;;N;;;;; +A4BC;YI RADICAL CY;So;0;ON;;;;;N;;;;; +A4BD;YI RADICAL CUOP;So;0;ON;;;;;N;;;;; +A4BE;YI RADICAL CIP;So;0;ON;;;;;N;;;;; +A4BF;YI RADICAL HXOP;So;0;ON;;;;;N;;;;; +A4C0;YI RADICAL SHAT;So;0;ON;;;;;N;;;;; +A4C1;YI RADICAL ZUR;So;0;ON;;;;;N;;;;; +A4C2;YI RADICAL SHOP;So;0;ON;;;;;N;;;;; +A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;; +A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;; +A4C5;YI RADICAL NBIE;So;0;ON;;;;;N;;;;; +A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;; +AC00;<Hangul Syllable, First>;Lo;0;L;;;;;N;;;;; +D7A3;<Hangul Syllable, Last>;Lo;0;L;;;;;N;;;;; +D800;<Non Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;; +DB7F;<Non Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;; +DB80;<Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;; +DBFF;<Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;; +DC00;<Low Surrogate, First>;Cs;0;L;;;;;N;;;;; +DFFF;<Low Surrogate, Last>;Cs;0;L;;;;;N;;;;; +E000;<Private Use, First>;Co;0;L;;;;;N;;;;; +F8FF;<Private Use, Last>;Co;0;L;;;;;N;;;;; +F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;; +F901;CJK COMPATIBILITY IDEOGRAPH-F901;Lo;0;L;66F4;;;;N;;;;; +F902;CJK COMPATIBILITY IDEOGRAPH-F902;Lo;0;L;8ECA;;;;N;;;;; +F903;CJK COMPATIBILITY IDEOGRAPH-F903;Lo;0;L;8CC8;;;;N;;;;; +F904;CJK COMPATIBILITY IDEOGRAPH-F904;Lo;0;L;6ED1;;;;N;;;;; +F905;CJK COMPATIBILITY IDEOGRAPH-F905;Lo;0;L;4E32;;;;N;;;;; +F906;CJK COMPATIBILITY IDEOGRAPH-F906;Lo;0;L;53E5;;;;N;;;;; +F907;CJK COMPATIBILITY IDEOGRAPH-F907;Lo;0;L;9F9C;;;;N;;;;; +F908;CJK COMPATIBILITY IDEOGRAPH-F908;Lo;0;L;9F9C;;;;N;;;;; +F909;CJK COMPATIBILITY IDEOGRAPH-F909;Lo;0;L;5951;;;;N;;;;; +F90A;CJK COMPATIBILITY IDEOGRAPH-F90A;Lo;0;L;91D1;;;;N;;;;; +F90B;CJK COMPATIBILITY IDEOGRAPH-F90B;Lo;0;L;5587;;;;N;;;;; +F90C;CJK COMPATIBILITY IDEOGRAPH-F90C;Lo;0;L;5948;;;;N;;;;; +F90D;CJK COMPATIBILITY IDEOGRAPH-F90D;Lo;0;L;61F6;;;;N;;;;; +F90E;CJK COMPATIBILITY IDEOGRAPH-F90E;Lo;0;L;7669;;;;N;;;;; +F90F;CJK COMPATIBILITY IDEOGRAPH-F90F;Lo;0;L;7F85;;;;N;;;;; +F910;CJK COMPATIBILITY IDEOGRAPH-F910;Lo;0;L;863F;;;;N;;;;; +F911;CJK COMPATIBILITY IDEOGRAPH-F911;Lo;0;L;87BA;;;;N;;;;; +F912;CJK COMPATIBILITY IDEOGRAPH-F912;Lo;0;L;88F8;;;;N;;;;; +F913;CJK COMPATIBILITY IDEOGRAPH-F913;Lo;0;L;908F;;;;N;;;;; +F914;CJK COMPATIBILITY IDEOGRAPH-F914;Lo;0;L;6A02;;;;N;;;;; +F915;CJK COMPATIBILITY IDEOGRAPH-F915;Lo;0;L;6D1B;;;;N;;;;; +F916;CJK COMPATIBILITY IDEOGRAPH-F916;Lo;0;L;70D9;;;;N;;;;; +F917;CJK COMPATIBILITY IDEOGRAPH-F917;Lo;0;L;73DE;;;;N;;;;; +F918;CJK COMPATIBILITY IDEOGRAPH-F918;Lo;0;L;843D;;;;N;;;;; +F919;CJK COMPATIBILITY IDEOGRAPH-F919;Lo;0;L;916A;;;;N;;;;; +F91A;CJK COMPATIBILITY IDEOGRAPH-F91A;Lo;0;L;99F1;;;;N;;;;; +F91B;CJK COMPATIBILITY IDEOGRAPH-F91B;Lo;0;L;4E82;;;;N;;;;; +F91C;CJK COMPATIBILITY IDEOGRAPH-F91C;Lo;0;L;5375;;;;N;;;;; +F91D;CJK COMPATIBILITY IDEOGRAPH-F91D;Lo;0;L;6B04;;;;N;;;;; +F91E;CJK COMPATIBILITY IDEOGRAPH-F91E;Lo;0;L;721B;;;;N;;;;; +F91F;CJK COMPATIBILITY IDEOGRAPH-F91F;Lo;0;L;862D;;;;N;;;;; +F920;CJK COMPATIBILITY IDEOGRAPH-F920;Lo;0;L;9E1E;;;;N;;;;; +F921;CJK COMPATIBILITY IDEOGRAPH-F921;Lo;0;L;5D50;;;;N;;;;; +F922;CJK COMPATIBILITY IDEOGRAPH-F922;Lo;0;L;6FEB;;;;N;;;;; +F923;CJK COMPATIBILITY IDEOGRAPH-F923;Lo;0;L;85CD;;;;N;;;;; +F924;CJK COMPATIBILITY IDEOGRAPH-F924;Lo;0;L;8964;;;;N;;;;; +F925;CJK COMPATIBILITY IDEOGRAPH-F925;Lo;0;L;62C9;;;;N;;;;; +F926;CJK COMPATIBILITY IDEOGRAPH-F926;Lo;0;L;81D8;;;;N;;;;; +F927;CJK COMPATIBILITY IDEOGRAPH-F927;Lo;0;L;881F;;;;N;;;;; +F928;CJK COMPATIBILITY IDEOGRAPH-F928;Lo;0;L;5ECA;;;;N;;;;; +F929;CJK COMPATIBILITY IDEOGRAPH-F929;Lo;0;L;6717;;;;N;;;;; +F92A;CJK COMPATIBILITY IDEOGRAPH-F92A;Lo;0;L;6D6A;;;;N;;;;; +F92B;CJK COMPATIBILITY IDEOGRAPH-F92B;Lo;0;L;72FC;;;;N;;;;; +F92C;CJK COMPATIBILITY IDEOGRAPH-F92C;Lo;0;L;90CE;;;;N;;;;; +F92D;CJK COMPATIBILITY IDEOGRAPH-F92D;Lo;0;L;4F86;;;;N;;;;; +F92E;CJK COMPATIBILITY IDEOGRAPH-F92E;Lo;0;L;51B7;;;;N;;;;; +F92F;CJK COMPATIBILITY IDEOGRAPH-F92F;Lo;0;L;52DE;;;;N;;;;; +F930;CJK COMPATIBILITY IDEOGRAPH-F930;Lo;0;L;64C4;;;;N;;;;; +F931;CJK COMPATIBILITY IDEOGRAPH-F931;Lo;0;L;6AD3;;;;N;;;;; +F932;CJK COMPATIBILITY IDEOGRAPH-F932;Lo;0;L;7210;;;;N;;;;; +F933;CJK COMPATIBILITY IDEOGRAPH-F933;Lo;0;L;76E7;;;;N;;;;; +F934;CJK COMPATIBILITY IDEOGRAPH-F934;Lo;0;L;8001;;;;N;;;;; +F935;CJK COMPATIBILITY IDEOGRAPH-F935;Lo;0;L;8606;;;;N;;;;; +F936;CJK COMPATIBILITY IDEOGRAPH-F936;Lo;0;L;865C;;;;N;;;;; +F937;CJK COMPATIBILITY IDEOGRAPH-F937;Lo;0;L;8DEF;;;;N;;;;; +F938;CJK COMPATIBILITY IDEOGRAPH-F938;Lo;0;L;9732;;;;N;;;;; +F939;CJK COMPATIBILITY IDEOGRAPH-F939;Lo;0;L;9B6F;;;;N;;;;; +F93A;CJK COMPATIBILITY IDEOGRAPH-F93A;Lo;0;L;9DFA;;;;N;;;;; +F93B;CJK COMPATIBILITY IDEOGRAPH-F93B;Lo;0;L;788C;;;;N;;;;; +F93C;CJK COMPATIBILITY IDEOGRAPH-F93C;Lo;0;L;797F;;;;N;;;;; +F93D;CJK COMPATIBILITY IDEOGRAPH-F93D;Lo;0;L;7DA0;;;;N;;;;; +F93E;CJK COMPATIBILITY IDEOGRAPH-F93E;Lo;0;L;83C9;;;;N;;;;; +F93F;CJK COMPATIBILITY IDEOGRAPH-F93F;Lo;0;L;9304;;;;N;;;;; +F940;CJK COMPATIBILITY IDEOGRAPH-F940;Lo;0;L;9E7F;;;;N;;;;; +F941;CJK COMPATIBILITY IDEOGRAPH-F941;Lo;0;L;8AD6;;;;N;;;;; +F942;CJK COMPATIBILITY IDEOGRAPH-F942;Lo;0;L;58DF;;;;N;;;;; +F943;CJK COMPATIBILITY IDEOGRAPH-F943;Lo;0;L;5F04;;;;N;;;;; +F944;CJK COMPATIBILITY IDEOGRAPH-F944;Lo;0;L;7C60;;;;N;;;;; +F945;CJK COMPATIBILITY IDEOGRAPH-F945;Lo;0;L;807E;;;;N;;;;; +F946;CJK COMPATIBILITY IDEOGRAPH-F946;Lo;0;L;7262;;;;N;;;;; +F947;CJK COMPATIBILITY IDEOGRAPH-F947;Lo;0;L;78CA;;;;N;;;;; +F948;CJK COMPATIBILITY IDEOGRAPH-F948;Lo;0;L;8CC2;;;;N;;;;; +F949;CJK COMPATIBILITY IDEOGRAPH-F949;Lo;0;L;96F7;;;;N;;;;; +F94A;CJK COMPATIBILITY IDEOGRAPH-F94A;Lo;0;L;58D8;;;;N;;;;; +F94B;CJK COMPATIBILITY IDEOGRAPH-F94B;Lo;0;L;5C62;;;;N;;;;; +F94C;CJK COMPATIBILITY IDEOGRAPH-F94C;Lo;0;L;6A13;;;;N;;;;; +F94D;CJK COMPATIBILITY IDEOGRAPH-F94D;Lo;0;L;6DDA;;;;N;;;;; +F94E;CJK COMPATIBILITY IDEOGRAPH-F94E;Lo;0;L;6F0F;;;;N;;;;; +F94F;CJK COMPATIBILITY IDEOGRAPH-F94F;Lo;0;L;7D2F;;;;N;;;;; +F950;CJK COMPATIBILITY IDEOGRAPH-F950;Lo;0;L;7E37;;;;N;;;;; +F951;CJK COMPATIBILITY IDEOGRAPH-F951;Lo;0;L;964B;;;;N;;;;; +F952;CJK COMPATIBILITY IDEOGRAPH-F952;Lo;0;L;52D2;;;;N;;;;; +F953;CJK COMPATIBILITY IDEOGRAPH-F953;Lo;0;L;808B;;;;N;;;;; +F954;CJK COMPATIBILITY IDEOGRAPH-F954;Lo;0;L;51DC;;;;N;;;;; +F955;CJK COMPATIBILITY IDEOGRAPH-F955;Lo;0;L;51CC;;;;N;;;;; +F956;CJK COMPATIBILITY IDEOGRAPH-F956;Lo;0;L;7A1C;;;;N;;;;; +F957;CJK COMPATIBILITY IDEOGRAPH-F957;Lo;0;L;7DBE;;;;N;;;;; +F958;CJK COMPATIBILITY IDEOGRAPH-F958;Lo;0;L;83F1;;;;N;;;;; +F959;CJK COMPATIBILITY IDEOGRAPH-F959;Lo;0;L;9675;;;;N;;;;; +F95A;CJK COMPATIBILITY IDEOGRAPH-F95A;Lo;0;L;8B80;;;;N;;;;; +F95B;CJK COMPATIBILITY IDEOGRAPH-F95B;Lo;0;L;62CF;;;;N;;;;; +F95C;CJK COMPATIBILITY IDEOGRAPH-F95C;Lo;0;L;6A02;;;;N;;;;; +F95D;CJK COMPATIBILITY IDEOGRAPH-F95D;Lo;0;L;8AFE;;;;N;;;;; +F95E;CJK COMPATIBILITY IDEOGRAPH-F95E;Lo;0;L;4E39;;;;N;;;;; +F95F;CJK COMPATIBILITY IDEOGRAPH-F95F;Lo;0;L;5BE7;;;;N;;;;; +F960;CJK COMPATIBILITY IDEOGRAPH-F960;Lo;0;L;6012;;;;N;;;;; +F961;CJK COMPATIBILITY IDEOGRAPH-F961;Lo;0;L;7387;;;;N;;;;; +F962;CJK COMPATIBILITY IDEOGRAPH-F962;Lo;0;L;7570;;;;N;;;;; +F963;CJK COMPATIBILITY IDEOGRAPH-F963;Lo;0;L;5317;;;;N;;;;; +F964;CJK COMPATIBILITY IDEOGRAPH-F964;Lo;0;L;78FB;;;;N;;;;; +F965;CJK COMPATIBILITY IDEOGRAPH-F965;Lo;0;L;4FBF;;;;N;;;;; +F966;CJK COMPATIBILITY IDEOGRAPH-F966;Lo;0;L;5FA9;;;;N;;;;; +F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;; +F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;; +F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;; +F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;; +F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;;N;;;;; +F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;; +F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;; +F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;; +F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;; +F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;; +F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;; +F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;; +F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;;N;;;;; +F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;; +F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;; +F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;; +F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;; +F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;;N;;;;; +F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;; +F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;; +F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;; +F97C;CJK COMPATIBILITY IDEOGRAPH-F97C;Lo;0;L;826F;;;;N;;;;; +F97D;CJK COMPATIBILITY IDEOGRAPH-F97D;Lo;0;L;8AD2;;;;N;;;;; +F97E;CJK COMPATIBILITY IDEOGRAPH-F97E;Lo;0;L;91CF;;;;N;;;;; +F97F;CJK COMPATIBILITY IDEOGRAPH-F97F;Lo;0;L;52F5;;;;N;;;;; +F980;CJK COMPATIBILITY IDEOGRAPH-F980;Lo;0;L;5442;;;;N;;;;; +F981;CJK COMPATIBILITY IDEOGRAPH-F981;Lo;0;L;5973;;;;N;;;;; +F982;CJK COMPATIBILITY IDEOGRAPH-F982;Lo;0;L;5EEC;;;;N;;;;; +F983;CJK COMPATIBILITY IDEOGRAPH-F983;Lo;0;L;65C5;;;;N;;;;; +F984;CJK COMPATIBILITY IDEOGRAPH-F984;Lo;0;L;6FFE;;;;N;;;;; +F985;CJK COMPATIBILITY IDEOGRAPH-F985;Lo;0;L;792A;;;;N;;;;; +F986;CJK COMPATIBILITY IDEOGRAPH-F986;Lo;0;L;95AD;;;;N;;;;; +F987;CJK COMPATIBILITY IDEOGRAPH-F987;Lo;0;L;9A6A;;;;N;;;;; +F988;CJK COMPATIBILITY IDEOGRAPH-F988;Lo;0;L;9E97;;;;N;;;;; +F989;CJK COMPATIBILITY IDEOGRAPH-F989;Lo;0;L;9ECE;;;;N;;;;; +F98A;CJK COMPATIBILITY IDEOGRAPH-F98A;Lo;0;L;529B;;;;N;;;;; +F98B;CJK COMPATIBILITY IDEOGRAPH-F98B;Lo;0;L;66C6;;;;N;;;;; +F98C;CJK COMPATIBILITY IDEOGRAPH-F98C;Lo;0;L;6B77;;;;N;;;;; +F98D;CJK COMPATIBILITY IDEOGRAPH-F98D;Lo;0;L;8F62;;;;N;;;;; +F98E;CJK COMPATIBILITY IDEOGRAPH-F98E;Lo;0;L;5E74;;;;N;;;;; +F98F;CJK COMPATIBILITY IDEOGRAPH-F98F;Lo;0;L;6190;;;;N;;;;; +F990;CJK COMPATIBILITY IDEOGRAPH-F990;Lo;0;L;6200;;;;N;;;;; +F991;CJK COMPATIBILITY IDEOGRAPH-F991;Lo;0;L;649A;;;;N;;;;; +F992;CJK COMPATIBILITY IDEOGRAPH-F992;Lo;0;L;6F23;;;;N;;;;; +F993;CJK COMPATIBILITY IDEOGRAPH-F993;Lo;0;L;7149;;;;N;;;;; +F994;CJK COMPATIBILITY IDEOGRAPH-F994;Lo;0;L;7489;;;;N;;;;; +F995;CJK COMPATIBILITY IDEOGRAPH-F995;Lo;0;L;79CA;;;;N;;;;; +F996;CJK COMPATIBILITY IDEOGRAPH-F996;Lo;0;L;7DF4;;;;N;;;;; +F997;CJK COMPATIBILITY IDEOGRAPH-F997;Lo;0;L;806F;;;;N;;;;; +F998;CJK COMPATIBILITY IDEOGRAPH-F998;Lo;0;L;8F26;;;;N;;;;; +F999;CJK COMPATIBILITY IDEOGRAPH-F999;Lo;0;L;84EE;;;;N;;;;; +F99A;CJK COMPATIBILITY IDEOGRAPH-F99A;Lo;0;L;9023;;;;N;;;;; +F99B;CJK COMPATIBILITY IDEOGRAPH-F99B;Lo;0;L;934A;;;;N;;;;; +F99C;CJK COMPATIBILITY IDEOGRAPH-F99C;Lo;0;L;5217;;;;N;;;;; +F99D;CJK COMPATIBILITY IDEOGRAPH-F99D;Lo;0;L;52A3;;;;N;;;;; +F99E;CJK COMPATIBILITY IDEOGRAPH-F99E;Lo;0;L;54BD;;;;N;;;;; +F99F;CJK COMPATIBILITY IDEOGRAPH-F99F;Lo;0;L;70C8;;;;N;;;;; +F9A0;CJK COMPATIBILITY IDEOGRAPH-F9A0;Lo;0;L;88C2;;;;N;;;;; +F9A1;CJK COMPATIBILITY IDEOGRAPH-F9A1;Lo;0;L;8AAA;;;;N;;;;; +F9A2;CJK COMPATIBILITY IDEOGRAPH-F9A2;Lo;0;L;5EC9;;;;N;;;;; +F9A3;CJK COMPATIBILITY IDEOGRAPH-F9A3;Lo;0;L;5FF5;;;;N;;;;; +F9A4;CJK COMPATIBILITY IDEOGRAPH-F9A4;Lo;0;L;637B;;;;N;;;;; +F9A5;CJK COMPATIBILITY IDEOGRAPH-F9A5;Lo;0;L;6BAE;;;;N;;;;; +F9A6;CJK COMPATIBILITY IDEOGRAPH-F9A6;Lo;0;L;7C3E;;;;N;;;;; +F9A7;CJK COMPATIBILITY IDEOGRAPH-F9A7;Lo;0;L;7375;;;;N;;;;; +F9A8;CJK COMPATIBILITY IDEOGRAPH-F9A8;Lo;0;L;4EE4;;;;N;;;;; +F9A9;CJK COMPATIBILITY IDEOGRAPH-F9A9;Lo;0;L;56F9;;;;N;;;;; +F9AA;CJK COMPATIBILITY IDEOGRAPH-F9AA;Lo;0;L;5BE7;;;;N;;;;; +F9AB;CJK COMPATIBILITY IDEOGRAPH-F9AB;Lo;0;L;5DBA;;;;N;;;;; +F9AC;CJK COMPATIBILITY IDEOGRAPH-F9AC;Lo;0;L;601C;;;;N;;;;; +F9AD;CJK COMPATIBILITY IDEOGRAPH-F9AD;Lo;0;L;73B2;;;;N;;;;; +F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;; +F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;; +F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;; +F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;; +F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;;N;;;;; +F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;; +F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;; +F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;; +F9B6;CJK COMPATIBILITY IDEOGRAPH-F9B6;Lo;0;L;79AE;;;;N;;;;; +F9B7;CJK COMPATIBILITY IDEOGRAPH-F9B7;Lo;0;L;91B4;;;;N;;;;; +F9B8;CJK COMPATIBILITY IDEOGRAPH-F9B8;Lo;0;L;96B8;;;;N;;;;; +F9B9;CJK COMPATIBILITY IDEOGRAPH-F9B9;Lo;0;L;60E1;;;;N;;;;; +F9BA;CJK COMPATIBILITY IDEOGRAPH-F9BA;Lo;0;L;4E86;;;;N;;;;; +F9BB;CJK COMPATIBILITY IDEOGRAPH-F9BB;Lo;0;L;50DA;;;;N;;;;; +F9BC;CJK COMPATIBILITY IDEOGRAPH-F9BC;Lo;0;L;5BEE;;;;N;;;;; +F9BD;CJK COMPATIBILITY IDEOGRAPH-F9BD;Lo;0;L;5C3F;;;;N;;;;; +F9BE;CJK COMPATIBILITY IDEOGRAPH-F9BE;Lo;0;L;6599;;;;N;;;;; +F9BF;CJK COMPATIBILITY IDEOGRAPH-F9BF;Lo;0;L;6A02;;;;N;;;;; +F9C0;CJK COMPATIBILITY IDEOGRAPH-F9C0;Lo;0;L;71CE;;;;N;;;;; +F9C1;CJK COMPATIBILITY IDEOGRAPH-F9C1;Lo;0;L;7642;;;;N;;;;; +F9C2;CJK COMPATIBILITY IDEOGRAPH-F9C2;Lo;0;L;84FC;;;;N;;;;; +F9C3;CJK COMPATIBILITY IDEOGRAPH-F9C3;Lo;0;L;907C;;;;N;;;;; +F9C4;CJK COMPATIBILITY IDEOGRAPH-F9C4;Lo;0;L;9F8D;;;;N;;;;; +F9C5;CJK COMPATIBILITY IDEOGRAPH-F9C5;Lo;0;L;6688;;;;N;;;;; +F9C6;CJK COMPATIBILITY IDEOGRAPH-F9C6;Lo;0;L;962E;;;;N;;;;; +F9C7;CJK COMPATIBILITY IDEOGRAPH-F9C7;Lo;0;L;5289;;;;N;;;;; +F9C8;CJK COMPATIBILITY IDEOGRAPH-F9C8;Lo;0;L;677B;;;;N;;;;; +F9C9;CJK COMPATIBILITY IDEOGRAPH-F9C9;Lo;0;L;67F3;;;;N;;;;; +F9CA;CJK COMPATIBILITY IDEOGRAPH-F9CA;Lo;0;L;6D41;;;;N;;;;; +F9CB;CJK COMPATIBILITY IDEOGRAPH-F9CB;Lo;0;L;6E9C;;;;N;;;;; +F9CC;CJK COMPATIBILITY IDEOGRAPH-F9CC;Lo;0;L;7409;;;;N;;;;; +F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;; +F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;; +F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;; +F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;; +F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;;N;;;;; +F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;; +F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;;N;;;;; +F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;; +F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;; +F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;; +F9D7;CJK COMPATIBILITY IDEOGRAPH-F9D7;Lo;0;L;8F2A;;;;N;;;;; +F9D8;CJK COMPATIBILITY IDEOGRAPH-F9D8;Lo;0;L;5F8B;;;;N;;;;; +F9D9;CJK COMPATIBILITY IDEOGRAPH-F9D9;Lo;0;L;6144;;;;N;;;;; +F9DA;CJK COMPATIBILITY IDEOGRAPH-F9DA;Lo;0;L;6817;;;;N;;;;; +F9DB;CJK COMPATIBILITY IDEOGRAPH-F9DB;Lo;0;L;7387;;;;N;;;;; +F9DC;CJK COMPATIBILITY IDEOGRAPH-F9DC;Lo;0;L;9686;;;;N;;;;; +F9DD;CJK COMPATIBILITY IDEOGRAPH-F9DD;Lo;0;L;5229;;;;N;;;;; +F9DE;CJK COMPATIBILITY IDEOGRAPH-F9DE;Lo;0;L;540F;;;;N;;;;; +F9DF;CJK COMPATIBILITY IDEOGRAPH-F9DF;Lo;0;L;5C65;;;;N;;;;; +F9E0;CJK COMPATIBILITY IDEOGRAPH-F9E0;Lo;0;L;6613;;;;N;;;;; +F9E1;CJK COMPATIBILITY IDEOGRAPH-F9E1;Lo;0;L;674E;;;;N;;;;; +F9E2;CJK COMPATIBILITY IDEOGRAPH-F9E2;Lo;0;L;68A8;;;;N;;;;; +F9E3;CJK COMPATIBILITY IDEOGRAPH-F9E3;Lo;0;L;6CE5;;;;N;;;;; +F9E4;CJK COMPATIBILITY IDEOGRAPH-F9E4;Lo;0;L;7406;;;;N;;;;; +F9E5;CJK COMPATIBILITY IDEOGRAPH-F9E5;Lo;0;L;75E2;;;;N;;;;; +F9E6;CJK COMPATIBILITY IDEOGRAPH-F9E6;Lo;0;L;7F79;;;;N;;;;; +F9E7;CJK COMPATIBILITY IDEOGRAPH-F9E7;Lo;0;L;88CF;;;;N;;;;; +F9E8;CJK COMPATIBILITY IDEOGRAPH-F9E8;Lo;0;L;88E1;;;;N;;;;; +F9E9;CJK COMPATIBILITY IDEOGRAPH-F9E9;Lo;0;L;91CC;;;;N;;;;; +F9EA;CJK COMPATIBILITY IDEOGRAPH-F9EA;Lo;0;L;96E2;;;;N;;;;; +F9EB;CJK COMPATIBILITY IDEOGRAPH-F9EB;Lo;0;L;533F;;;;N;;;;; +F9EC;CJK COMPATIBILITY IDEOGRAPH-F9EC;Lo;0;L;6EBA;;;;N;;;;; +F9ED;CJK COMPATIBILITY IDEOGRAPH-F9ED;Lo;0;L;541D;;;;N;;;;; +F9EE;CJK COMPATIBILITY IDEOGRAPH-F9EE;Lo;0;L;71D0;;;;N;;;;; +F9EF;CJK COMPATIBILITY IDEOGRAPH-F9EF;Lo;0;L;7498;;;;N;;;;; +F9F0;CJK COMPATIBILITY IDEOGRAPH-F9F0;Lo;0;L;85FA;;;;N;;;;; +F9F1;CJK COMPATIBILITY IDEOGRAPH-F9F1;Lo;0;L;96A3;;;;N;;;;; +F9F2;CJK COMPATIBILITY IDEOGRAPH-F9F2;Lo;0;L;9C57;;;;N;;;;; +F9F3;CJK COMPATIBILITY IDEOGRAPH-F9F3;Lo;0;L;9E9F;;;;N;;;;; +F9F4;CJK COMPATIBILITY IDEOGRAPH-F9F4;Lo;0;L;6797;;;;N;;;;; +F9F5;CJK COMPATIBILITY IDEOGRAPH-F9F5;Lo;0;L;6DCB;;;;N;;;;; +F9F6;CJK COMPATIBILITY IDEOGRAPH-F9F6;Lo;0;L;81E8;;;;N;;;;; +F9F7;CJK COMPATIBILITY IDEOGRAPH-F9F7;Lo;0;L;7ACB;;;;N;;;;; +F9F8;CJK COMPATIBILITY IDEOGRAPH-F9F8;Lo;0;L;7B20;;;;N;;;;; +F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;; +F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;; +F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;; +F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;; +F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;;N;;;;; +F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;; +F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;; +FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;; +FA01;CJK COMPATIBILITY IDEOGRAPH-FA01;Lo;0;L;5EA6;;;;N;;;;; +FA02;CJK COMPATIBILITY IDEOGRAPH-FA02;Lo;0;L;62D3;;;;N;;;;; +FA03;CJK COMPATIBILITY IDEOGRAPH-FA03;Lo;0;L;7CD6;;;;N;;;;; +FA04;CJK COMPATIBILITY IDEOGRAPH-FA04;Lo;0;L;5B85;;;;N;;;;; +FA05;CJK COMPATIBILITY IDEOGRAPH-FA05;Lo;0;L;6D1E;;;;N;;;;; +FA06;CJK COMPATIBILITY IDEOGRAPH-FA06;Lo;0;L;66B4;;;;N;;;;; +FA07;CJK COMPATIBILITY IDEOGRAPH-FA07;Lo;0;L;8F3B;;;;N;;;;; +FA08;CJK COMPATIBILITY IDEOGRAPH-FA08;Lo;0;L;884C;;;;N;;;;; +FA09;CJK COMPATIBILITY IDEOGRAPH-FA09;Lo;0;L;964D;;;;N;;;;; +FA0A;CJK COMPATIBILITY IDEOGRAPH-FA0A;Lo;0;L;898B;;;;N;;;;; +FA0B;CJK COMPATIBILITY IDEOGRAPH-FA0B;Lo;0;L;5ED3;;;;N;;;;; +FA0C;CJK COMPATIBILITY IDEOGRAPH-FA0C;Lo;0;L;5140;;;;N;;;;; +FA0D;CJK COMPATIBILITY IDEOGRAPH-FA0D;Lo;0;L;55C0;;;;N;;;;; +FA0E;CJK COMPATIBILITY IDEOGRAPH-FA0E;Lo;0;L;;;;;N;;;;; +FA0F;CJK COMPATIBILITY IDEOGRAPH-FA0F;Lo;0;L;;;;;N;;;;; +FA10;CJK COMPATIBILITY IDEOGRAPH-FA10;Lo;0;L;585A;;;;N;;;;; +FA11;CJK COMPATIBILITY IDEOGRAPH-FA11;Lo;0;L;;;;;N;;;;; +FA12;CJK COMPATIBILITY IDEOGRAPH-FA12;Lo;0;L;6674;;;;N;;;;; +FA13;CJK COMPATIBILITY IDEOGRAPH-FA13;Lo;0;L;;;;;N;;;;; +FA14;CJK COMPATIBILITY IDEOGRAPH-FA14;Lo;0;L;;;;;N;;;;; +FA15;CJK COMPATIBILITY IDEOGRAPH-FA15;Lo;0;L;51DE;;;;N;;;;; +FA16;CJK COMPATIBILITY IDEOGRAPH-FA16;Lo;0;L;732A;;;;N;;;;; +FA17;CJK COMPATIBILITY IDEOGRAPH-FA17;Lo;0;L;76CA;;;;N;;;;; +FA18;CJK COMPATIBILITY IDEOGRAPH-FA18;Lo;0;L;793C;;;;N;;;;; +FA19;CJK COMPATIBILITY IDEOGRAPH-FA19;Lo;0;L;795E;;;;N;;;;; +FA1A;CJK COMPATIBILITY IDEOGRAPH-FA1A;Lo;0;L;7965;;;;N;;;;; +FA1B;CJK COMPATIBILITY IDEOGRAPH-FA1B;Lo;0;L;798F;;;;N;;;;; +FA1C;CJK COMPATIBILITY IDEOGRAPH-FA1C;Lo;0;L;9756;;;;N;;;;; +FA1D;CJK COMPATIBILITY IDEOGRAPH-FA1D;Lo;0;L;7CBE;;;;N;;;;; +FA1E;CJK COMPATIBILITY IDEOGRAPH-FA1E;Lo;0;L;7FBD;;;;N;;;;; +FA1F;CJK COMPATIBILITY IDEOGRAPH-FA1F;Lo;0;L;;;;;N;;*;;; +FA20;CJK COMPATIBILITY IDEOGRAPH-FA20;Lo;0;L;8612;;;;N;;;;; +FA21;CJK COMPATIBILITY IDEOGRAPH-FA21;Lo;0;L;;;;;N;;;;; +FA22;CJK COMPATIBILITY IDEOGRAPH-FA22;Lo;0;L;8AF8;;;;N;;;;; +FA23;CJK COMPATIBILITY IDEOGRAPH-FA23;Lo;0;L;;;;;N;;*;;; +FA24;CJK COMPATIBILITY IDEOGRAPH-FA24;Lo;0;L;;;;;N;;;;; +FA25;CJK COMPATIBILITY IDEOGRAPH-FA25;Lo;0;L;9038;;;;N;;;;; +FA26;CJK COMPATIBILITY IDEOGRAPH-FA26;Lo;0;L;90FD;;;;N;;;;; +FA27;CJK COMPATIBILITY IDEOGRAPH-FA27;Lo;0;L;;;;;N;;;;; +FA28;CJK COMPATIBILITY IDEOGRAPH-FA28;Lo;0;L;;;;;N;;;;; +FA29;CJK COMPATIBILITY IDEOGRAPH-FA29;Lo;0;L;;;;;N;;;;; +FA2A;CJK COMPATIBILITY IDEOGRAPH-FA2A;Lo;0;L;98EF;;;;N;;;;; +FA2B;CJK COMPATIBILITY IDEOGRAPH-FA2B;Lo;0;L;98FC;;;;N;;;;; +FA2C;CJK COMPATIBILITY IDEOGRAPH-FA2C;Lo;0;L;9928;;;;N;;;;; +FA2D;CJK COMPATIBILITY IDEOGRAPH-FA2D;Lo;0;L;9DB4;;;;N;;;;; +FA30;CJK COMPATIBILITY IDEOGRAPH-FA30;Lo;0;L;4FAE;;;;N;;;;; +FA31;CJK COMPATIBILITY IDEOGRAPH-FA31;Lo;0;L;50E7;;;;N;;;;; +FA32;CJK COMPATIBILITY IDEOGRAPH-FA32;Lo;0;L;514D;;;;N;;;;; +FA33;CJK COMPATIBILITY IDEOGRAPH-FA33;Lo;0;L;52C9;;;;N;;;;; +FA34;CJK COMPATIBILITY IDEOGRAPH-FA34;Lo;0;L;52E4;;;;N;;;;; +FA35;CJK COMPATIBILITY IDEOGRAPH-FA35;Lo;0;L;5351;;;;N;;;;; +FA36;CJK COMPATIBILITY IDEOGRAPH-FA36;Lo;0;L;559D;;;;N;;;;; +FA37;CJK COMPATIBILITY IDEOGRAPH-FA37;Lo;0;L;5606;;;;N;;;;; +FA38;CJK COMPATIBILITY IDEOGRAPH-FA38;Lo;0;L;5668;;;;N;;;;; +FA39;CJK COMPATIBILITY IDEOGRAPH-FA39;Lo;0;L;5840;;;;N;;;;; +FA3A;CJK COMPATIBILITY IDEOGRAPH-FA3A;Lo;0;L;58A8;;;;N;;;;; +FA3B;CJK COMPATIBILITY IDEOGRAPH-FA3B;Lo;0;L;5C64;;;;N;;;;; +FA3C;CJK COMPATIBILITY IDEOGRAPH-FA3C;Lo;0;L;5C6E;;;;N;;;;; +FA3D;CJK COMPATIBILITY IDEOGRAPH-FA3D;Lo;0;L;6094;;;;N;;;;; +FA3E;CJK COMPATIBILITY IDEOGRAPH-FA3E;Lo;0;L;6168;;;;N;;;;; +FA3F;CJK COMPATIBILITY IDEOGRAPH-FA3F;Lo;0;L;618E;;;;N;;;;; +FA40;CJK COMPATIBILITY IDEOGRAPH-FA40;Lo;0;L;61F2;;;;N;;;;; +FA41;CJK COMPATIBILITY IDEOGRAPH-FA41;Lo;0;L;654F;;;;N;;;;; +FA42;CJK COMPATIBILITY IDEOGRAPH-FA42;Lo;0;L;65E2;;;;N;;;;; +FA43;CJK COMPATIBILITY IDEOGRAPH-FA43;Lo;0;L;6691;;;;N;;;;; +FA44;CJK COMPATIBILITY IDEOGRAPH-FA44;Lo;0;L;6885;;;;N;;;;; +FA45;CJK COMPATIBILITY IDEOGRAPH-FA45;Lo;0;L;6D77;;;;N;;;;; +FA46;CJK COMPATIBILITY IDEOGRAPH-FA46;Lo;0;L;6E1A;;;;N;;;;; +FA47;CJK COMPATIBILITY IDEOGRAPH-FA47;Lo;0;L;6F22;;;;N;;;;; +FA48;CJK COMPATIBILITY IDEOGRAPH-FA48;Lo;0;L;716E;;;;N;;;;; +FA49;CJK COMPATIBILITY IDEOGRAPH-FA49;Lo;0;L;722B;;;;N;;;;; +FA4A;CJK COMPATIBILITY IDEOGRAPH-FA4A;Lo;0;L;7422;;;;N;;;;; +FA4B;CJK COMPATIBILITY IDEOGRAPH-FA4B;Lo;0;L;7891;;;;N;;;;; +FA4C;CJK COMPATIBILITY IDEOGRAPH-FA4C;Lo;0;L;793E;;;;N;;;;; +FA4D;CJK COMPATIBILITY IDEOGRAPH-FA4D;Lo;0;L;7949;;;;N;;;;; +FA4E;CJK COMPATIBILITY IDEOGRAPH-FA4E;Lo;0;L;7948;;;;N;;;;; +FA4F;CJK COMPATIBILITY IDEOGRAPH-FA4F;Lo;0;L;7950;;;;N;;;;; +FA50;CJK COMPATIBILITY IDEOGRAPH-FA50;Lo;0;L;7956;;;;N;;;;; +FA51;CJK COMPATIBILITY IDEOGRAPH-FA51;Lo;0;L;795D;;;;N;;;;; +FA52;CJK COMPATIBILITY IDEOGRAPH-FA52;Lo;0;L;798D;;;;N;;;;; +FA53;CJK COMPATIBILITY IDEOGRAPH-FA53;Lo;0;L;798E;;;;N;;;;; +FA54;CJK COMPATIBILITY IDEOGRAPH-FA54;Lo;0;L;7A40;;;;N;;;;; +FA55;CJK COMPATIBILITY IDEOGRAPH-FA55;Lo;0;L;7A81;;;;N;;;;; +FA56;CJK COMPATIBILITY IDEOGRAPH-FA56;Lo;0;L;7BC0;;;;N;;;;; +FA57;CJK COMPATIBILITY IDEOGRAPH-FA57;Lo;0;L;7DF4;;;;N;;;;; +FA58;CJK COMPATIBILITY IDEOGRAPH-FA58;Lo;0;L;7E09;;;;N;;;;; +FA59;CJK COMPATIBILITY IDEOGRAPH-FA59;Lo;0;L;7E41;;;;N;;;;; +FA5A;CJK COMPATIBILITY IDEOGRAPH-FA5A;Lo;0;L;7F72;;;;N;;;;; +FA5B;CJK COMPATIBILITY IDEOGRAPH-FA5B;Lo;0;L;8005;;;;N;;;;; +FA5C;CJK COMPATIBILITY IDEOGRAPH-FA5C;Lo;0;L;81ED;;;;N;;;;; +FA5D;CJK COMPATIBILITY IDEOGRAPH-FA5D;Lo;0;L;8279;;;;N;;;;; +FA5E;CJK COMPATIBILITY IDEOGRAPH-FA5E;Lo;0;L;8279;;;;N;;;;; +FA5F;CJK COMPATIBILITY IDEOGRAPH-FA5F;Lo;0;L;8457;;;;N;;;;; +FA60;CJK COMPATIBILITY IDEOGRAPH-FA60;Lo;0;L;8910;;;;N;;;;; +FA61;CJK COMPATIBILITY IDEOGRAPH-FA61;Lo;0;L;8996;;;;N;;;;; +FA62;CJK COMPATIBILITY IDEOGRAPH-FA62;Lo;0;L;8B01;;;;N;;;;; +FA63;CJK COMPATIBILITY IDEOGRAPH-FA63;Lo;0;L;8B39;;;;N;;;;; +FA64;CJK COMPATIBILITY IDEOGRAPH-FA64;Lo;0;L;8CD3;;;;N;;;;; +FA65;CJK COMPATIBILITY IDEOGRAPH-FA65;Lo;0;L;8D08;;;;N;;;;; +FA66;CJK COMPATIBILITY IDEOGRAPH-FA66;Lo;0;L;8FB6;;;;N;;;;; +FA67;CJK COMPATIBILITY IDEOGRAPH-FA67;Lo;0;L;9038;;;;N;;;;; +FA68;CJK COMPATIBILITY IDEOGRAPH-FA68;Lo;0;L;96E3;;;;N;;;;; +FA69;CJK COMPATIBILITY IDEOGRAPH-FA69;Lo;0;L;97FF;;;;N;;;;; +FA6A;CJK COMPATIBILITY IDEOGRAPH-FA6A;Lo;0;L;983B;;;;N;;;;; +FB00;LATIN SMALL LIGATURE FF;Ll;0;L;<compat> 0066 0066;;;;N;;;;; +FB01;LATIN SMALL LIGATURE FI;Ll;0;L;<compat> 0066 0069;;;;N;;;;; +FB02;LATIN SMALL LIGATURE FL;Ll;0;L;<compat> 0066 006C;;;;N;;;;; +FB03;LATIN SMALL LIGATURE FFI;Ll;0;L;<compat> 0066 0066 0069;;;;N;;;;; +FB04;LATIN SMALL LIGATURE FFL;Ll;0;L;<compat> 0066 0066 006C;;;;N;;;;; +FB05;LATIN SMALL LIGATURE LONG S T;Ll;0;L;<compat> 017F 0074;;;;N;;;;; +FB06;LATIN SMALL LIGATURE ST;Ll;0;L;<compat> 0073 0074;;;;N;;;;; +FB13;ARMENIAN SMALL LIGATURE MEN NOW;Ll;0;L;<compat> 0574 0576;;;;N;;;;; +FB14;ARMENIAN SMALL LIGATURE MEN ECH;Ll;0;L;<compat> 0574 0565;;;;N;;;;; +FB15;ARMENIAN SMALL LIGATURE MEN INI;Ll;0;L;<compat> 0574 056B;;;;N;;;;; +FB16;ARMENIAN SMALL LIGATURE VEW NOW;Ll;0;L;<compat> 057E 0576;;;;N;;;;; +FB17;ARMENIAN SMALL LIGATURE MEN XEH;Ll;0;L;<compat> 0574 056D;;;;N;;;;; +FB1D;HEBREW LETTER YOD WITH HIRIQ;Lo;0;R;05D9 05B4;;;;N;;;;; +FB1E;HEBREW POINT JUDEO-SPANISH VARIKA;Mn;26;NSM;;;;;N;HEBREW POINT VARIKA;;;; +FB1F;HEBREW LIGATURE YIDDISH YOD YOD PATAH;Lo;0;R;05F2 05B7;;;;N;;;;; +FB20;HEBREW LETTER ALTERNATIVE AYIN;Lo;0;R;<font> 05E2;;;;N;;;;; +FB21;HEBREW LETTER WIDE ALEF;Lo;0;R;<font> 05D0;;;;N;;;;; +FB22;HEBREW LETTER WIDE DALET;Lo;0;R;<font> 05D3;;;;N;;;;; +FB23;HEBREW LETTER WIDE HE;Lo;0;R;<font> 05D4;;;;N;;;;; +FB24;HEBREW LETTER WIDE KAF;Lo;0;R;<font> 05DB;;;;N;;;;; +FB25;HEBREW LETTER WIDE LAMED;Lo;0;R;<font> 05DC;;;;N;;;;; +FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R;<font> 05DD;;;;N;;;;; +FB27;HEBREW LETTER WIDE RESH;Lo;0;R;<font> 05E8;;;;N;;;;; +FB28;HEBREW LETTER WIDE TAV;Lo;0;R;<font> 05EA;;;;N;;;;; +FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ET;<font> 002B;;;;N;;;;; +FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;; +FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;; +FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;; +FB2D;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT;Lo;0;R;FB49 05C2;;;;N;;;;; +FB2E;HEBREW LETTER ALEF WITH PATAH;Lo;0;R;05D0 05B7;;;;N;;;;; +FB2F;HEBREW LETTER ALEF WITH QAMATS;Lo;0;R;05D0 05B8;;;;N;;;;; +FB30;HEBREW LETTER ALEF WITH MAPIQ;Lo;0;R;05D0 05BC;;;;N;;;;; +FB31;HEBREW LETTER BET WITH DAGESH;Lo;0;R;05D1 05BC;;;;N;;;;; +FB32;HEBREW LETTER GIMEL WITH DAGESH;Lo;0;R;05D2 05BC;;;;N;;;;; +FB33;HEBREW LETTER DALET WITH DAGESH;Lo;0;R;05D3 05BC;;;;N;;;;; +FB34;HEBREW LETTER HE WITH MAPIQ;Lo;0;R;05D4 05BC;;;;N;;;;; +FB35;HEBREW LETTER VAV WITH DAGESH;Lo;0;R;05D5 05BC;;;;N;;;;; +FB36;HEBREW LETTER ZAYIN WITH DAGESH;Lo;0;R;05D6 05BC;;;;N;;;;; +FB38;HEBREW LETTER TET WITH DAGESH;Lo;0;R;05D8 05BC;;;;N;;;;; +FB39;HEBREW LETTER YOD WITH DAGESH;Lo;0;R;05D9 05BC;;;;N;;;;; +FB3A;HEBREW LETTER FINAL KAF WITH DAGESH;Lo;0;R;05DA 05BC;;;;N;;;;; +FB3B;HEBREW LETTER KAF WITH DAGESH;Lo;0;R;05DB 05BC;;;;N;;;;; +FB3C;HEBREW LETTER LAMED WITH DAGESH;Lo;0;R;05DC 05BC;;;;N;;;;; +FB3E;HEBREW LETTER MEM WITH DAGESH;Lo;0;R;05DE 05BC;;;;N;;;;; +FB40;HEBREW LETTER NUN WITH DAGESH;Lo;0;R;05E0 05BC;;;;N;;;;; +FB41;HEBREW LETTER SAMEKH WITH DAGESH;Lo;0;R;05E1 05BC;;;;N;;;;; +FB43;HEBREW LETTER FINAL PE WITH DAGESH;Lo;0;R;05E3 05BC;;;;N;;;;; +FB44;HEBREW LETTER PE WITH DAGESH;Lo;0;R;05E4 05BC;;;;N;;;;; +FB46;HEBREW LETTER TSADI WITH DAGESH;Lo;0;R;05E6 05BC;;;;N;;;;; +FB47;HEBREW LETTER QOF WITH DAGESH;Lo;0;R;05E7 05BC;;;;N;;;;; +FB48;HEBREW LETTER RESH WITH DAGESH;Lo;0;R;05E8 05BC;;;;N;;;;; +FB49;HEBREW LETTER SHIN WITH DAGESH;Lo;0;R;05E9 05BC;;;;N;;;;; +FB4A;HEBREW LETTER TAV WITH DAGESH;Lo;0;R;05EA 05BC;;;;N;;;;; +FB4B;HEBREW LETTER VAV WITH HOLAM;Lo;0;R;05D5 05B9;;;;N;;;;; +FB4C;HEBREW LETTER BET WITH RAFE;Lo;0;R;05D1 05BF;;;;N;;;;; +FB4D;HEBREW LETTER KAF WITH RAFE;Lo;0;R;05DB 05BF;;;;N;;;;; +FB4E;HEBREW LETTER PE WITH RAFE;Lo;0;R;05E4 05BF;;;;N;;;;; +FB4F;HEBREW LIGATURE ALEF LAMED;Lo;0;R;<compat> 05D0 05DC;;;;N;;;;; +FB50;ARABIC LETTER ALEF WASLA ISOLATED FORM;Lo;0;AL;<isolated> 0671;;;;N;;;;; +FB51;ARABIC LETTER ALEF WASLA FINAL FORM;Lo;0;AL;<final> 0671;;;;N;;;;; +FB52;ARABIC LETTER BEEH ISOLATED FORM;Lo;0;AL;<isolated> 067B;;;;N;;;;; +FB53;ARABIC LETTER BEEH FINAL FORM;Lo;0;AL;<final> 067B;;;;N;;;;; +FB54;ARABIC LETTER BEEH INITIAL FORM;Lo;0;AL;<initial> 067B;;;;N;;;;; +FB55;ARABIC LETTER BEEH MEDIAL FORM;Lo;0;AL;<medial> 067B;;;;N;;;;; +FB56;ARABIC LETTER PEH ISOLATED FORM;Lo;0;AL;<isolated> 067E;;;;N;;;;; +FB57;ARABIC LETTER PEH FINAL FORM;Lo;0;AL;<final> 067E;;;;N;;;;; +FB58;ARABIC LETTER PEH INITIAL FORM;Lo;0;AL;<initial> 067E;;;;N;;;;; +FB59;ARABIC LETTER PEH MEDIAL FORM;Lo;0;AL;<medial> 067E;;;;N;;;;; +FB5A;ARABIC LETTER BEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0680;;;;N;;;;; +FB5B;ARABIC LETTER BEHEH FINAL FORM;Lo;0;AL;<final> 0680;;;;N;;;;; +FB5C;ARABIC LETTER BEHEH INITIAL FORM;Lo;0;AL;<initial> 0680;;;;N;;;;; +FB5D;ARABIC LETTER BEHEH MEDIAL FORM;Lo;0;AL;<medial> 0680;;;;N;;;;; +FB5E;ARABIC LETTER TTEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067A;;;;N;;;;; +FB5F;ARABIC LETTER TTEHEH FINAL FORM;Lo;0;AL;<final> 067A;;;;N;;;;; +FB60;ARABIC LETTER TTEHEH INITIAL FORM;Lo;0;AL;<initial> 067A;;;;N;;;;; +FB61;ARABIC LETTER TTEHEH MEDIAL FORM;Lo;0;AL;<medial> 067A;;;;N;;;;; +FB62;ARABIC LETTER TEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067F;;;;N;;;;; +FB63;ARABIC LETTER TEHEH FINAL FORM;Lo;0;AL;<final> 067F;;;;N;;;;; +FB64;ARABIC LETTER TEHEH INITIAL FORM;Lo;0;AL;<initial> 067F;;;;N;;;;; +FB65;ARABIC LETTER TEHEH MEDIAL FORM;Lo;0;AL;<medial> 067F;;;;N;;;;; +FB66;ARABIC LETTER TTEH ISOLATED FORM;Lo;0;AL;<isolated> 0679;;;;N;;;;; +FB67;ARABIC LETTER TTEH FINAL FORM;Lo;0;AL;<final> 0679;;;;N;;;;; +FB68;ARABIC LETTER TTEH INITIAL FORM;Lo;0;AL;<initial> 0679;;;;N;;;;; +FB69;ARABIC LETTER TTEH MEDIAL FORM;Lo;0;AL;<medial> 0679;;;;N;;;;; +FB6A;ARABIC LETTER VEH ISOLATED FORM;Lo;0;AL;<isolated> 06A4;;;;N;;;;; +FB6B;ARABIC LETTER VEH FINAL FORM;Lo;0;AL;<final> 06A4;;;;N;;;;; +FB6C;ARABIC LETTER VEH INITIAL FORM;Lo;0;AL;<initial> 06A4;;;;N;;;;; +FB6D;ARABIC LETTER VEH MEDIAL FORM;Lo;0;AL;<medial> 06A4;;;;N;;;;; +FB6E;ARABIC LETTER PEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A6;;;;N;;;;; +FB6F;ARABIC LETTER PEHEH FINAL FORM;Lo;0;AL;<final> 06A6;;;;N;;;;; +FB70;ARABIC LETTER PEHEH INITIAL FORM;Lo;0;AL;<initial> 06A6;;;;N;;;;; +FB71;ARABIC LETTER PEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A6;;;;N;;;;; +FB72;ARABIC LETTER DYEH ISOLATED FORM;Lo;0;AL;<isolated> 0684;;;;N;;;;; +FB73;ARABIC LETTER DYEH FINAL FORM;Lo;0;AL;<final> 0684;;;;N;;;;; +FB74;ARABIC LETTER DYEH INITIAL FORM;Lo;0;AL;<initial> 0684;;;;N;;;;; +FB75;ARABIC LETTER DYEH MEDIAL FORM;Lo;0;AL;<medial> 0684;;;;N;;;;; +FB76;ARABIC LETTER NYEH ISOLATED FORM;Lo;0;AL;<isolated> 0683;;;;N;;;;; +FB77;ARABIC LETTER NYEH FINAL FORM;Lo;0;AL;<final> 0683;;;;N;;;;; +FB78;ARABIC LETTER NYEH INITIAL FORM;Lo;0;AL;<initial> 0683;;;;N;;;;; +FB79;ARABIC LETTER NYEH MEDIAL FORM;Lo;0;AL;<medial> 0683;;;;N;;;;; +FB7A;ARABIC LETTER TCHEH ISOLATED FORM;Lo;0;AL;<isolated> 0686;;;;N;;;;; +FB7B;ARABIC LETTER TCHEH FINAL FORM;Lo;0;AL;<final> 0686;;;;N;;;;; +FB7C;ARABIC LETTER TCHEH INITIAL FORM;Lo;0;AL;<initial> 0686;;;;N;;;;; +FB7D;ARABIC LETTER TCHEH MEDIAL FORM;Lo;0;AL;<medial> 0686;;;;N;;;;; +FB7E;ARABIC LETTER TCHEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0687;;;;N;;;;; +FB7F;ARABIC LETTER TCHEHEH FINAL FORM;Lo;0;AL;<final> 0687;;;;N;;;;; +FB80;ARABIC LETTER TCHEHEH INITIAL FORM;Lo;0;AL;<initial> 0687;;;;N;;;;; +FB81;ARABIC LETTER TCHEHEH MEDIAL FORM;Lo;0;AL;<medial> 0687;;;;N;;;;; +FB82;ARABIC LETTER DDAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068D;;;;N;;;;; +FB83;ARABIC LETTER DDAHAL FINAL FORM;Lo;0;AL;<final> 068D;;;;N;;;;; +FB84;ARABIC LETTER DAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068C;;;;N;;;;; +FB85;ARABIC LETTER DAHAL FINAL FORM;Lo;0;AL;<final> 068C;;;;N;;;;; +FB86;ARABIC LETTER DUL ISOLATED FORM;Lo;0;AL;<isolated> 068E;;;;N;;;;; +FB87;ARABIC LETTER DUL FINAL FORM;Lo;0;AL;<final> 068E;;;;N;;;;; +FB88;ARABIC LETTER DDAL ISOLATED FORM;Lo;0;AL;<isolated> 0688;;;;N;;;;; +FB89;ARABIC LETTER DDAL FINAL FORM;Lo;0;AL;<final> 0688;;;;N;;;;; +FB8A;ARABIC LETTER JEH ISOLATED FORM;Lo;0;AL;<isolated> 0698;;;;N;;;;; +FB8B;ARABIC LETTER JEH FINAL FORM;Lo;0;AL;<final> 0698;;;;N;;;;; +FB8C;ARABIC LETTER RREH ISOLATED FORM;Lo;0;AL;<isolated> 0691;;;;N;;;;; +FB8D;ARABIC LETTER RREH FINAL FORM;Lo;0;AL;<final> 0691;;;;N;;;;; +FB8E;ARABIC LETTER KEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A9;;;;N;;;;; +FB8F;ARABIC LETTER KEHEH FINAL FORM;Lo;0;AL;<final> 06A9;;;;N;;;;; +FB90;ARABIC LETTER KEHEH INITIAL FORM;Lo;0;AL;<initial> 06A9;;;;N;;;;; +FB91;ARABIC LETTER KEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A9;;;;N;;;;; +FB92;ARABIC LETTER GAF ISOLATED FORM;Lo;0;AL;<isolated> 06AF;;;;N;;;;; +FB93;ARABIC LETTER GAF FINAL FORM;Lo;0;AL;<final> 06AF;;;;N;;;;; +FB94;ARABIC LETTER GAF INITIAL FORM;Lo;0;AL;<initial> 06AF;;;;N;;;;; +FB95;ARABIC LETTER GAF MEDIAL FORM;Lo;0;AL;<medial> 06AF;;;;N;;;;; +FB96;ARABIC LETTER GUEH ISOLATED FORM;Lo;0;AL;<isolated> 06B3;;;;N;;;;; +FB97;ARABIC LETTER GUEH FINAL FORM;Lo;0;AL;<final> 06B3;;;;N;;;;; +FB98;ARABIC LETTER GUEH INITIAL FORM;Lo;0;AL;<initial> 06B3;;;;N;;;;; +FB99;ARABIC LETTER GUEH MEDIAL FORM;Lo;0;AL;<medial> 06B3;;;;N;;;;; +FB9A;ARABIC LETTER NGOEH ISOLATED FORM;Lo;0;AL;<isolated> 06B1;;;;N;;;;; +FB9B;ARABIC LETTER NGOEH FINAL FORM;Lo;0;AL;<final> 06B1;;;;N;;;;; +FB9C;ARABIC LETTER NGOEH INITIAL FORM;Lo;0;AL;<initial> 06B1;;;;N;;;;; +FB9D;ARABIC LETTER NGOEH MEDIAL FORM;Lo;0;AL;<medial> 06B1;;;;N;;;;; +FB9E;ARABIC LETTER NOON GHUNNA ISOLATED FORM;Lo;0;AL;<isolated> 06BA;;;;N;;;;; +FB9F;ARABIC LETTER NOON GHUNNA FINAL FORM;Lo;0;AL;<final> 06BA;;;;N;;;;; +FBA0;ARABIC LETTER RNOON ISOLATED FORM;Lo;0;AL;<isolated> 06BB;;;;N;;;;; +FBA1;ARABIC LETTER RNOON FINAL FORM;Lo;0;AL;<final> 06BB;;;;N;;;;; +FBA2;ARABIC LETTER RNOON INITIAL FORM;Lo;0;AL;<initial> 06BB;;;;N;;;;; +FBA3;ARABIC LETTER RNOON MEDIAL FORM;Lo;0;AL;<medial> 06BB;;;;N;;;;; +FBA4;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06C0;;;;N;;;;; +FBA5;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM;Lo;0;AL;<final> 06C0;;;;N;;;;; +FBA6;ARABIC LETTER HEH GOAL ISOLATED FORM;Lo;0;AL;<isolated> 06C1;;;;N;;;;; +FBA7;ARABIC LETTER HEH GOAL FINAL FORM;Lo;0;AL;<final> 06C1;;;;N;;;;; +FBA8;ARABIC LETTER HEH GOAL INITIAL FORM;Lo;0;AL;<initial> 06C1;;;;N;;;;; +FBA9;ARABIC LETTER HEH GOAL MEDIAL FORM;Lo;0;AL;<medial> 06C1;;;;N;;;;; +FBAA;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM;Lo;0;AL;<isolated> 06BE;;;;N;;;;; +FBAB;ARABIC LETTER HEH DOACHASHMEE FINAL FORM;Lo;0;AL;<final> 06BE;;;;N;;;;; +FBAC;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM;Lo;0;AL;<initial> 06BE;;;;N;;;;; +FBAD;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM;Lo;0;AL;<medial> 06BE;;;;N;;;;; +FBAE;ARABIC LETTER YEH BARREE ISOLATED FORM;Lo;0;AL;<isolated> 06D2;;;;N;;;;; +FBAF;ARABIC LETTER YEH BARREE FINAL FORM;Lo;0;AL;<final> 06D2;;;;N;;;;; +FBB0;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06D3;;;;N;;;;; +FBB1;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 06D3;;;;N;;;;; +FBD3;ARABIC LETTER NG ISOLATED FORM;Lo;0;AL;<isolated> 06AD;;;;N;;;;; +FBD4;ARABIC LETTER NG FINAL FORM;Lo;0;AL;<final> 06AD;;;;N;;;;; +FBD5;ARABIC LETTER NG INITIAL FORM;Lo;0;AL;<initial> 06AD;;;;N;;;;; +FBD6;ARABIC LETTER NG MEDIAL FORM;Lo;0;AL;<medial> 06AD;;;;N;;;;; +FBD7;ARABIC LETTER U ISOLATED FORM;Lo;0;AL;<isolated> 06C7;;;;N;;;;; +FBD8;ARABIC LETTER U FINAL FORM;Lo;0;AL;<final> 06C7;;;;N;;;;; +FBD9;ARABIC LETTER OE ISOLATED FORM;Lo;0;AL;<isolated> 06C6;;;;N;;;;; +FBDA;ARABIC LETTER OE FINAL FORM;Lo;0;AL;<final> 06C6;;;;N;;;;; +FBDB;ARABIC LETTER YU ISOLATED FORM;Lo;0;AL;<isolated> 06C8;;;;N;;;;; +FBDC;ARABIC LETTER YU FINAL FORM;Lo;0;AL;<final> 06C8;;;;N;;;;; +FBDD;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0677;;;;N;;;;; +FBDE;ARABIC LETTER VE ISOLATED FORM;Lo;0;AL;<isolated> 06CB;;;;N;;;;; +FBDF;ARABIC LETTER VE FINAL FORM;Lo;0;AL;<final> 06CB;;;;N;;;;; +FBE0;ARABIC LETTER KIRGHIZ OE ISOLATED FORM;Lo;0;AL;<isolated> 06C5;;;;N;;;;; +FBE1;ARABIC LETTER KIRGHIZ OE FINAL FORM;Lo;0;AL;<final> 06C5;;;;N;;;;; +FBE2;ARABIC LETTER KIRGHIZ YU ISOLATED FORM;Lo;0;AL;<isolated> 06C9;;;;N;;;;; +FBE3;ARABIC LETTER KIRGHIZ YU FINAL FORM;Lo;0;AL;<final> 06C9;;;;N;;;;; +FBE4;ARABIC LETTER E ISOLATED FORM;Lo;0;AL;<isolated> 06D0;;;;N;;;;; +FBE5;ARABIC LETTER E FINAL FORM;Lo;0;AL;<final> 06D0;;;;N;;;;; +FBE6;ARABIC LETTER E INITIAL FORM;Lo;0;AL;<initial> 06D0;;;;N;;;;; +FBE7;ARABIC LETTER E MEDIAL FORM;Lo;0;AL;<medial> 06D0;;;;N;;;;; +FBE8;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0649;;;;N;;;;; +FBE9;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM;Lo;0;AL;<medial> 0649;;;;N;;;;; +FBEA;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0626 0627;;;;N;;;;; +FBEB;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM;Lo;0;AL;<final> 0626 0627;;;;N;;;;; +FBEC;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D5;;;;N;;;;; +FBED;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM;Lo;0;AL;<final> 0626 06D5;;;;N;;;;; +FBEE;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM;Lo;0;AL;<isolated> 0626 0648;;;;N;;;;; +FBEF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM;Lo;0;AL;<final> 0626 0648;;;;N;;;;; +FBF0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C7;;;;N;;;;; +FBF1;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM;Lo;0;AL;<final> 0626 06C7;;;;N;;;;; +FBF2;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C6;;;;N;;;;; +FBF3;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM;Lo;0;AL;<final> 0626 06C6;;;;N;;;;; +FBF4;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C8;;;;N;;;;; +FBF5;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM;Lo;0;AL;<final> 0626 06C8;;;;N;;;;; +FBF6;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D0;;;;N;;;;; +FBF7;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM;Lo;0;AL;<final> 0626 06D0;;;;N;;;;; +FBF8;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM;Lo;0;AL;<initial> 0626 06D0;;;;N;;;;; +FBF9;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;; +FBFA;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;; +FBFB;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0626 0649;;;;N;;;;; +FBFC;ARABIC LETTER FARSI YEH ISOLATED FORM;Lo;0;AL;<isolated> 06CC;;;;N;;;;; +FBFD;ARABIC LETTER FARSI YEH FINAL FORM;Lo;0;AL;<final> 06CC;;;;N;;;;; +FBFE;ARABIC LETTER FARSI YEH INITIAL FORM;Lo;0;AL;<initial> 06CC;;;;N;;;;; +FBFF;ARABIC LETTER FARSI YEH MEDIAL FORM;Lo;0;AL;<medial> 06CC;;;;N;;;;; +FC00;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 062C;;;;N;;;;; +FC01;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0626 062D;;;;N;;;;; +FC02;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 0645;;;;N;;;;; +FC03;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;; +FC04;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0626 064A;;;;N;;;;; +FC05;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 062C;;;;N;;;;; +FC06;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062D;;;;N;;;;; +FC07;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062E;;;;N;;;;; +FC08;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 0645;;;;N;;;;; +FC09;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0628 0649;;;;N;;;;; +FC0A;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0628 064A;;;;N;;;;; +FC0B;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 062C;;;;N;;;;; +FC0C;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062D;;;;N;;;;; +FC0D;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062E;;;;N;;;;; +FC0E;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 0645;;;;N;;;;; +FC0F;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062A 0649;;;;N;;;;; +FC10;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062A 064A;;;;N;;;;; +FC11;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 062C;;;;N;;;;; +FC12;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 0645;;;;N;;;;; +FC13;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062B 0649;;;;N;;;;; +FC14;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062B 064A;;;;N;;;;; +FC15;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062C 062D;;;;N;;;;; +FC16;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C 0645;;;;N;;;;; +FC17;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 062C;;;;N;;;;; +FC18;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 0645;;;;N;;;;; +FC19;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 062C;;;;N;;;;; +FC1A;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062E 062D;;;;N;;;;; +FC1B;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 0645;;;;N;;;;; +FC1C;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 062C;;;;N;;;;; +FC1D;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062D;;;;N;;;;; +FC1E;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062E;;;;N;;;;; +FC1F;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 0645;;;;N;;;;; +FC20;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0635 062D;;;;N;;;;; +FC21;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0645;;;;N;;;;; +FC22;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 062C;;;;N;;;;; +FC23;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062D;;;;N;;;;; +FC24;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062E;;;;N;;;;; +FC25;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 0645;;;;N;;;;; +FC26;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0637 062D;;;;N;;;;; +FC27;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0637 0645;;;;N;;;;; +FC28;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0638 0645;;;;N;;;;; +FC29;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 062C;;;;N;;;;; +FC2A;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 0645;;;;N;;;;; +FC2B;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 062C;;;;N;;;;; +FC2C;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 0645;;;;N;;;;; +FC2D;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 062C;;;;N;;;;; +FC2E;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062D;;;;N;;;;; +FC2F;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062E;;;;N;;;;; +FC30;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 0645;;;;N;;;;; +FC31;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0641 0649;;;;N;;;;; +FC32;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0641 064A;;;;N;;;;; +FC33;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0642 062D;;;;N;;;;; +FC34;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0642 0645;;;;N;;;;; +FC35;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0642 0649;;;;N;;;;; +FC36;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0642 064A;;;;N;;;;; +FC37;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0643 0627;;;;N;;;;; +FC38;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 062C;;;;N;;;;; +FC39;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062D;;;;N;;;;; +FC3A;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062E;;;;N;;;;; +FC3B;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0644;;;;N;;;;; +FC3C;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0645;;;;N;;;;; +FC3D;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0643 0649;;;;N;;;;; +FC3E;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0643 064A;;;;N;;;;; +FC3F;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 062C;;;;N;;;;; +FC40;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062D;;;;N;;;;; +FC41;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062E;;;;N;;;;; +FC42;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 0645;;;;N;;;;; +FC43;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0644 0649;;;;N;;;;; +FC44;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0644 064A;;;;N;;;;; +FC45;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 062C;;;;N;;;;; +FC46;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D;;;;N;;;;; +FC47;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062E;;;;N;;;;; +FC48;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 0645;;;;N;;;;; +FC49;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0645 0649;;;;N;;;;; +FC4A;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0645 064A;;;;N;;;;; +FC4B;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 062C;;;;N;;;;; +FC4C;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062D;;;;N;;;;; +FC4D;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062E;;;;N;;;;; +FC4E;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 0645;;;;N;;;;; +FC4F;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0646 0649;;;;N;;;;; +FC50;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0646 064A;;;;N;;;;; +FC51;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 062C;;;;N;;;;; +FC52;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 0645;;;;N;;;;; +FC53;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0647 0649;;;;N;;;;; +FC54;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0647 064A;;;;N;;;;; +FC55;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 062C;;;;N;;;;; +FC56;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062D;;;;N;;;;; +FC57;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062E;;;;N;;;;; +FC58;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 0645;;;;N;;;;; +FC59;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 064A 0649;;;;N;;;;; +FC5A;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A 064A;;;;N;;;;; +FC5B;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0630 0670;;;;N;;;;; +FC5C;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0631 0670;;;;N;;;;; +FC5D;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0649 0670;;;;N;;;;; +FC5E;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C 0651;;;;N;;;;; +FC5F;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D 0651;;;;N;;;;; +FC60;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E 0651;;;;N;;;;; +FC61;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F 0651;;;;N;;;;; +FC62;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650 0651;;;;N;;;;; +FC63;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651 0670;;;;N;;;;; +FC64;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM;Lo;0;AL;<final> 0626 0631;;;;N;;;;; +FC65;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0626 0632;;;;N;;;;; +FC66;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM;Lo;0;AL;<final> 0626 0645;;;;N;;;;; +FC67;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM;Lo;0;AL;<final> 0626 0646;;;;N;;;;; +FC68;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;; +FC69;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM;Lo;0;AL;<final> 0626 064A;;;;N;;;;; +FC6A;ARABIC LIGATURE BEH WITH REH FINAL FORM;Lo;0;AL;<final> 0628 0631;;;;N;;;;; +FC6B;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0628 0632;;;;N;;;;; +FC6C;ARABIC LIGATURE BEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0628 0645;;;;N;;;;; +FC6D;ARABIC LIGATURE BEH WITH NOON FINAL FORM;Lo;0;AL;<final> 0628 0646;;;;N;;;;; +FC6E;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0628 0649;;;;N;;;;; +FC6F;ARABIC LIGATURE BEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 064A;;;;N;;;;; +FC70;ARABIC LIGATURE TEH WITH REH FINAL FORM;Lo;0;AL;<final> 062A 0631;;;;N;;;;; +FC71;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062A 0632;;;;N;;;;; +FC72;ARABIC LIGATURE TEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062A 0645;;;;N;;;;; +FC73;ARABIC LIGATURE TEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062A 0646;;;;N;;;;; +FC74;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0649;;;;N;;;;; +FC75;ARABIC LIGATURE TEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 064A;;;;N;;;;; +FC76;ARABIC LIGATURE THEH WITH REH FINAL FORM;Lo;0;AL;<final> 062B 0631;;;;N;;;;; +FC77;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062B 0632;;;;N;;;;; +FC78;ARABIC LIGATURE THEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062B 0645;;;;N;;;;; +FC79;ARABIC LIGATURE THEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062B 0646;;;;N;;;;; +FC7A;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062B 0649;;;;N;;;;; +FC7B;ARABIC LIGATURE THEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062B 064A;;;;N;;;;; +FC7C;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0641 0649;;;;N;;;;; +FC7D;ARABIC LIGATURE FEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 064A;;;;N;;;;; +FC7E;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0642 0649;;;;N;;;;; +FC7F;ARABIC LIGATURE QAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 064A;;;;N;;;;; +FC80;ARABIC LIGATURE KAF WITH ALEF FINAL FORM;Lo;0;AL;<final> 0643 0627;;;;N;;;;; +FC81;ARABIC LIGATURE KAF WITH LAM FINAL FORM;Lo;0;AL;<final> 0643 0644;;;;N;;;;; +FC82;ARABIC LIGATURE KAF WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645;;;;N;;;;; +FC83;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0643 0649;;;;N;;;;; +FC84;ARABIC LIGATURE KAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 064A;;;;N;;;;; +FC85;ARABIC LIGATURE LAM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 0645;;;;N;;;;; +FC86;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 0649;;;;N;;;;; +FC87;ARABIC LIGATURE LAM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 064A;;;;N;;;;; +FC88;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0645 0627;;;;N;;;;; +FC89;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0645 0645;;;;N;;;;; +FC8A;ARABIC LIGATURE NOON WITH REH FINAL FORM;Lo;0;AL;<final> 0646 0631;;;;N;;;;; +FC8B;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0646 0632;;;;N;;;;; +FC8C;ARABIC LIGATURE NOON WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 0645;;;;N;;;;; +FC8D;ARABIC LIGATURE NOON WITH NOON FINAL FORM;Lo;0;AL;<final> 0646 0646;;;;N;;;;; +FC8E;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0649;;;;N;;;;; +FC8F;ARABIC LIGATURE NOON WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 064A;;;;N;;;;; +FC90;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM;Lo;0;AL;<final> 0649 0670;;;;N;;;;; +FC91;ARABIC LIGATURE YEH WITH REH FINAL FORM;Lo;0;AL;<final> 064A 0631;;;;N;;;;; +FC92;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 064A 0632;;;;N;;;;; +FC93;ARABIC LIGATURE YEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645;;;;N;;;;; +FC94;ARABIC LIGATURE YEH WITH NOON FINAL FORM;Lo;0;AL;<final> 064A 0646;;;;N;;;;; +FC95;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 064A 0649;;;;N;;;;; +FC96;ARABIC LIGATURE YEH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 064A;;;;N;;;;; +FC97;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0626 062C;;;;N;;;;; +FC98;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0626 062D;;;;N;;;;; +FC99;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0626 062E;;;;N;;;;; +FC9A;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0626 0645;;;;N;;;;; +FC9B;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0626 0647;;;;N;;;;; +FC9C;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0628 062C;;;;N;;;;; +FC9D;ARABIC LIGATURE BEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0628 062D;;;;N;;;;; +FC9E;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0628 062E;;;;N;;;;; +FC9F;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0628 0645;;;;N;;;;; +FCA0;ARABIC LIGATURE BEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0628 0647;;;;N;;;;; +FCA1;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C;;;;N;;;;; +FCA2;ARABIC LIGATURE TEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 062D;;;;N;;;;; +FCA3;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 062E;;;;N;;;;; +FCA4;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645;;;;N;;;;; +FCA5;ARABIC LIGATURE TEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 062A 0647;;;;N;;;;; +FCA6;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062B 0645;;;;N;;;;; +FCA7;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 062D;;;;N;;;;; +FCA8;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062C 0645;;;;N;;;;; +FCA9;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062D 062C;;;;N;;;;; +FCAA;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062D 0645;;;;N;;;;; +FCAB;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062E 062C;;;;N;;;;; +FCAC;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062E 0645;;;;N;;;;; +FCAD;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062C;;;;N;;;;; +FCAE;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062D;;;;N;;;;; +FCAF;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0633 062E;;;;N;;;;; +FCB0;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645;;;;N;;;;; +FCB1;ARABIC LIGATURE SAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D;;;;N;;;;; +FCB2;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0635 062E;;;;N;;;;; +FCB3;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645;;;;N;;;;; +FCB4;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062C;;;;N;;;;; +FCB5;ARABIC LIGATURE DAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0636 062D;;;;N;;;;; +FCB6;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0636 062E;;;;N;;;;; +FCB7;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 0645;;;;N;;;;; +FCB8;ARABIC LIGATURE TAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 062D;;;;N;;;;; +FCB9;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0638 0645;;;;N;;;;; +FCBA;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C;;;;N;;;;; +FCBB;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645;;;;N;;;;; +FCBC;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 063A 062C;;;;N;;;;; +FCBD;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 063A 0645;;;;N;;;;; +FCBE;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062C;;;;N;;;;; +FCBF;ARABIC LIGATURE FEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0641 062D;;;;N;;;;; +FCC0;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0641 062E;;;;N;;;;; +FCC1;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 0645;;;;N;;;;; +FCC2;ARABIC LIGATURE QAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 062D;;;;N;;;;; +FCC3;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0642 0645;;;;N;;;;; +FCC4;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0643 062C;;;;N;;;;; +FCC5;ARABIC LIGATURE KAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0643 062D;;;;N;;;;; +FCC6;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0643 062E;;;;N;;;;; +FCC7;ARABIC LIGATURE KAF WITH LAM INITIAL FORM;Lo;0;AL;<initial> 0643 0644;;;;N;;;;; +FCC8;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645;;;;N;;;;; +FCC9;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C;;;;N;;;;; +FCCA;ARABIC LIGATURE LAM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 062D;;;;N;;;;; +FCCB;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0644 062E;;;;N;;;;; +FCCC;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 0645;;;;N;;;;; +FCCD;ARABIC LIGATURE LAM WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0644 0647;;;;N;;;;; +FCCE;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C;;;;N;;;;; +FCCF;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062D;;;;N;;;;; +FCD0;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062E;;;;N;;;;; +FCD1;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 0645;;;;N;;;;; +FCD2;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C;;;;N;;;;; +FCD3;ARABIC LIGATURE NOON WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062D;;;;N;;;;; +FCD4;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0646 062E;;;;N;;;;; +FCD5;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 0645;;;;N;;;;; +FCD6;ARABIC LIGATURE NOON WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0646 0647;;;;N;;;;; +FCD7;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 062C;;;;N;;;;; +FCD8;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645;;;;N;;;;; +FCD9;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM;Lo;0;AL;<initial> 0647 0670;;;;N;;;;; +FCDA;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 064A 062C;;;;N;;;;; +FCDB;ARABIC LIGATURE YEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 064A 062D;;;;N;;;;; +FCDC;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 064A 062E;;;;N;;;;; +FCDD;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645;;;;N;;;;; +FCDE;ARABIC LIGATURE YEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 064A 0647;;;;N;;;;; +FCDF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0626 0645;;;;N;;;;; +FCE0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0626 0647;;;;N;;;;; +FCE1;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0628 0645;;;;N;;;;; +FCE2;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0628 0647;;;;N;;;;; +FCE3;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062A 0645;;;;N;;;;; +FCE4;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062A 0647;;;;N;;;;; +FCE5;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062B 0645;;;;N;;;;; +FCE6;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062B 0647;;;;N;;;;; +FCE7;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 0645;;;;N;;;;; +FCE8;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0633 0647;;;;N;;;;; +FCE9;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 0645;;;;N;;;;; +FCEA;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0634 0647;;;;N;;;;; +FCEB;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM;Lo;0;AL;<medial> 0643 0644;;;;N;;;;; +FCEC;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0643 0645;;;;N;;;;; +FCED;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0644 0645;;;;N;;;;; +FCEE;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0646 0645;;;;N;;;;; +FCEF;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0646 0647;;;;N;;;;; +FCF0;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 064A 0645;;;;N;;;;; +FCF1;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 064A 0647;;;;N;;;;; +FCF2;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E 0651;;;;N;;;;; +FCF3;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F 0651;;;;N;;;;; +FCF4;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650 0651;;;;N;;;;; +FCF5;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0637 0649;;;;N;;;;; +FCF6;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0637 064A;;;;N;;;;; +FCF7;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0639 0649;;;;N;;;;; +FCF8;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0639 064A;;;;N;;;;; +FCF9;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 063A 0649;;;;N;;;;; +FCFA;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 063A 064A;;;;N;;;;; +FCFB;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0633 0649;;;;N;;;;; +FCFC;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0633 064A;;;;N;;;;; +FCFD;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0634 0649;;;;N;;;;; +FCFE;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0634 064A;;;;N;;;;; +FCFF;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062D 0649;;;;N;;;;; +FD00;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062D 064A;;;;N;;;;; +FD01;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062C 0649;;;;N;;;;; +FD02;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062C 064A;;;;N;;;;; +FD03;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062E 0649;;;;N;;;;; +FD04;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062E 064A;;;;N;;;;; +FD05;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0649;;;;N;;;;; +FD06;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0635 064A;;;;N;;;;; +FD07;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0636 0649;;;;N;;;;; +FD08;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0636 064A;;;;N;;;;; +FD09;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 062C;;;;N;;;;; +FD0A;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062D;;;;N;;;;; +FD0B;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062E;;;;N;;;;; +FD0C;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 0645;;;;N;;;;; +FD0D;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0634 0631;;;;N;;;;; +FD0E;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0633 0631;;;;N;;;;; +FD0F;ARABIC LIGATURE SAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0635 0631;;;;N;;;;; +FD10;ARABIC LIGATURE DAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0636 0631;;;;N;;;;; +FD11;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0637 0649;;;;N;;;;; +FD12;ARABIC LIGATURE TAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 064A;;;;N;;;;; +FD13;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0649;;;;N;;;;; +FD14;ARABIC LIGATURE AIN WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 064A;;;;N;;;;; +FD15;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0649;;;;N;;;;; +FD16;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 064A;;;;N;;;;; +FD17;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 0649;;;;N;;;;; +FD18;ARABIC LIGATURE SEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 064A;;;;N;;;;; +FD19;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0634 0649;;;;N;;;;; +FD1A;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 064A;;;;N;;;;; +FD1B;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0649;;;;N;;;;; +FD1C;ARABIC LIGATURE HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 064A;;;;N;;;;; +FD1D;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0649;;;;N;;;;; +FD1E;ARABIC LIGATURE JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 064A;;;;N;;;;; +FD1F;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062E 0649;;;;N;;;;; +FD20;ARABIC LIGATURE KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062E 064A;;;;N;;;;; +FD21;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0635 0649;;;;N;;;;; +FD22;ARABIC LIGATURE SAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 064A;;;;N;;;;; +FD23;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 0649;;;;N;;;;; +FD24;ARABIC LIGATURE DAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 064A;;;;N;;;;; +FD25;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM;Lo;0;AL;<final> 0634 062C;;;;N;;;;; +FD26;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM;Lo;0;AL;<final> 0634 062D;;;;N;;;;; +FD27;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 062E;;;;N;;;;; +FD28;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645;;;;N;;;;; +FD29;ARABIC LIGATURE SHEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0634 0631;;;;N;;;;; +FD2A;ARABIC LIGATURE SEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0633 0631;;;;N;;;;; +FD2B;ARABIC LIGATURE SAD WITH REH FINAL FORM;Lo;0;AL;<final> 0635 0631;;;;N;;;;; +FD2C;ARABIC LIGATURE DAD WITH REH FINAL FORM;Lo;0;AL;<final> 0636 0631;;;;N;;;;; +FD2D;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062C;;;;N;;;;; +FD2E;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0634 062D;;;;N;;;;; +FD2F;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 062E;;;;N;;;;; +FD30;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645;;;;N;;;;; +FD31;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0633 0647;;;;N;;;;; +FD32;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0634 0647;;;;N;;;;; +FD33;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645;;;;N;;;;; +FD34;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 062C;;;;N;;;;; +FD35;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062D;;;;N;;;;; +FD36;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062E;;;;N;;;;; +FD37;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 062C;;;;N;;;;; +FD38;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062D;;;;N;;;;; +FD39;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062E;;;;N;;;;; +FD3A;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0637 0645;;;;N;;;;; +FD3B;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0638 0645;;;;N;;;;; +FD3C;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM;Lo;0;AL;<final> 0627 064B;;;;N;;;;; +FD3D;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0627 064B;;;;N;;;;; +FD3E;ORNATE LEFT PARENTHESIS;Ps;0;ON;;;;;N;;;;; +FD3F;ORNATE RIGHT PARENTHESIS;Pe;0;ON;;;;;N;;;;; +FD50;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C 0645;;;;N;;;;; +FD51;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM;Lo;0;AL;<final> 062A 062D 062C;;;;N;;;;; +FD52;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 062C;;;;N;;;;; +FD53;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 0645;;;;N;;;;; +FD54;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062E 0645;;;;N;;;;; +FD55;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062C;;;;N;;;;; +FD56;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062D;;;;N;;;;; +FD57;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062E;;;;N;;;;; +FD58;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 062C 0645 062D;;;;N;;;;; +FD59;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 0645 062D;;;;N;;;;; +FD5A;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 0645 064A;;;;N;;;;; +FD5B;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0645 0649;;;;N;;;;; +FD5C;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062D 062C;;;;N;;;;; +FD5D;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062C 062D;;;;N;;;;; +FD5E;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062C 0649;;;;N;;;;; +FD5F;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0633 0645 062D;;;;N;;;;; +FD60;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062D;;;;N;;;;; +FD61;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062C;;;;N;;;;; +FD62;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0633 0645 0645;;;;N;;;;; +FD63;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 0645;;;;N;;;;; +FD64;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM;Lo;0;AL;<final> 0635 062D 062D;;;;N;;;;; +FD65;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D 062D;;;;N;;;;; +FD66;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0635 0645 0645;;;;N;;;;; +FD67;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 062D 0645;;;;N;;;;; +FD68;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062D 0645;;;;N;;;;; +FD69;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062C 064A;;;;N;;;;; +FD6A;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 0645 062E;;;;N;;;;; +FD6B;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 0645 062E;;;;N;;;;; +FD6C;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645 0645;;;;N;;;;; +FD6D;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645 0645;;;;N;;;;; +FD6E;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 062D 0649;;;;N;;;;; +FD6F;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0636 062E 0645;;;;N;;;;; +FD70;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062E 0645;;;;N;;;;; +FD71;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0637 0645 062D;;;;N;;;;; +FD72;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 0645 062D;;;;N;;;;; +FD73;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645 0645;;;;N;;;;; +FD74;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 0645 064A;;;;N;;;;; +FD75;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 062C 0645;;;;N;;;;; +FD76;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 0645 0645;;;;N;;;;; +FD77;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645 0645;;;;N;;;;; +FD78;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0645 0649;;;;N;;;;; +FD79;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 063A 0645 0645;;;;N;;;;; +FD7A;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 0645 064A;;;;N;;;;; +FD7B;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0645 0649;;;;N;;;;; +FD7C;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0641 062E 0645;;;;N;;;;; +FD7D;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062E 0645;;;;N;;;;; +FD7E;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0642 0645 062D;;;;N;;;;; +FD7F;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0642 0645 0645;;;;N;;;;; +FD80;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062D 0645;;;;N;;;;; +FD81;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062D 064A;;;;N;;;;; +FD82;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 062D 0649;;;;N;;;;; +FD83;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 062C;;;;N;;;;; +FD84;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 062C;;;;N;;;;; +FD85;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062E 0645;;;;N;;;;; +FD86;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062E 0645;;;;N;;;;; +FD87;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0644 0645 062D;;;;N;;;;; +FD88;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 0645 062D;;;;N;;;;; +FD89;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 062C;;;;N;;;;; +FD8A;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 0645;;;;N;;;;; +FD8B;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062D 064A;;;;N;;;;; +FD8C;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062D;;;;N;;;;; +FD8D;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C 0645;;;;N;;;;; +FD8E;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 062C;;;;N;;;;; +FD8F;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 0645;;;;N;;;;; +FD92;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062E;;;;N;;;;; +FD93;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 062C;;;;N;;;;; +FD94;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 0645;;;;N;;;;; +FD95;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062D 0645;;;;N;;;;; +FD96;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062D 0649;;;;N;;;;; +FD97;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 062C 0645;;;;N;;;;; +FD98;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C 0645;;;;N;;;;; +FD99;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062C 0649;;;;N;;;;; +FD9A;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 0645 064A;;;;N;;;;; +FD9B;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0645 0649;;;;N;;;;; +FD9C;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645 0645;;;;N;;;;; +FD9D;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645 0645;;;;N;;;;; +FD9E;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062E 064A;;;;N;;;;; +FD9F;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062C 064A;;;;N;;;;; +FDA0;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062C 0649;;;;N;;;;; +FDA1;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062E 064A;;;;N;;;;; +FDA2;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062E 0649;;;;N;;;;; +FDA3;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 0645 064A;;;;N;;;;; +FDA4;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0645 0649;;;;N;;;;; +FDA5;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 0645 064A;;;;N;;;;; +FDA6;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 062D 0649;;;;N;;;;; +FDA7;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0645 0649;;;;N;;;;; +FDA8;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062E 0649;;;;N;;;;; +FDA9;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 062D 064A;;;;N;;;;; +FDAA;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062D 064A;;;;N;;;;; +FDAB;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 062D 064A;;;;N;;;;; +FDAC;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062C 064A;;;;N;;;;; +FDAD;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 0645 064A;;;;N;;;;; +FDAE;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062D 064A;;;;N;;;;; +FDAF;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062C 064A;;;;N;;;;; +FDB0;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 0645 064A;;;;N;;;;; +FDB1;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 0645 064A;;;;N;;;;; +FDB2;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 0645 064A;;;;N;;;;; +FDB3;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062D 064A;;;;N;;;;; +FDB4;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 0645 062D;;;;N;;;;; +FDB5;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062D 0645;;;;N;;;;; +FDB6;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 0645 064A;;;;N;;;;; +FDB7;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 0645 064A;;;;N;;;;; +FDB8;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062C 062D;;;;N;;;;; +FDB9;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062E 064A;;;;N;;;;; +FDBA;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 0645;;;;N;;;;; +FDBB;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645 0645;;;;N;;;;; +FDBC;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 0645;;;;N;;;;; +FDBD;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0646 062C 062D;;;;N;;;;; +FDBE;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 062D 064A;;;;N;;;;; +FDBF;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 062C 064A;;;;N;;;;; +FDC0;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062C 064A;;;;N;;;;; +FDC1;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 0645 064A;;;;N;;;;; +FDC2;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062D 064A;;;;N;;;;; +FDC3;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645 0645;;;;N;;;;; +FDC4;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C 0645;;;;N;;;;; +FDC5;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645 0645;;;;N;;;;; +FDC6;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 062E 064A;;;;N;;;;; +FDC7;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062C 064A;;;;N;;;;; +FDF0;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 06D2;;;;N;;;;; +FDF1;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0642 0644 06D2;;;;N;;;;; +FDF2;ARABIC LIGATURE ALLAH ISOLATED FORM;Lo;0;AL;<isolated> 0627 0644 0644 0647;;;;N;;;;; +FDF3;ARABIC LIGATURE AKBAR ISOLATED FORM;Lo;0;AL;<isolated> 0627 0643 0628 0631;;;;N;;;;; +FDF4;ARABIC LIGATURE MOHAMMAD ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D 0645 062F;;;;N;;;;; +FDF5;ARABIC LIGATURE SALAM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0639 0645;;;;N;;;;; +FDF6;ARABIC LIGATURE RASOUL ISOLATED FORM;Lo;0;AL;<isolated> 0631 0633 0648 0644;;;;N;;;;; +FDF7;ARABIC LIGATURE ALAYHE ISOLATED FORM;Lo;0;AL;<isolated> 0639 0644 064A 0647;;;;N;;;;; +FDF8;ARABIC LIGATURE WASALLAM ISOLATED FORM;Lo;0;AL;<isolated> 0648 0633 0644 0645;;;;N;;;;; +FDF9;ARABIC LIGATURE SALLA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0649;;;;N;;;;; +FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL;<isolated> 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;;;;N;ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM;;;; +FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL;<isolated> 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;; +FDFC;RIAL SIGN;Sc;0;AL;<isolated> 0631 06CC 0627 0644;;;;N;;;;; +FE00;VARIATION SELECTOR-1;Mn;0;NSM;;;;;N;;;;; +FE01;VARIATION SELECTOR-2;Mn;0;NSM;;;;;N;;;;; +FE02;VARIATION SELECTOR-3;Mn;0;NSM;;;;;N;;;;; +FE03;VARIATION SELECTOR-4;Mn;0;NSM;;;;;N;;;;; +FE04;VARIATION SELECTOR-5;Mn;0;NSM;;;;;N;;;;; +FE05;VARIATION SELECTOR-6;Mn;0;NSM;;;;;N;;;;; +FE06;VARIATION SELECTOR-7;Mn;0;NSM;;;;;N;;;;; +FE07;VARIATION SELECTOR-8;Mn;0;NSM;;;;;N;;;;; +FE08;VARIATION SELECTOR-9;Mn;0;NSM;;;;;N;;;;; +FE09;VARIATION SELECTOR-10;Mn;0;NSM;;;;;N;;;;; +FE0A;VARIATION SELECTOR-11;Mn;0;NSM;;;;;N;;;;; +FE0B;VARIATION SELECTOR-12;Mn;0;NSM;;;;;N;;;;; +FE0C;VARIATION SELECTOR-13;Mn;0;NSM;;;;;N;;;;; +FE0D;VARIATION SELECTOR-14;Mn;0;NSM;;;;;N;;;;; +FE0E;VARIATION SELECTOR-15;Mn;0;NSM;;;;;N;;;;; +FE0F;VARIATION SELECTOR-16;Mn;0;NSM;;;;;N;;;;; +FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON;<vertical> 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;; +FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON;<vertical> 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;; +FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON;<vertical> 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;; +FE33;PRESENTATION FORM FOR VERTICAL LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING UNDERSCORE;;;; +FE34;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE;;;; +FE35;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS;Ps;0;ON;<vertical> 0028;;;;N;GLYPH FOR VERTICAL OPENING PARENTHESIS;;;; +FE36;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS;Pe;0;ON;<vertical> 0029;;;;N;GLYPH FOR VERTICAL CLOSING PARENTHESIS;;;; +FE37;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET;Ps;0;ON;<vertical> 007B;;;;N;GLYPH FOR VERTICAL OPENING CURLY BRACKET;;;; +FE38;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET;Pe;0;ON;<vertical> 007D;;;;N;GLYPH FOR VERTICAL CLOSING CURLY BRACKET;;;; +FE39;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<vertical> 3014;;;;N;GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET;;;; +FE3A;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<vertical> 3015;;;;N;GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET;;;; +FE3B;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;<vertical> 3010;;;;N;GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET;;;; +FE3C;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;<vertical> 3011;;;;N;GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET;;;; +FE3D;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;<vertical> 300A;;;;N;GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET;;;; +FE3E;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;<vertical> 300B;;;;N;GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET;;;; +FE3F;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET;Ps;0;ON;<vertical> 3008;;;;N;GLYPH FOR VERTICAL OPENING ANGLE BRACKET;;;; +FE40;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET;Pe;0;ON;<vertical> 3009;;;;N;GLYPH FOR VERTICAL CLOSING ANGLE BRACKET;;;; +FE41;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET;Ps;0;ON;<vertical> 300C;;;;N;GLYPH FOR VERTICAL OPENING CORNER BRACKET;;;; +FE42;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET;Pe;0;ON;<vertical> 300D;;;;N;GLYPH FOR VERTICAL CLOSING CORNER BRACKET;;;; +FE43;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET;Ps;0;ON;<vertical> 300E;;;;N;GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET;;;; +FE44;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET;Pe;0;ON;<vertical> 300F;;;;N;GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET;;;; +FE45;SESAME DOT;Po;0;ON;;;;;N;;;;; +FE46;WHITE SESAME DOT;Po;0;ON;;;;;N;;;;; +FE49;DASHED OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DASHED OVERSCORE;;;; +FE4A;CENTRELINE OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING CENTERLINE OVERSCORE;;;; +FE4B;WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING WAVY OVERSCORE;;;; +FE4C;DOUBLE WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DOUBLE WAVY OVERSCORE;;;; +FE4D;DASHED LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING DASHED UNDERSCORE;;;; +FE4E;CENTRELINE LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING CENTERLINE UNDERSCORE;;;; +FE4F;WAVY LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING WAVY UNDERSCORE;;;; +FE50;SMALL COMMA;Po;0;CS;<small> 002C;;;;N;;;;; +FE51;SMALL IDEOGRAPHIC COMMA;Po;0;ON;<small> 3001;;;;N;;;;; +FE52;SMALL FULL STOP;Po;0;CS;<small> 002E;;;;N;SMALL PERIOD;;;; +FE54;SMALL SEMICOLON;Po;0;ON;<small> 003B;;;;N;;;;; +FE55;SMALL COLON;Po;0;CS;<small> 003A;;;;N;;;;; +FE56;SMALL QUESTION MARK;Po;0;ON;<small> 003F;;;;N;;;;; +FE57;SMALL EXCLAMATION MARK;Po;0;ON;<small> 0021;;;;N;;;;; +FE58;SMALL EM DASH;Pd;0;ON;<small> 2014;;;;N;;;;; +FE59;SMALL LEFT PARENTHESIS;Ps;0;ON;<small> 0028;;;;N;SMALL OPENING PARENTHESIS;;;; +FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON;<small> 0029;;;;N;SMALL CLOSING PARENTHESIS;;;; +FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON;<small> 007B;;;;N;SMALL OPENING CURLY BRACKET;;;; +FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON;<small> 007D;;;;N;SMALL CLOSING CURLY BRACKET;;;; +FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<small> 3014;;;;N;SMALL OPENING TORTOISE SHELL BRACKET;;;; +FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<small> 3015;;;;N;SMALL CLOSING TORTOISE SHELL BRACKET;;;; +FE5F;SMALL NUMBER SIGN;Po;0;ET;<small> 0023;;;;N;;;;; +FE60;SMALL AMPERSAND;Po;0;ON;<small> 0026;;;;N;;;;; +FE61;SMALL ASTERISK;Po;0;ON;<small> 002A;;;;N;;;;; +FE62;SMALL PLUS SIGN;Sm;0;ET;<small> 002B;;;;N;;;;; +FE63;SMALL HYPHEN-MINUS;Pd;0;ET;<small> 002D;;;;N;;;;; +FE64;SMALL LESS-THAN SIGN;Sm;0;ON;<small> 003C;;;;N;;;;; +FE65;SMALL GREATER-THAN SIGN;Sm;0;ON;<small> 003E;;;;N;;;;; +FE66;SMALL EQUALS SIGN;Sm;0;ON;<small> 003D;;;;N;;;;; +FE68;SMALL REVERSE SOLIDUS;Po;0;ON;<small> 005C;;;;N;SMALL BACKSLASH;;;; +FE69;SMALL DOLLAR SIGN;Sc;0;ET;<small> 0024;;;;N;;;;; +FE6A;SMALL PERCENT SIGN;Po;0;ET;<small> 0025;;;;N;;;;; +FE6B;SMALL COMMERCIAL AT;Po;0;ON;<small> 0040;;;;N;;;;; +FE70;ARABIC FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064B;;;;N;ARABIC SPACING FATHATAN;;;; +FE71;ARABIC TATWEEL WITH FATHATAN ABOVE;Lo;0;AL;<medial> 0640 064B;;;;N;ARABIC FATHATAN ON TATWEEL;;;; +FE72;ARABIC DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C;;;;N;ARABIC SPACING DAMMATAN;;;; +FE73;ARABIC TAIL FRAGMENT;Lo;0;AL;;;;;N;;;;; +FE74;ARABIC KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D;;;;N;ARABIC SPACING KASRATAN;;;; +FE76;ARABIC FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E;;;;N;ARABIC SPACING FATHAH;;;; +FE77;ARABIC FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E;;;;N;ARABIC FATHAH ON TATWEEL;;;; +FE78;ARABIC DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F;;;;N;ARABIC SPACING DAMMAH;;;; +FE79;ARABIC DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F;;;;N;ARABIC DAMMAH ON TATWEEL;;;; +FE7A;ARABIC KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650;;;;N;ARABIC SPACING KASRAH;;;; +FE7B;ARABIC KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650;;;;N;ARABIC KASRAH ON TATWEEL;;;; +FE7C;ARABIC SHADDA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651;;;;N;ARABIC SPACING SHADDAH;;;; +FE7D;ARABIC SHADDA MEDIAL FORM;Lo;0;AL;<medial> 0640 0651;;;;N;ARABIC SHADDAH ON TATWEEL;;;; +FE7E;ARABIC SUKUN ISOLATED FORM;Lo;0;AL;<isolated> 0020 0652;;;;N;ARABIC SPACING SUKUN;;;; +FE7F;ARABIC SUKUN MEDIAL FORM;Lo;0;AL;<medial> 0640 0652;;;;N;ARABIC SUKUN ON TATWEEL;;;; +FE80;ARABIC LETTER HAMZA ISOLATED FORM;Lo;0;AL;<isolated> 0621;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH;;;; +FE81;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF;;;; +FE82;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON ALEF;;;; +FE83;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF;;;; +FE84;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON ALEF;;;; +FE85;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0624;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW;;;; +FE86;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0624;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON WAW;;;; +FE87;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF;;;; +FE88;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF;;;; +FE89;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0626;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON YA;;;; +FE8A;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0626;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON YA;;;; +FE8B;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM;Lo;0;AL;<initial> 0626;;;;N;GLYPH FOR INITIAL ARABIC HAMZAH ON YA;;;; +FE8C;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM;Lo;0;AL;<medial> 0626;;;;N;GLYPH FOR MEDIAL ARABIC HAMZAH ON YA;;;; +FE8D;ARABIC LETTER ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0627;;;;N;GLYPH FOR ISOLATE ARABIC ALEF;;;; +FE8E;ARABIC LETTER ALEF FINAL FORM;Lo;0;AL;<final> 0627;;;;N;GLYPH FOR FINAL ARABIC ALEF;;;; +FE8F;ARABIC LETTER BEH ISOLATED FORM;Lo;0;AL;<isolated> 0628;;;;N;GLYPH FOR ISOLATE ARABIC BAA;;;; +FE90;ARABIC LETTER BEH FINAL FORM;Lo;0;AL;<final> 0628;;;;N;GLYPH FOR FINAL ARABIC BAA;;;; +FE91;ARABIC LETTER BEH INITIAL FORM;Lo;0;AL;<initial> 0628;;;;N;GLYPH FOR INITIAL ARABIC BAA;;;; +FE92;ARABIC LETTER BEH MEDIAL FORM;Lo;0;AL;<medial> 0628;;;;N;GLYPH FOR MEDIAL ARABIC BAA;;;; +FE93;ARABIC LETTER TEH MARBUTA ISOLATED FORM;Lo;0;AL;<isolated> 0629;;;;N;GLYPH FOR ISOLATE ARABIC TAA MARBUTAH;;;; +FE94;ARABIC LETTER TEH MARBUTA FINAL FORM;Lo;0;AL;<final> 0629;;;;N;GLYPH FOR FINAL ARABIC TAA MARBUTAH;;;; +FE95;ARABIC LETTER TEH ISOLATED FORM;Lo;0;AL;<isolated> 062A;;;;N;GLYPH FOR ISOLATE ARABIC TAA;;;; +FE96;ARABIC LETTER TEH FINAL FORM;Lo;0;AL;<final> 062A;;;;N;GLYPH FOR FINAL ARABIC TAA;;;; +FE97;ARABIC LETTER TEH INITIAL FORM;Lo;0;AL;<initial> 062A;;;;N;GLYPH FOR INITIAL ARABIC TAA;;;; +FE98;ARABIC LETTER TEH MEDIAL FORM;Lo;0;AL;<medial> 062A;;;;N;GLYPH FOR MEDIAL ARABIC TAA;;;; +FE99;ARABIC LETTER THEH ISOLATED FORM;Lo;0;AL;<isolated> 062B;;;;N;GLYPH FOR ISOLATE ARABIC THAA;;;; +FE9A;ARABIC LETTER THEH FINAL FORM;Lo;0;AL;<final> 062B;;;;N;GLYPH FOR FINAL ARABIC THAA;;;; +FE9B;ARABIC LETTER THEH INITIAL FORM;Lo;0;AL;<initial> 062B;;;;N;GLYPH FOR INITIAL ARABIC THAA;;;; +FE9C;ARABIC LETTER THEH MEDIAL FORM;Lo;0;AL;<medial> 062B;;;;N;GLYPH FOR MEDIAL ARABIC THAA;;;; +FE9D;ARABIC LETTER JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C;;;;N;GLYPH FOR ISOLATE ARABIC JEEM;;;; +FE9E;ARABIC LETTER JEEM FINAL FORM;Lo;0;AL;<final> 062C;;;;N;GLYPH FOR FINAL ARABIC JEEM;;;; +FE9F;ARABIC LETTER JEEM INITIAL FORM;Lo;0;AL;<initial> 062C;;;;N;GLYPH FOR INITIAL ARABIC JEEM;;;; +FEA0;ARABIC LETTER JEEM MEDIAL FORM;Lo;0;AL;<medial> 062C;;;;N;GLYPH FOR MEDIAL ARABIC JEEM;;;; +FEA1;ARABIC LETTER HAH ISOLATED FORM;Lo;0;AL;<isolated> 062D;;;;N;GLYPH FOR ISOLATE ARABIC HAA;;;; +FEA2;ARABIC LETTER HAH FINAL FORM;Lo;0;AL;<final> 062D;;;;N;GLYPH FOR FINAL ARABIC HAA;;;; +FEA3;ARABIC LETTER HAH INITIAL FORM;Lo;0;AL;<initial> 062D;;;;N;GLYPH FOR INITIAL ARABIC HAA;;;; +FEA4;ARABIC LETTER HAH MEDIAL FORM;Lo;0;AL;<medial> 062D;;;;N;GLYPH FOR MEDIAL ARABIC HAA;;;; +FEA5;ARABIC LETTER KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062E;;;;N;GLYPH FOR ISOLATE ARABIC KHAA;;;; +FEA6;ARABIC LETTER KHAH FINAL FORM;Lo;0;AL;<final> 062E;;;;N;GLYPH FOR FINAL ARABIC KHAA;;;; +FEA7;ARABIC LETTER KHAH INITIAL FORM;Lo;0;AL;<initial> 062E;;;;N;GLYPH FOR INITIAL ARABIC KHAA;;;; +FEA8;ARABIC LETTER KHAH MEDIAL FORM;Lo;0;AL;<medial> 062E;;;;N;GLYPH FOR MEDIAL ARABIC KHAA;;;; +FEA9;ARABIC LETTER DAL ISOLATED FORM;Lo;0;AL;<isolated> 062F;;;;N;GLYPH FOR ISOLATE ARABIC DAL;;;; +FEAA;ARABIC LETTER DAL FINAL FORM;Lo;0;AL;<final> 062F;;;;N;GLYPH FOR FINAL ARABIC DAL;;;; +FEAB;ARABIC LETTER THAL ISOLATED FORM;Lo;0;AL;<isolated> 0630;;;;N;GLYPH FOR ISOLATE ARABIC THAL;;;; +FEAC;ARABIC LETTER THAL FINAL FORM;Lo;0;AL;<final> 0630;;;;N;GLYPH FOR FINAL ARABIC THAL;;;; +FEAD;ARABIC LETTER REH ISOLATED FORM;Lo;0;AL;<isolated> 0631;;;;N;GLYPH FOR ISOLATE ARABIC RA;;;; +FEAE;ARABIC LETTER REH FINAL FORM;Lo;0;AL;<final> 0631;;;;N;GLYPH FOR FINAL ARABIC RA;;;; +FEAF;ARABIC LETTER ZAIN ISOLATED FORM;Lo;0;AL;<isolated> 0632;;;;N;GLYPH FOR ISOLATE ARABIC ZAIN;;;; +FEB0;ARABIC LETTER ZAIN FINAL FORM;Lo;0;AL;<final> 0632;;;;N;GLYPH FOR FINAL ARABIC ZAIN;;;; +FEB1;ARABIC LETTER SEEN ISOLATED FORM;Lo;0;AL;<isolated> 0633;;;;N;GLYPH FOR ISOLATE ARABIC SEEN;;;; +FEB2;ARABIC LETTER SEEN FINAL FORM;Lo;0;AL;<final> 0633;;;;N;GLYPH FOR FINAL ARABIC SEEN;;;; +FEB3;ARABIC LETTER SEEN INITIAL FORM;Lo;0;AL;<initial> 0633;;;;N;GLYPH FOR INITIAL ARABIC SEEN;;;; +FEB4;ARABIC LETTER SEEN MEDIAL FORM;Lo;0;AL;<medial> 0633;;;;N;GLYPH FOR MEDIAL ARABIC SEEN;;;; +FEB5;ARABIC LETTER SHEEN ISOLATED FORM;Lo;0;AL;<isolated> 0634;;;;N;GLYPH FOR ISOLATE ARABIC SHEEN;;;; +FEB6;ARABIC LETTER SHEEN FINAL FORM;Lo;0;AL;<final> 0634;;;;N;GLYPH FOR FINAL ARABIC SHEEN;;;; +FEB7;ARABIC LETTER SHEEN INITIAL FORM;Lo;0;AL;<initial> 0634;;;;N;GLYPH FOR INITIAL ARABIC SHEEN;;;; +FEB8;ARABIC LETTER SHEEN MEDIAL FORM;Lo;0;AL;<medial> 0634;;;;N;GLYPH FOR MEDIAL ARABIC SHEEN;;;; +FEB9;ARABIC LETTER SAD ISOLATED FORM;Lo;0;AL;<isolated> 0635;;;;N;GLYPH FOR ISOLATE ARABIC SAD;;;; +FEBA;ARABIC LETTER SAD FINAL FORM;Lo;0;AL;<final> 0635;;;;N;GLYPH FOR FINAL ARABIC SAD;;;; +FEBB;ARABIC LETTER SAD INITIAL FORM;Lo;0;AL;<initial> 0635;;;;N;GLYPH FOR INITIAL ARABIC SAD;;;; +FEBC;ARABIC LETTER SAD MEDIAL FORM;Lo;0;AL;<medial> 0635;;;;N;GLYPH FOR MEDIAL ARABIC SAD;;;; +FEBD;ARABIC LETTER DAD ISOLATED FORM;Lo;0;AL;<isolated> 0636;;;;N;GLYPH FOR ISOLATE ARABIC DAD;;;; +FEBE;ARABIC LETTER DAD FINAL FORM;Lo;0;AL;<final> 0636;;;;N;GLYPH FOR FINAL ARABIC DAD;;;; +FEBF;ARABIC LETTER DAD INITIAL FORM;Lo;0;AL;<initial> 0636;;;;N;GLYPH FOR INITIAL ARABIC DAD;;;; +FEC0;ARABIC LETTER DAD MEDIAL FORM;Lo;0;AL;<medial> 0636;;;;N;GLYPH FOR MEDIAL ARABIC DAD;;;; +FEC1;ARABIC LETTER TAH ISOLATED FORM;Lo;0;AL;<isolated> 0637;;;;N;GLYPH FOR ISOLATE ARABIC TAH;;;; +FEC2;ARABIC LETTER TAH FINAL FORM;Lo;0;AL;<final> 0637;;;;N;GLYPH FOR FINAL ARABIC TAH;;;; +FEC3;ARABIC LETTER TAH INITIAL FORM;Lo;0;AL;<initial> 0637;;;;N;GLYPH FOR INITIAL ARABIC TAH;;;; +FEC4;ARABIC LETTER TAH MEDIAL FORM;Lo;0;AL;<medial> 0637;;;;N;GLYPH FOR MEDIAL ARABIC TAH;;;; +FEC5;ARABIC LETTER ZAH ISOLATED FORM;Lo;0;AL;<isolated> 0638;;;;N;GLYPH FOR ISOLATE ARABIC DHAH;;;; +FEC6;ARABIC LETTER ZAH FINAL FORM;Lo;0;AL;<final> 0638;;;;N;GLYPH FOR FINAL ARABIC DHAH;;;; +FEC7;ARABIC LETTER ZAH INITIAL FORM;Lo;0;AL;<initial> 0638;;;;N;GLYPH FOR INITIAL ARABIC DHAH;;;; +FEC8;ARABIC LETTER ZAH MEDIAL FORM;Lo;0;AL;<medial> 0638;;;;N;GLYPH FOR MEDIAL ARABIC DHAH;;;; +FEC9;ARABIC LETTER AIN ISOLATED FORM;Lo;0;AL;<isolated> 0639;;;;N;GLYPH FOR ISOLATE ARABIC AIN;;;; +FECA;ARABIC LETTER AIN FINAL FORM;Lo;0;AL;<final> 0639;;;;N;GLYPH FOR FINAL ARABIC AIN;;;; +FECB;ARABIC LETTER AIN INITIAL FORM;Lo;0;AL;<initial> 0639;;;;N;GLYPH FOR INITIAL ARABIC AIN;;;; +FECC;ARABIC LETTER AIN MEDIAL FORM;Lo;0;AL;<medial> 0639;;;;N;GLYPH FOR MEDIAL ARABIC AIN;;;; +FECD;ARABIC LETTER GHAIN ISOLATED FORM;Lo;0;AL;<isolated> 063A;;;;N;GLYPH FOR ISOLATE ARABIC GHAIN;;;; +FECE;ARABIC LETTER GHAIN FINAL FORM;Lo;0;AL;<final> 063A;;;;N;GLYPH FOR FINAL ARABIC GHAIN;;;; +FECF;ARABIC LETTER GHAIN INITIAL FORM;Lo;0;AL;<initial> 063A;;;;N;GLYPH FOR INITIAL ARABIC GHAIN;;;; +FED0;ARABIC LETTER GHAIN MEDIAL FORM;Lo;0;AL;<medial> 063A;;;;N;GLYPH FOR MEDIAL ARABIC GHAIN;;;; +FED1;ARABIC LETTER FEH ISOLATED FORM;Lo;0;AL;<isolated> 0641;;;;N;GLYPH FOR ISOLATE ARABIC FA;;;; +FED2;ARABIC LETTER FEH FINAL FORM;Lo;0;AL;<final> 0641;;;;N;GLYPH FOR FINAL ARABIC FA;;;; +FED3;ARABIC LETTER FEH INITIAL FORM;Lo;0;AL;<initial> 0641;;;;N;GLYPH FOR INITIAL ARABIC FA;;;; +FED4;ARABIC LETTER FEH MEDIAL FORM;Lo;0;AL;<medial> 0641;;;;N;GLYPH FOR MEDIAL ARABIC FA;;;; +FED5;ARABIC LETTER QAF ISOLATED FORM;Lo;0;AL;<isolated> 0642;;;;N;GLYPH FOR ISOLATE ARABIC QAF;;;; +FED6;ARABIC LETTER QAF FINAL FORM;Lo;0;AL;<final> 0642;;;;N;GLYPH FOR FINAL ARABIC QAF;;;; +FED7;ARABIC LETTER QAF INITIAL FORM;Lo;0;AL;<initial> 0642;;;;N;GLYPH FOR INITIAL ARABIC QAF;;;; +FED8;ARABIC LETTER QAF MEDIAL FORM;Lo;0;AL;<medial> 0642;;;;N;GLYPH FOR MEDIAL ARABIC QAF;;;; +FED9;ARABIC LETTER KAF ISOLATED FORM;Lo;0;AL;<isolated> 0643;;;;N;GLYPH FOR ISOLATE ARABIC CAF;;;; +FEDA;ARABIC LETTER KAF FINAL FORM;Lo;0;AL;<final> 0643;;;;N;GLYPH FOR FINAL ARABIC CAF;;;; +FEDB;ARABIC LETTER KAF INITIAL FORM;Lo;0;AL;<initial> 0643;;;;N;GLYPH FOR INITIAL ARABIC CAF;;;; +FEDC;ARABIC LETTER KAF MEDIAL FORM;Lo;0;AL;<medial> 0643;;;;N;GLYPH FOR MEDIAL ARABIC CAF;;;; +FEDD;ARABIC LETTER LAM ISOLATED FORM;Lo;0;AL;<isolated> 0644;;;;N;GLYPH FOR ISOLATE ARABIC LAM;;;; +FEDE;ARABIC LETTER LAM FINAL FORM;Lo;0;AL;<final> 0644;;;;N;GLYPH FOR FINAL ARABIC LAM;;;; +FEDF;ARABIC LETTER LAM INITIAL FORM;Lo;0;AL;<initial> 0644;;;;N;GLYPH FOR INITIAL ARABIC LAM;;;; +FEE0;ARABIC LETTER LAM MEDIAL FORM;Lo;0;AL;<medial> 0644;;;;N;GLYPH FOR MEDIAL ARABIC LAM;;;; +FEE1;ARABIC LETTER MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645;;;;N;GLYPH FOR ISOLATE ARABIC MEEM;;;; +FEE2;ARABIC LETTER MEEM FINAL FORM;Lo;0;AL;<final> 0645;;;;N;GLYPH FOR FINAL ARABIC MEEM;;;; +FEE3;ARABIC LETTER MEEM INITIAL FORM;Lo;0;AL;<initial> 0645;;;;N;GLYPH FOR INITIAL ARABIC MEEM;;;; +FEE4;ARABIC LETTER MEEM MEDIAL FORM;Lo;0;AL;<medial> 0645;;;;N;GLYPH FOR MEDIAL ARABIC MEEM;;;; +FEE5;ARABIC LETTER NOON ISOLATED FORM;Lo;0;AL;<isolated> 0646;;;;N;GLYPH FOR ISOLATE ARABIC NOON;;;; +FEE6;ARABIC LETTER NOON FINAL FORM;Lo;0;AL;<final> 0646;;;;N;GLYPH FOR FINAL ARABIC NOON;;;; +FEE7;ARABIC LETTER NOON INITIAL FORM;Lo;0;AL;<initial> 0646;;;;N;GLYPH FOR INITIAL ARABIC NOON;;;; +FEE8;ARABIC LETTER NOON MEDIAL FORM;Lo;0;AL;<medial> 0646;;;;N;GLYPH FOR MEDIAL ARABIC NOON;;;; +FEE9;ARABIC LETTER HEH ISOLATED FORM;Lo;0;AL;<isolated> 0647;;;;N;GLYPH FOR ISOLATE ARABIC HA;;;; +FEEA;ARABIC LETTER HEH FINAL FORM;Lo;0;AL;<final> 0647;;;;N;GLYPH FOR FINAL ARABIC HA;;;; +FEEB;ARABIC LETTER HEH INITIAL FORM;Lo;0;AL;<initial> 0647;;;;N;GLYPH FOR INITIAL ARABIC HA;;;; +FEEC;ARABIC LETTER HEH MEDIAL FORM;Lo;0;AL;<medial> 0647;;;;N;GLYPH FOR MEDIAL ARABIC HA;;;; +FEED;ARABIC LETTER WAW ISOLATED FORM;Lo;0;AL;<isolated> 0648;;;;N;GLYPH FOR ISOLATE ARABIC WAW;;;; +FEEE;ARABIC LETTER WAW FINAL FORM;Lo;0;AL;<final> 0648;;;;N;GLYPH FOR FINAL ARABIC WAW;;;; +FEEF;ARABIC LETTER ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0649;;;;N;GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH;;;; +FEF0;ARABIC LETTER ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0649;;;;N;GLYPH FOR FINAL ARABIC ALEF MAQSURAH;;;; +FEF1;ARABIC LETTER YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A;;;;N;GLYPH FOR ISOLATE ARABIC YA;;;; +FEF2;ARABIC LETTER YEH FINAL FORM;Lo;0;AL;<final> 064A;;;;N;GLYPH FOR FINAL ARABIC YA;;;; +FEF3;ARABIC LETTER YEH INITIAL FORM;Lo;0;AL;<initial> 064A;;;;N;GLYPH FOR INITIAL ARABIC YA;;;; +FEF4;ARABIC LETTER YEH MEDIAL FORM;Lo;0;AL;<medial> 064A;;;;N;GLYPH FOR MEDIAL ARABIC YA;;;; +FEF5;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF;;;; +FEF6;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF;;;; +FEF7;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; +FEF8;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; +FEF9;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0644 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; +FEFA;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0644 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; +FEFB;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0644 0627;;;;N;GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF;;;; +FEFC;ARABIC LIGATURE LAM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0644 0627;;;;N;GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF;;;; +FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;; +FF01;FULLWIDTH EXCLAMATION MARK;Po;0;ON;<wide> 0021;;;;N;;;;; +FF02;FULLWIDTH QUOTATION MARK;Po;0;ON;<wide> 0022;;;;N;;;;; +FF03;FULLWIDTH NUMBER SIGN;Po;0;ET;<wide> 0023;;;;N;;;;; +FF04;FULLWIDTH DOLLAR SIGN;Sc;0;ET;<wide> 0024;;;;N;;;;; +FF05;FULLWIDTH PERCENT SIGN;Po;0;ET;<wide> 0025;;;;N;;;;; +FF06;FULLWIDTH AMPERSAND;Po;0;ON;<wide> 0026;;;;N;;;;; +FF07;FULLWIDTH APOSTROPHE;Po;0;ON;<wide> 0027;;;;N;;;;; +FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON;<wide> 0028;;;;Y;FULLWIDTH OPENING PARENTHESIS;;;; +FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON;<wide> 0029;;;;Y;FULLWIDTH CLOSING PARENTHESIS;;;; +FF0A;FULLWIDTH ASTERISK;Po;0;ON;<wide> 002A;;;;N;;;;; +FF0B;FULLWIDTH PLUS SIGN;Sm;0;ET;<wide> 002B;;;;N;;;;; +FF0C;FULLWIDTH COMMA;Po;0;CS;<wide> 002C;;;;N;;;;; +FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ET;<wide> 002D;;;;N;;;;; +FF0E;FULLWIDTH FULL STOP;Po;0;CS;<wide> 002E;;;;N;FULLWIDTH PERIOD;;;; +FF0F;FULLWIDTH SOLIDUS;Po;0;ES;<wide> 002F;;;;N;FULLWIDTH SLASH;;;; +FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN;<wide> 0030;0;0;0;N;;;;; +FF11;FULLWIDTH DIGIT ONE;Nd;0;EN;<wide> 0031;1;1;1;N;;;;; +FF12;FULLWIDTH DIGIT TWO;Nd;0;EN;<wide> 0032;2;2;2;N;;;;; +FF13;FULLWIDTH DIGIT THREE;Nd;0;EN;<wide> 0033;3;3;3;N;;;;; +FF14;FULLWIDTH DIGIT FOUR;Nd;0;EN;<wide> 0034;4;4;4;N;;;;; +FF15;FULLWIDTH DIGIT FIVE;Nd;0;EN;<wide> 0035;5;5;5;N;;;;; +FF16;FULLWIDTH DIGIT SIX;Nd;0;EN;<wide> 0036;6;6;6;N;;;;; +FF17;FULLWIDTH DIGIT SEVEN;Nd;0;EN;<wide> 0037;7;7;7;N;;;;; +FF18;FULLWIDTH DIGIT EIGHT;Nd;0;EN;<wide> 0038;8;8;8;N;;;;; +FF19;FULLWIDTH DIGIT NINE;Nd;0;EN;<wide> 0039;9;9;9;N;;;;; +FF1A;FULLWIDTH COLON;Po;0;CS;<wide> 003A;;;;N;;;;; +FF1B;FULLWIDTH SEMICOLON;Po;0;ON;<wide> 003B;;;;N;;;;; +FF1C;FULLWIDTH LESS-THAN SIGN;Sm;0;ON;<wide> 003C;;;;Y;;;;; +FF1D;FULLWIDTH EQUALS SIGN;Sm;0;ON;<wide> 003D;;;;N;;;;; +FF1E;FULLWIDTH GREATER-THAN SIGN;Sm;0;ON;<wide> 003E;;;;Y;;;;; +FF1F;FULLWIDTH QUESTION MARK;Po;0;ON;<wide> 003F;;;;N;;;;; +FF20;FULLWIDTH COMMERCIAL AT;Po;0;ON;<wide> 0040;;;;N;;;;; +FF21;FULLWIDTH LATIN CAPITAL LETTER A;Lu;0;L;<wide> 0041;;;;N;;;;FF41; +FF22;FULLWIDTH LATIN CAPITAL LETTER B;Lu;0;L;<wide> 0042;;;;N;;;;FF42; +FF23;FULLWIDTH LATIN CAPITAL LETTER C;Lu;0;L;<wide> 0043;;;;N;;;;FF43; +FF24;FULLWIDTH LATIN CAPITAL LETTER D;Lu;0;L;<wide> 0044;;;;N;;;;FF44; +FF25;FULLWIDTH LATIN CAPITAL LETTER E;Lu;0;L;<wide> 0045;;;;N;;;;FF45; +FF26;FULLWIDTH LATIN CAPITAL LETTER F;Lu;0;L;<wide> 0046;;;;N;;;;FF46; +FF27;FULLWIDTH LATIN CAPITAL LETTER G;Lu;0;L;<wide> 0047;;;;N;;;;FF47; +FF28;FULLWIDTH LATIN CAPITAL LETTER H;Lu;0;L;<wide> 0048;;;;N;;;;FF48; +FF29;FULLWIDTH LATIN CAPITAL LETTER I;Lu;0;L;<wide> 0049;;;;N;;;;FF49; +FF2A;FULLWIDTH LATIN CAPITAL LETTER J;Lu;0;L;<wide> 004A;;;;N;;;;FF4A; +FF2B;FULLWIDTH LATIN CAPITAL LETTER K;Lu;0;L;<wide> 004B;;;;N;;;;FF4B; +FF2C;FULLWIDTH LATIN CAPITAL LETTER L;Lu;0;L;<wide> 004C;;;;N;;;;FF4C; +FF2D;FULLWIDTH LATIN CAPITAL LETTER M;Lu;0;L;<wide> 004D;;;;N;;;;FF4D; +FF2E;FULLWIDTH LATIN CAPITAL LETTER N;Lu;0;L;<wide> 004E;;;;N;;;;FF4E; +FF2F;FULLWIDTH LATIN CAPITAL LETTER O;Lu;0;L;<wide> 004F;;;;N;;;;FF4F; +FF30;FULLWIDTH LATIN CAPITAL LETTER P;Lu;0;L;<wide> 0050;;;;N;;;;FF50; +FF31;FULLWIDTH LATIN CAPITAL LETTER Q;Lu;0;L;<wide> 0051;;;;N;;;;FF51; +FF32;FULLWIDTH LATIN CAPITAL LETTER R;Lu;0;L;<wide> 0052;;;;N;;;;FF52; +FF33;FULLWIDTH LATIN CAPITAL LETTER S;Lu;0;L;<wide> 0053;;;;N;;;;FF53; +FF34;FULLWIDTH LATIN CAPITAL LETTER T;Lu;0;L;<wide> 0054;;;;N;;;;FF54; +FF35;FULLWIDTH LATIN CAPITAL LETTER U;Lu;0;L;<wide> 0055;;;;N;;;;FF55; +FF36;FULLWIDTH LATIN CAPITAL LETTER V;Lu;0;L;<wide> 0056;;;;N;;;;FF56; +FF37;FULLWIDTH LATIN CAPITAL LETTER W;Lu;0;L;<wide> 0057;;;;N;;;;FF57; +FF38;FULLWIDTH LATIN CAPITAL LETTER X;Lu;0;L;<wide> 0058;;;;N;;;;FF58; +FF39;FULLWIDTH LATIN CAPITAL LETTER Y;Lu;0;L;<wide> 0059;;;;N;;;;FF59; +FF3A;FULLWIDTH LATIN CAPITAL LETTER Z;Lu;0;L;<wide> 005A;;;;N;;;;FF5A; +FF3B;FULLWIDTH LEFT SQUARE BRACKET;Ps;0;ON;<wide> 005B;;;;Y;FULLWIDTH OPENING SQUARE BRACKET;;;; +FF3C;FULLWIDTH REVERSE SOLIDUS;Po;0;ON;<wide> 005C;;;;N;FULLWIDTH BACKSLASH;;;; +FF3D;FULLWIDTH RIGHT SQUARE BRACKET;Pe;0;ON;<wide> 005D;;;;Y;FULLWIDTH CLOSING SQUARE BRACKET;;;; +FF3E;FULLWIDTH CIRCUMFLEX ACCENT;Sk;0;ON;<wide> 005E;;;;N;FULLWIDTH SPACING CIRCUMFLEX;;;; +FF3F;FULLWIDTH LOW LINE;Pc;0;ON;<wide> 005F;;;;N;FULLWIDTH SPACING UNDERSCORE;;;; +FF40;FULLWIDTH GRAVE ACCENT;Sk;0;ON;<wide> 0060;;;;N;FULLWIDTH SPACING GRAVE;;;; +FF41;FULLWIDTH LATIN SMALL LETTER A;Ll;0;L;<wide> 0061;;;;N;;;FF21;;FF21 +FF42;FULLWIDTH LATIN SMALL LETTER B;Ll;0;L;<wide> 0062;;;;N;;;FF22;;FF22 +FF43;FULLWIDTH LATIN SMALL LETTER C;Ll;0;L;<wide> 0063;;;;N;;;FF23;;FF23 +FF44;FULLWIDTH LATIN SMALL LETTER D;Ll;0;L;<wide> 0064;;;;N;;;FF24;;FF24 +FF45;FULLWIDTH LATIN SMALL LETTER E;Ll;0;L;<wide> 0065;;;;N;;;FF25;;FF25 +FF46;FULLWIDTH LATIN SMALL LETTER F;Ll;0;L;<wide> 0066;;;;N;;;FF26;;FF26 +FF47;FULLWIDTH LATIN SMALL LETTER G;Ll;0;L;<wide> 0067;;;;N;;;FF27;;FF27 +FF48;FULLWIDTH LATIN SMALL LETTER H;Ll;0;L;<wide> 0068;;;;N;;;FF28;;FF28 +FF49;FULLWIDTH LATIN SMALL LETTER I;Ll;0;L;<wide> 0069;;;;N;;;FF29;;FF29 +FF4A;FULLWIDTH LATIN SMALL LETTER J;Ll;0;L;<wide> 006A;;;;N;;;FF2A;;FF2A +FF4B;FULLWIDTH LATIN SMALL LETTER K;Ll;0;L;<wide> 006B;;;;N;;;FF2B;;FF2B +FF4C;FULLWIDTH LATIN SMALL LETTER L;Ll;0;L;<wide> 006C;;;;N;;;FF2C;;FF2C +FF4D;FULLWIDTH LATIN SMALL LETTER M;Ll;0;L;<wide> 006D;;;;N;;;FF2D;;FF2D +FF4E;FULLWIDTH LATIN SMALL LETTER N;Ll;0;L;<wide> 006E;;;;N;;;FF2E;;FF2E +FF4F;FULLWIDTH LATIN SMALL LETTER O;Ll;0;L;<wide> 006F;;;;N;;;FF2F;;FF2F +FF50;FULLWIDTH LATIN SMALL LETTER P;Ll;0;L;<wide> 0070;;;;N;;;FF30;;FF30 +FF51;FULLWIDTH LATIN SMALL LETTER Q;Ll;0;L;<wide> 0071;;;;N;;;FF31;;FF31 +FF52;FULLWIDTH LATIN SMALL LETTER R;Ll;0;L;<wide> 0072;;;;N;;;FF32;;FF32 +FF53;FULLWIDTH LATIN SMALL LETTER S;Ll;0;L;<wide> 0073;;;;N;;;FF33;;FF33 +FF54;FULLWIDTH LATIN SMALL LETTER T;Ll;0;L;<wide> 0074;;;;N;;;FF34;;FF34 +FF55;FULLWIDTH LATIN SMALL LETTER U;Ll;0;L;<wide> 0075;;;;N;;;FF35;;FF35 +FF56;FULLWIDTH LATIN SMALL LETTER V;Ll;0;L;<wide> 0076;;;;N;;;FF36;;FF36 +FF57;FULLWIDTH LATIN SMALL LETTER W;Ll;0;L;<wide> 0077;;;;N;;;FF37;;FF37 +FF58;FULLWIDTH LATIN SMALL LETTER X;Ll;0;L;<wide> 0078;;;;N;;;FF38;;FF38 +FF59;FULLWIDTH LATIN SMALL LETTER Y;Ll;0;L;<wide> 0079;;;;N;;;FF39;;FF39 +FF5A;FULLWIDTH LATIN SMALL LETTER Z;Ll;0;L;<wide> 007A;;;;N;;;FF3A;;FF3A +FF5B;FULLWIDTH LEFT CURLY BRACKET;Ps;0;ON;<wide> 007B;;;;Y;FULLWIDTH OPENING CURLY BRACKET;;;; +FF5C;FULLWIDTH VERTICAL LINE;Sm;0;ON;<wide> 007C;;;;N;FULLWIDTH VERTICAL BAR;;;; +FF5D;FULLWIDTH RIGHT CURLY BRACKET;Pe;0;ON;<wide> 007D;;;;Y;FULLWIDTH CLOSING CURLY BRACKET;;;; +FF5E;FULLWIDTH TILDE;Sm;0;ON;<wide> 007E;;;;N;FULLWIDTH SPACING TILDE;;;; +FF5F;FULLWIDTH LEFT WHITE PARENTHESIS;Ps;0;ON;<wide> 2985;;;;Y;;*;;; +FF60;FULLWIDTH RIGHT WHITE PARENTHESIS;Pe;0;ON;<wide> 2986;;;;Y;;*;;; +FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON;<narrow> 3002;;;;N;HALFWIDTH IDEOGRAPHIC PERIOD;;;; +FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON;<narrow> 300C;;;;Y;HALFWIDTH OPENING CORNER BRACKET;;;; +FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON;<narrow> 300D;;;;Y;HALFWIDTH CLOSING CORNER BRACKET;;;; +FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON;<narrow> 3001;;;;N;;;;; +FF65;HALFWIDTH KATAKANA MIDDLE DOT;Pc;0;ON;<narrow> 30FB;;;;N;;;;; +FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L;<narrow> 30F2;;;;N;;;;; +FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L;<narrow> 30A1;;;;N;;;;; +FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L;<narrow> 30A3;;;;N;;;;; +FF69;HALFWIDTH KATAKANA LETTER SMALL U;Lo;0;L;<narrow> 30A5;;;;N;;;;; +FF6A;HALFWIDTH KATAKANA LETTER SMALL E;Lo;0;L;<narrow> 30A7;;;;N;;;;; +FF6B;HALFWIDTH KATAKANA LETTER SMALL O;Lo;0;L;<narrow> 30A9;;;;N;;;;; +FF6C;HALFWIDTH KATAKANA LETTER SMALL YA;Lo;0;L;<narrow> 30E3;;;;N;;;;; +FF6D;HALFWIDTH KATAKANA LETTER SMALL YU;Lo;0;L;<narrow> 30E5;;;;N;;;;; +FF6E;HALFWIDTH KATAKANA LETTER SMALL YO;Lo;0;L;<narrow> 30E7;;;;N;;;;; +FF6F;HALFWIDTH KATAKANA LETTER SMALL TU;Lo;0;L;<narrow> 30C3;;;;N;;;;; +FF70;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;<narrow> 30FC;;;;N;;;;; +FF71;HALFWIDTH KATAKANA LETTER A;Lo;0;L;<narrow> 30A2;;;;N;;;;; +FF72;HALFWIDTH KATAKANA LETTER I;Lo;0;L;<narrow> 30A4;;;;N;;;;; +FF73;HALFWIDTH KATAKANA LETTER U;Lo;0;L;<narrow> 30A6;;;;N;;;;; +FF74;HALFWIDTH KATAKANA LETTER E;Lo;0;L;<narrow> 30A8;;;;N;;;;; +FF75;HALFWIDTH KATAKANA LETTER O;Lo;0;L;<narrow> 30AA;;;;N;;;;; +FF76;HALFWIDTH KATAKANA LETTER KA;Lo;0;L;<narrow> 30AB;;;;N;;;;; +FF77;HALFWIDTH KATAKANA LETTER KI;Lo;0;L;<narrow> 30AD;;;;N;;;;; +FF78;HALFWIDTH KATAKANA LETTER KU;Lo;0;L;<narrow> 30AF;;;;N;;;;; +FF79;HALFWIDTH KATAKANA LETTER KE;Lo;0;L;<narrow> 30B1;;;;N;;;;; +FF7A;HALFWIDTH KATAKANA LETTER KO;Lo;0;L;<narrow> 30B3;;;;N;;;;; +FF7B;HALFWIDTH KATAKANA LETTER SA;Lo;0;L;<narrow> 30B5;;;;N;;;;; +FF7C;HALFWIDTH KATAKANA LETTER SI;Lo;0;L;<narrow> 30B7;;;;N;;;;; +FF7D;HALFWIDTH KATAKANA LETTER SU;Lo;0;L;<narrow> 30B9;;;;N;;;;; +FF7E;HALFWIDTH KATAKANA LETTER SE;Lo;0;L;<narrow> 30BB;;;;N;;;;; +FF7F;HALFWIDTH KATAKANA LETTER SO;Lo;0;L;<narrow> 30BD;;;;N;;;;; +FF80;HALFWIDTH KATAKANA LETTER TA;Lo;0;L;<narrow> 30BF;;;;N;;;;; +FF81;HALFWIDTH KATAKANA LETTER TI;Lo;0;L;<narrow> 30C1;;;;N;;;;; +FF82;HALFWIDTH KATAKANA LETTER TU;Lo;0;L;<narrow> 30C4;;;;N;;;;; +FF83;HALFWIDTH KATAKANA LETTER TE;Lo;0;L;<narrow> 30C6;;;;N;;;;; +FF84;HALFWIDTH KATAKANA LETTER TO;Lo;0;L;<narrow> 30C8;;;;N;;;;; +FF85;HALFWIDTH KATAKANA LETTER NA;Lo;0;L;<narrow> 30CA;;;;N;;;;; +FF86;HALFWIDTH KATAKANA LETTER NI;Lo;0;L;<narrow> 30CB;;;;N;;;;; +FF87;HALFWIDTH KATAKANA LETTER NU;Lo;0;L;<narrow> 30CC;;;;N;;;;; +FF88;HALFWIDTH KATAKANA LETTER NE;Lo;0;L;<narrow> 30CD;;;;N;;;;; +FF89;HALFWIDTH KATAKANA LETTER NO;Lo;0;L;<narrow> 30CE;;;;N;;;;; +FF8A;HALFWIDTH KATAKANA LETTER HA;Lo;0;L;<narrow> 30CF;;;;N;;;;; +FF8B;HALFWIDTH KATAKANA LETTER HI;Lo;0;L;<narrow> 30D2;;;;N;;;;; +FF8C;HALFWIDTH KATAKANA LETTER HU;Lo;0;L;<narrow> 30D5;;;;N;;;;; +FF8D;HALFWIDTH KATAKANA LETTER HE;Lo;0;L;<narrow> 30D8;;;;N;;;;; +FF8E;HALFWIDTH KATAKANA LETTER HO;Lo;0;L;<narrow> 30DB;;;;N;;;;; +FF8F;HALFWIDTH KATAKANA LETTER MA;Lo;0;L;<narrow> 30DE;;;;N;;;;; +FF90;HALFWIDTH KATAKANA LETTER MI;Lo;0;L;<narrow> 30DF;;;;N;;;;; +FF91;HALFWIDTH KATAKANA LETTER MU;Lo;0;L;<narrow> 30E0;;;;N;;;;; +FF92;HALFWIDTH KATAKANA LETTER ME;Lo;0;L;<narrow> 30E1;;;;N;;;;; +FF93;HALFWIDTH KATAKANA LETTER MO;Lo;0;L;<narrow> 30E2;;;;N;;;;; +FF94;HALFWIDTH KATAKANA LETTER YA;Lo;0;L;<narrow> 30E4;;;;N;;;;; +FF95;HALFWIDTH KATAKANA LETTER YU;Lo;0;L;<narrow> 30E6;;;;N;;;;; +FF96;HALFWIDTH KATAKANA LETTER YO;Lo;0;L;<narrow> 30E8;;;;N;;;;; +FF97;HALFWIDTH KATAKANA LETTER RA;Lo;0;L;<narrow> 30E9;;;;N;;;;; +FF98;HALFWIDTH KATAKANA LETTER RI;Lo;0;L;<narrow> 30EA;;;;N;;;;; +FF99;HALFWIDTH KATAKANA LETTER RU;Lo;0;L;<narrow> 30EB;;;;N;;;;; +FF9A;HALFWIDTH KATAKANA LETTER RE;Lo;0;L;<narrow> 30EC;;;;N;;;;; +FF9B;HALFWIDTH KATAKANA LETTER RO;Lo;0;L;<narrow> 30ED;;;;N;;;;; +FF9C;HALFWIDTH KATAKANA LETTER WA;Lo;0;L;<narrow> 30EF;;;;N;;;;; +FF9D;HALFWIDTH KATAKANA LETTER N;Lo;0;L;<narrow> 30F3;;;;N;;;;; +FF9E;HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L;<narrow> 3099;;;;N;;halfwidth katakana-hiragana voiced sound mark;;; +FF9F;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L;<narrow> 309A;;;;N;;halfwidth katakana-hiragana semi-voiced sound mark;;; +FFA0;HALFWIDTH HANGUL FILLER;Lo;0;L;<narrow> 3164;;;;N;HALFWIDTH HANGUL CAE OM;;;; +FFA1;HALFWIDTH HANGUL LETTER KIYEOK;Lo;0;L;<narrow> 3131;;;;N;HALFWIDTH HANGUL LETTER GIYEOG;;;; +FFA2;HALFWIDTH HANGUL LETTER SSANGKIYEOK;Lo;0;L;<narrow> 3132;;;;N;HALFWIDTH HANGUL LETTER SSANG GIYEOG;;;; +FFA3;HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<narrow> 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;; +FFA4;HALFWIDTH HANGUL LETTER NIEUN;Lo;0;L;<narrow> 3134;;;;N;;;;; +FFA5;HALFWIDTH HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<narrow> 3135;;;;N;HALFWIDTH HANGUL LETTER NIEUN JIEUJ;;;; +FFA6;HALFWIDTH HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<narrow> 3136;;;;N;HALFWIDTH HANGUL LETTER NIEUN HIEUH;;;; +FFA7;HALFWIDTH HANGUL LETTER TIKEUT;Lo;0;L;<narrow> 3137;;;;N;HALFWIDTH HANGUL LETTER DIGEUD;;;; +FFA8;HALFWIDTH HANGUL LETTER SSANGTIKEUT;Lo;0;L;<narrow> 3138;;;;N;HALFWIDTH HANGUL LETTER SSANG DIGEUD;;;; +FFA9;HALFWIDTH HANGUL LETTER RIEUL;Lo;0;L;<narrow> 3139;;;;N;HALFWIDTH HANGUL LETTER LIEUL;;;; +FFAA;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<narrow> 313A;;;;N;HALFWIDTH HANGUL LETTER LIEUL GIYEOG;;;; +FFAB;HALFWIDTH HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<narrow> 313B;;;;N;HALFWIDTH HANGUL LETTER LIEUL MIEUM;;;; +FFAC;HALFWIDTH HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<narrow> 313C;;;;N;HALFWIDTH HANGUL LETTER LIEUL BIEUB;;;; +FFAD;HALFWIDTH HANGUL LETTER RIEUL-SIOS;Lo;0;L;<narrow> 313D;;;;N;HALFWIDTH HANGUL LETTER LIEUL SIOS;;;; +FFAE;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<narrow> 313E;;;;N;HALFWIDTH HANGUL LETTER LIEUL TIEUT;;;; +FFAF;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<narrow> 313F;;;;N;HALFWIDTH HANGUL LETTER LIEUL PIEUP;;;; +FFB0;HALFWIDTH HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<narrow> 3140;;;;N;HALFWIDTH HANGUL LETTER LIEUL HIEUH;;;; +FFB1;HALFWIDTH HANGUL LETTER MIEUM;Lo;0;L;<narrow> 3141;;;;N;;;;; +FFB2;HALFWIDTH HANGUL LETTER PIEUP;Lo;0;L;<narrow> 3142;;;;N;HALFWIDTH HANGUL LETTER BIEUB;;;; +FFB3;HALFWIDTH HANGUL LETTER SSANGPIEUP;Lo;0;L;<narrow> 3143;;;;N;HALFWIDTH HANGUL LETTER SSANG BIEUB;;;; +FFB4;HALFWIDTH HANGUL LETTER PIEUP-SIOS;Lo;0;L;<narrow> 3144;;;;N;HALFWIDTH HANGUL LETTER BIEUB SIOS;;;; +FFB5;HALFWIDTH HANGUL LETTER SIOS;Lo;0;L;<narrow> 3145;;;;N;;;;; +FFB6;HALFWIDTH HANGUL LETTER SSANGSIOS;Lo;0;L;<narrow> 3146;;;;N;HALFWIDTH HANGUL LETTER SSANG SIOS;;;; +FFB7;HALFWIDTH HANGUL LETTER IEUNG;Lo;0;L;<narrow> 3147;;;;N;;;;; +FFB8;HALFWIDTH HANGUL LETTER CIEUC;Lo;0;L;<narrow> 3148;;;;N;HALFWIDTH HANGUL LETTER JIEUJ;;;; +FFB9;HALFWIDTH HANGUL LETTER SSANGCIEUC;Lo;0;L;<narrow> 3149;;;;N;HALFWIDTH HANGUL LETTER SSANG JIEUJ;;;; +FFBA;HALFWIDTH HANGUL LETTER CHIEUCH;Lo;0;L;<narrow> 314A;;;;N;HALFWIDTH HANGUL LETTER CIEUC;;;; +FFBB;HALFWIDTH HANGUL LETTER KHIEUKH;Lo;0;L;<narrow> 314B;;;;N;HALFWIDTH HANGUL LETTER KIYEOK;;;; +FFBC;HALFWIDTH HANGUL LETTER THIEUTH;Lo;0;L;<narrow> 314C;;;;N;HALFWIDTH HANGUL LETTER TIEUT;;;; +FFBD;HALFWIDTH HANGUL LETTER PHIEUPH;Lo;0;L;<narrow> 314D;;;;N;HALFWIDTH HANGUL LETTER PIEUP;;;; +FFBE;HALFWIDTH HANGUL LETTER HIEUH;Lo;0;L;<narrow> 314E;;;;N;;;;; +FFC2;HALFWIDTH HANGUL LETTER A;Lo;0;L;<narrow> 314F;;;;N;;;;; +FFC3;HALFWIDTH HANGUL LETTER AE;Lo;0;L;<narrow> 3150;;;;N;;;;; +FFC4;HALFWIDTH HANGUL LETTER YA;Lo;0;L;<narrow> 3151;;;;N;;;;; +FFC5;HALFWIDTH HANGUL LETTER YAE;Lo;0;L;<narrow> 3152;;;;N;;;;; +FFC6;HALFWIDTH HANGUL LETTER EO;Lo;0;L;<narrow> 3153;;;;N;;;;; +FFC7;HALFWIDTH HANGUL LETTER E;Lo;0;L;<narrow> 3154;;;;N;;;;; +FFCA;HALFWIDTH HANGUL LETTER YEO;Lo;0;L;<narrow> 3155;;;;N;;;;; +FFCB;HALFWIDTH HANGUL LETTER YE;Lo;0;L;<narrow> 3156;;;;N;;;;; +FFCC;HALFWIDTH HANGUL LETTER O;Lo;0;L;<narrow> 3157;;;;N;;;;; +FFCD;HALFWIDTH HANGUL LETTER WA;Lo;0;L;<narrow> 3158;;;;N;;;;; +FFCE;HALFWIDTH HANGUL LETTER WAE;Lo;0;L;<narrow> 3159;;;;N;;;;; +FFCF;HALFWIDTH HANGUL LETTER OE;Lo;0;L;<narrow> 315A;;;;N;;;;; +FFD2;HALFWIDTH HANGUL LETTER YO;Lo;0;L;<narrow> 315B;;;;N;;;;; +FFD3;HALFWIDTH HANGUL LETTER U;Lo;0;L;<narrow> 315C;;;;N;;;;; +FFD4;HALFWIDTH HANGUL LETTER WEO;Lo;0;L;<narrow> 315D;;;;N;;;;; +FFD5;HALFWIDTH HANGUL LETTER WE;Lo;0;L;<narrow> 315E;;;;N;;;;; +FFD6;HALFWIDTH HANGUL LETTER WI;Lo;0;L;<narrow> 315F;;;;N;;;;; +FFD7;HALFWIDTH HANGUL LETTER YU;Lo;0;L;<narrow> 3160;;;;N;;;;; +FFDA;HALFWIDTH HANGUL LETTER EU;Lo;0;L;<narrow> 3161;;;;N;;;;; +FFDB;HALFWIDTH HANGUL LETTER YI;Lo;0;L;<narrow> 3162;;;;N;;;;; +FFDC;HALFWIDTH HANGUL LETTER I;Lo;0;L;<narrow> 3163;;;;N;;;;; +FFE0;FULLWIDTH CENT SIGN;Sc;0;ET;<wide> 00A2;;;;N;;;;; +FFE1;FULLWIDTH POUND SIGN;Sc;0;ET;<wide> 00A3;;;;N;;;;; +FFE2;FULLWIDTH NOT SIGN;Sm;0;ON;<wide> 00AC;;;;N;;;;; +FFE3;FULLWIDTH MACRON;Sk;0;ON;<wide> 00AF;;;;N;FULLWIDTH SPACING MACRON;*;;; +FFE4;FULLWIDTH BROKEN BAR;So;0;ON;<wide> 00A6;;;;N;FULLWIDTH BROKEN VERTICAL BAR;;;; +FFE5;FULLWIDTH YEN SIGN;Sc;0;ET;<wide> 00A5;;;;N;;;;; +FFE6;FULLWIDTH WON SIGN;Sc;0;ET;<wide> 20A9;;;;N;;;;; +FFE8;HALFWIDTH FORMS LIGHT VERTICAL;So;0;ON;<narrow> 2502;;;;N;;;;; +FFE9;HALFWIDTH LEFTWARDS ARROW;Sm;0;ON;<narrow> 2190;;;;N;;;;; +FFEA;HALFWIDTH UPWARDS ARROW;Sm;0;ON;<narrow> 2191;;;;N;;;;; +FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON;<narrow> 2192;;;;N;;;;; +FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON;<narrow> 2193;;;;N;;;;; +FFED;HALFWIDTH BLACK SQUARE;So;0;ON;<narrow> 25A0;;;;N;;;;; +FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON;<narrow> 25CB;;;;N;;;;; +FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;BN;;;;;N;;;;; +FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;BN;;;;;N;;;;; +FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;BN;;;;;N;;;;; +FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; +FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; +10300;OLD ITALIC LETTER A;Lo;0;L;;;;;N;;;;; +10301;OLD ITALIC LETTER BE;Lo;0;L;;;;;N;;;;; +10302;OLD ITALIC LETTER KE;Lo;0;L;;;;;N;;;;; +10303;OLD ITALIC LETTER DE;Lo;0;L;;;;;N;;;;; +10304;OLD ITALIC LETTER E;Lo;0;L;;;;;N;;;;; +10305;OLD ITALIC LETTER VE;Lo;0;L;;;;;N;;;;; +10306;OLD ITALIC LETTER ZE;Lo;0;L;;;;;N;;;;; +10307;OLD ITALIC LETTER HE;Lo;0;L;;;;;N;;;;; +10308;OLD ITALIC LETTER THE;Lo;0;L;;;;;N;;;;; +10309;OLD ITALIC LETTER I;Lo;0;L;;;;;N;;;;; +1030A;OLD ITALIC LETTER KA;Lo;0;L;;;;;N;;;;; +1030B;OLD ITALIC LETTER EL;Lo;0;L;;;;;N;;;;; +1030C;OLD ITALIC LETTER EM;Lo;0;L;;;;;N;;;;; +1030D;OLD ITALIC LETTER EN;Lo;0;L;;;;;N;;;;; +1030E;OLD ITALIC LETTER ESH;Lo;0;L;;;;;N;;;;; +1030F;OLD ITALIC LETTER O;Lo;0;L;;;;;N;;Faliscan;;; +10310;OLD ITALIC LETTER PE;Lo;0;L;;;;;N;;;;; +10311;OLD ITALIC LETTER SHE;Lo;0;L;;;;;N;;;;; +10312;OLD ITALIC LETTER KU;Lo;0;L;;;;;N;;;;; +10313;OLD ITALIC LETTER ER;Lo;0;L;;;;;N;;;;; +10314;OLD ITALIC LETTER ES;Lo;0;L;;;;;N;;;;; +10315;OLD ITALIC LETTER TE;Lo;0;L;;;;;N;;;;; +10316;OLD ITALIC LETTER U;Lo;0;L;;;;;N;;;;; +10317;OLD ITALIC LETTER EKS;Lo;0;L;;;;;N;;Faliscan;;; +10318;OLD ITALIC LETTER PHE;Lo;0;L;;;;;N;;;;; +10319;OLD ITALIC LETTER KHE;Lo;0;L;;;;;N;;;;; +1031A;OLD ITALIC LETTER EF;Lo;0;L;;;;;N;;;;; +1031B;OLD ITALIC LETTER ERS;Lo;0;L;;;;;N;;Umbrian;;; +1031C;OLD ITALIC LETTER CHE;Lo;0;L;;;;;N;;Umbrian;;; +1031D;OLD ITALIC LETTER II;Lo;0;L;;;;;N;;Oscan;;; +1031E;OLD ITALIC LETTER UU;Lo;0;L;;;;;N;;Oscan;;; +10320;OLD ITALIC NUMERAL ONE;No;0;L;;;;1;N;;;;; +10321;OLD ITALIC NUMERAL FIVE;No;0;L;;;;5;N;;;;; +10322;OLD ITALIC NUMERAL TEN;No;0;L;;;;10;N;;;;; +10323;OLD ITALIC NUMERAL FIFTY;No;0;L;;;;50;N;;;;; +10330;GOTHIC LETTER AHSA;Lo;0;L;;;;;N;;;;; +10331;GOTHIC LETTER BAIRKAN;Lo;0;L;;;;;N;;;;; +10332;GOTHIC LETTER GIBA;Lo;0;L;;;;;N;;;;; +10333;GOTHIC LETTER DAGS;Lo;0;L;;;;;N;;;;; +10334;GOTHIC LETTER AIHVUS;Lo;0;L;;;;;N;;;;; +10335;GOTHIC LETTER QAIRTHRA;Lo;0;L;;;;;N;;;;; +10336;GOTHIC LETTER IUJA;Lo;0;L;;;;;N;;;;; +10337;GOTHIC LETTER HAGL;Lo;0;L;;;;;N;;;;; +10338;GOTHIC LETTER THIUTH;Lo;0;L;;;;;N;;;;; +10339;GOTHIC LETTER EIS;Lo;0;L;;;;;N;;;;; +1033A;GOTHIC LETTER KUSMA;Lo;0;L;;;;;N;;;;; +1033B;GOTHIC LETTER LAGUS;Lo;0;L;;;;;N;;;;; +1033C;GOTHIC LETTER MANNA;Lo;0;L;;;;;N;;;;; +1033D;GOTHIC LETTER NAUTHS;Lo;0;L;;;;;N;;;;; +1033E;GOTHIC LETTER JER;Lo;0;L;;;;;N;;;;; +1033F;GOTHIC LETTER URUS;Lo;0;L;;;;;N;;;;; +10340;GOTHIC LETTER PAIRTHRA;Lo;0;L;;;;;N;;;;; +10341;GOTHIC LETTER NINETY;Lo;0;L;;;;;N;;;;; +10342;GOTHIC LETTER RAIDA;Lo;0;L;;;;;N;;;;; +10343;GOTHIC LETTER SAUIL;Lo;0;L;;;;;N;;;;; +10344;GOTHIC LETTER TEIWS;Lo;0;L;;;;;N;;;;; +10345;GOTHIC LETTER WINJA;Lo;0;L;;;;;N;;;;; +10346;GOTHIC LETTER FAIHU;Lo;0;L;;;;;N;;;;; +10347;GOTHIC LETTER IGGWS;Lo;0;L;;;;;N;;;;; +10348;GOTHIC LETTER HWAIR;Lo;0;L;;;;;N;;;;; +10349;GOTHIC LETTER OTHAL;Lo;0;L;;;;;N;;;;; +1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;;N;;;;; +10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428; +10401;DESERET CAPITAL LETTER LONG E;Lu;0;L;;;;;N;;;;10429; +10402;DESERET CAPITAL LETTER LONG A;Lu;0;L;;;;;N;;;;1042A; +10403;DESERET CAPITAL LETTER LONG AH;Lu;0;L;;;;;N;;;;1042B; +10404;DESERET CAPITAL LETTER LONG O;Lu;0;L;;;;;N;;;;1042C; +10405;DESERET CAPITAL LETTER LONG OO;Lu;0;L;;;;;N;;;;1042D; +10406;DESERET CAPITAL LETTER SHORT I;Lu;0;L;;;;;N;;;;1042E; +10407;DESERET CAPITAL LETTER SHORT E;Lu;0;L;;;;;N;;;;1042F; +10408;DESERET CAPITAL LETTER SHORT A;Lu;0;L;;;;;N;;;;10430; +10409;DESERET CAPITAL LETTER SHORT AH;Lu;0;L;;;;;N;;;;10431; +1040A;DESERET CAPITAL LETTER SHORT O;Lu;0;L;;;;;N;;;;10432; +1040B;DESERET CAPITAL LETTER SHORT OO;Lu;0;L;;;;;N;;;;10433; +1040C;DESERET CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;10434; +1040D;DESERET CAPITAL LETTER OW;Lu;0;L;;;;;N;;;;10435; +1040E;DESERET CAPITAL LETTER WU;Lu;0;L;;;;;N;;;;10436; +1040F;DESERET CAPITAL LETTER YEE;Lu;0;L;;;;;N;;;;10437; +10410;DESERET CAPITAL LETTER H;Lu;0;L;;;;;N;;;;10438; +10411;DESERET CAPITAL LETTER PEE;Lu;0;L;;;;;N;;;;10439; +10412;DESERET CAPITAL LETTER BEE;Lu;0;L;;;;;N;;;;1043A; +10413;DESERET CAPITAL LETTER TEE;Lu;0;L;;;;;N;;;;1043B; +10414;DESERET CAPITAL LETTER DEE;Lu;0;L;;;;;N;;;;1043C; +10415;DESERET CAPITAL LETTER CHEE;Lu;0;L;;;;;N;;;;1043D; +10416;DESERET CAPITAL LETTER JEE;Lu;0;L;;;;;N;;;;1043E; +10417;DESERET CAPITAL LETTER KAY;Lu;0;L;;;;;N;;;;1043F; +10418;DESERET CAPITAL LETTER GAY;Lu;0;L;;;;;N;;;;10440; +10419;DESERET CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;10441; +1041A;DESERET CAPITAL LETTER VEE;Lu;0;L;;;;;N;;;;10442; +1041B;DESERET CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;10443; +1041C;DESERET CAPITAL LETTER THEE;Lu;0;L;;;;;N;;;;10444; +1041D;DESERET CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;10445; +1041E;DESERET CAPITAL LETTER ZEE;Lu;0;L;;;;;N;;;;10446; +1041F;DESERET CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;10447; +10420;DESERET CAPITAL LETTER ZHEE;Lu;0;L;;;;;N;;;;10448; +10421;DESERET CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;10449; +10422;DESERET CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;1044A; +10423;DESERET CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;1044B; +10424;DESERET CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;1044C; +10425;DESERET CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;1044D; +10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400 +10429;DESERET SMALL LETTER LONG E;Ll;0;L;;;;;N;;;10401;;10401 +1042A;DESERET SMALL LETTER LONG A;Ll;0;L;;;;;N;;;10402;;10402 +1042B;DESERET SMALL LETTER LONG AH;Ll;0;L;;;;;N;;;10403;;10403 +1042C;DESERET SMALL LETTER LONG O;Ll;0;L;;;;;N;;;10404;;10404 +1042D;DESERET SMALL LETTER LONG OO;Ll;0;L;;;;;N;;;10405;;10405 +1042E;DESERET SMALL LETTER SHORT I;Ll;0;L;;;;;N;;;10406;;10406 +1042F;DESERET SMALL LETTER SHORT E;Ll;0;L;;;;;N;;;10407;;10407 +10430;DESERET SMALL LETTER SHORT A;Ll;0;L;;;;;N;;;10408;;10408 +10431;DESERET SMALL LETTER SHORT AH;Ll;0;L;;;;;N;;;10409;;10409 +10432;DESERET SMALL LETTER SHORT O;Ll;0;L;;;;;N;;;1040A;;1040A +10433;DESERET SMALL LETTER SHORT OO;Ll;0;L;;;;;N;;;1040B;;1040B +10434;DESERET SMALL LETTER AY;Ll;0;L;;;;;N;;;1040C;;1040C +10435;DESERET SMALL LETTER OW;Ll;0;L;;;;;N;;;1040D;;1040D +10436;DESERET SMALL LETTER WU;Ll;0;L;;;;;N;;;1040E;;1040E +10437;DESERET SMALL LETTER YEE;Ll;0;L;;;;;N;;;1040F;;1040F +10438;DESERET SMALL LETTER H;Ll;0;L;;;;;N;;;10410;;10410 +10439;DESERET SMALL LETTER PEE;Ll;0;L;;;;;N;;;10411;;10411 +1043A;DESERET SMALL LETTER BEE;Ll;0;L;;;;;N;;;10412;;10412 +1043B;DESERET SMALL LETTER TEE;Ll;0;L;;;;;N;;;10413;;10413 +1043C;DESERET SMALL LETTER DEE;Ll;0;L;;;;;N;;;10414;;10414 +1043D;DESERET SMALL LETTER CHEE;Ll;0;L;;;;;N;;;10415;;10415 +1043E;DESERET SMALL LETTER JEE;Ll;0;L;;;;;N;;;10416;;10416 +1043F;DESERET SMALL LETTER KAY;Ll;0;L;;;;;N;;;10417;;10417 +10440;DESERET SMALL LETTER GAY;Ll;0;L;;;;;N;;;10418;;10418 +10441;DESERET SMALL LETTER EF;Ll;0;L;;;;;N;;;10419;;10419 +10442;DESERET SMALL LETTER VEE;Ll;0;L;;;;;N;;;1041A;;1041A +10443;DESERET SMALL LETTER ETH;Ll;0;L;;;;;N;;;1041B;;1041B +10444;DESERET SMALL LETTER THEE;Ll;0;L;;;;;N;;;1041C;;1041C +10445;DESERET SMALL LETTER ES;Ll;0;L;;;;;N;;;1041D;;1041D +10446;DESERET SMALL LETTER ZEE;Ll;0;L;;;;;N;;;1041E;;1041E +10447;DESERET SMALL LETTER ESH;Ll;0;L;;;;;N;;;1041F;;1041F +10448;DESERET SMALL LETTER ZHEE;Ll;0;L;;;;;N;;;10420;;10420 +10449;DESERET SMALL LETTER ER;Ll;0;L;;;;;N;;;10421;;10421 +1044A;DESERET SMALL LETTER EL;Ll;0;L;;;;;N;;;10422;;10422 +1044B;DESERET SMALL LETTER EM;Ll;0;L;;;;;N;;;10423;;10423 +1044C;DESERET SMALL LETTER EN;Ll;0;L;;;;;N;;;10424;;10424 +1044D;DESERET SMALL LETTER ENG;Ll;0;L;;;;;N;;;10425;;10425 +1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;; +1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;; +1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;; +1D003;BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON;So;0;L;;;;;N;;;;; +1D004;BYZANTINE MUSICAL SYMBOL OXEIA DIPLI;So;0;L;;;;;N;;;;; +1D005;BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON;So;0;L;;;;;N;;;;; +1D006;BYZANTINE MUSICAL SYMBOL VAREIA DIPLI;So;0;L;;;;;N;;;;; +1D007;BYZANTINE MUSICAL SYMBOL KATHISTI;So;0;L;;;;;N;;;;; +1D008;BYZANTINE MUSICAL SYMBOL SYRMATIKI;So;0;L;;;;;N;;;;; +1D009;BYZANTINE MUSICAL SYMBOL PARAKLITIKI;So;0;L;;;;;N;;;;; +1D00A;BYZANTINE MUSICAL SYMBOL YPOKRISIS;So;0;L;;;;;N;;;;; +1D00B;BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI;So;0;L;;;;;N;;;;; +1D00C;BYZANTINE MUSICAL SYMBOL KREMASTI;So;0;L;;;;;N;;;;; +1D00D;BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON;So;0;L;;;;;N;;;;; +1D00E;BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON;So;0;L;;;;;N;;;;; +1D00F;BYZANTINE MUSICAL SYMBOL TELEIA;So;0;L;;;;;N;;;;; +1D010;BYZANTINE MUSICAL SYMBOL KENTIMATA;So;0;L;;;;;N;;;;; +1D011;BYZANTINE MUSICAL SYMBOL APOSTROFOS;So;0;L;;;;;N;;;;; +1D012;BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI;So;0;L;;;;;N;;;;; +1D013;BYZANTINE MUSICAL SYMBOL SYNEVMA;So;0;L;;;;;N;;;;; +1D014;BYZANTINE MUSICAL SYMBOL THITA;So;0;L;;;;;N;;;;; +1D015;BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION;So;0;L;;;;;N;;;;; +1D016;BYZANTINE MUSICAL SYMBOL GORGON ARCHAION;So;0;L;;;;;N;;;;; +1D017;BYZANTINE MUSICAL SYMBOL PSILON;So;0;L;;;;;N;;;;; +1D018;BYZANTINE MUSICAL SYMBOL CHAMILON;So;0;L;;;;;N;;;;; +1D019;BYZANTINE MUSICAL SYMBOL VATHY;So;0;L;;;;;N;;;;; +1D01A;BYZANTINE MUSICAL SYMBOL ISON ARCHAION;So;0;L;;;;;N;;;;; +1D01B;BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION;So;0;L;;;;;N;;;;; +1D01C;BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION;So;0;L;;;;;N;;;;; +1D01D;BYZANTINE MUSICAL SYMBOL SAXIMATA;So;0;L;;;;;N;;;;; +1D01E;BYZANTINE MUSICAL SYMBOL PARICHON;So;0;L;;;;;N;;;;; +1D01F;BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA;So;0;L;;;;;N;;;;; +1D020;BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION;So;0;L;;;;;N;;;;; +1D021;BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION;So;0;L;;;;;N;;;;; +1D022;BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION;So;0;L;;;;;N;;;;; +1D023;BYZANTINE MUSICAL SYMBOL APOTHEMA;So;0;L;;;;;N;;;;; +1D024;BYZANTINE MUSICAL SYMBOL KLASMA;So;0;L;;;;;N;;;;; +1D025;BYZANTINE MUSICAL SYMBOL REVMA;So;0;L;;;;;N;;;;; +1D026;BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION;So;0;L;;;;;N;;;;; +1D027;BYZANTINE MUSICAL SYMBOL TINAGMA;So;0;L;;;;;N;;;;; +1D028;BYZANTINE MUSICAL SYMBOL ANATRICHISMA;So;0;L;;;;;N;;;;; +1D029;BYZANTINE MUSICAL SYMBOL SEISMA;So;0;L;;;;;N;;;;; +1D02A;BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION;So;0;L;;;;;N;;;;; +1D02B;BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU;So;0;L;;;;;N;;;;; +1D02C;BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION;So;0;L;;;;;N;;;;; +1D02D;BYZANTINE MUSICAL SYMBOL THEMA;So;0;L;;;;;N;;;;; +1D02E;BYZANTINE MUSICAL SYMBOL LEMOI;So;0;L;;;;;N;;;;; +1D02F;BYZANTINE MUSICAL SYMBOL DYO;So;0;L;;;;;N;;;;; +1D030;BYZANTINE MUSICAL SYMBOL TRIA;So;0;L;;;;;N;;;;; +1D031;BYZANTINE MUSICAL SYMBOL TESSERA;So;0;L;;;;;N;;;;; +1D032;BYZANTINE MUSICAL SYMBOL KRATIMATA;So;0;L;;;;;N;;;;; +1D033;BYZANTINE MUSICAL SYMBOL APESO EXO NEO;So;0;L;;;;;N;;;;; +1D034;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION;So;0;L;;;;;N;;;;; +1D035;BYZANTINE MUSICAL SYMBOL IMIFTHORA;So;0;L;;;;;N;;;;; +1D036;BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION;So;0;L;;;;;N;;;;; +1D037;BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON;So;0;L;;;;;N;;;;; +1D038;BYZANTINE MUSICAL SYMBOL PELASTON;So;0;L;;;;;N;;;;; +1D039;BYZANTINE MUSICAL SYMBOL PSIFISTON;So;0;L;;;;;N;;;;; +1D03A;BYZANTINE MUSICAL SYMBOL KONTEVMA;So;0;L;;;;;N;;;;; +1D03B;BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION;So;0;L;;;;;N;;;;; +1D03C;BYZANTINE MUSICAL SYMBOL RAPISMA;So;0;L;;;;;N;;;;; +1D03D;BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION;So;0;L;;;;;N;;;;; +1D03E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION;So;0;L;;;;;N;;;;; +1D03F;BYZANTINE MUSICAL SYMBOL ICHADIN;So;0;L;;;;;N;;;;; +1D040;BYZANTINE MUSICAL SYMBOL NANA;So;0;L;;;;;N;;;;; +1D041;BYZANTINE MUSICAL SYMBOL PETASMA;So;0;L;;;;;N;;;;; +1D042;BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO;So;0;L;;;;;N;;;;; +1D043;BYZANTINE MUSICAL SYMBOL TROMIKON ALLO;So;0;L;;;;;N;;;;; +1D044;BYZANTINE MUSICAL SYMBOL STRAGGISMATA;So;0;L;;;;;N;;;;; +1D045;BYZANTINE MUSICAL SYMBOL GRONTHISMATA;So;0;L;;;;;N;;;;; +1D046;BYZANTINE MUSICAL SYMBOL ISON NEO;So;0;L;;;;;N;;;;; +1D047;BYZANTINE MUSICAL SYMBOL OLIGON NEO;So;0;L;;;;;N;;;;; +1D048;BYZANTINE MUSICAL SYMBOL OXEIA NEO;So;0;L;;;;;N;;;;; +1D049;BYZANTINE MUSICAL SYMBOL PETASTI;So;0;L;;;;;N;;;;; +1D04A;BYZANTINE MUSICAL SYMBOL KOUFISMA;So;0;L;;;;;N;;;;; +1D04B;BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA;So;0;L;;;;;N;;;;; +1D04C;BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA;So;0;L;;;;;N;;;;; +1D04D;BYZANTINE MUSICAL SYMBOL PELASTON NEO;So;0;L;;;;;N;;;;; +1D04E;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO;So;0;L;;;;;N;;;;; +1D04F;BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO;So;0;L;;;;;N;;;;; +1D050;BYZANTINE MUSICAL SYMBOL YPSILI;So;0;L;;;;;N;;;;; +1D051;BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO;So;0;L;;;;;N;;;;; +1D052;BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO;So;0;L;;;;;N;;;;; +1D053;BYZANTINE MUSICAL SYMBOL YPORROI;So;0;L;;;;;N;;;;; +1D054;BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON;So;0;L;;;;;N;;;;; +1D055;BYZANTINE MUSICAL SYMBOL ELAFRON;So;0;L;;;;;N;;;;; +1D056;BYZANTINE MUSICAL SYMBOL CHAMILI;So;0;L;;;;;N;;;;; +1D057;BYZANTINE MUSICAL SYMBOL MIKRON ISON;So;0;L;;;;;N;;;;; +1D058;BYZANTINE MUSICAL SYMBOL VAREIA NEO;So;0;L;;;;;N;;;;; +1D059;BYZANTINE MUSICAL SYMBOL PIASMA NEO;So;0;L;;;;;N;;;;; +1D05A;BYZANTINE MUSICAL SYMBOL PSIFISTON NEO;So;0;L;;;;;N;;;;; +1D05B;BYZANTINE MUSICAL SYMBOL OMALON;So;0;L;;;;;N;;;;; +1D05C;BYZANTINE MUSICAL SYMBOL ANTIKENOMA;So;0;L;;;;;N;;;;; +1D05D;BYZANTINE MUSICAL SYMBOL LYGISMA;So;0;L;;;;;N;;;;; +1D05E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO;So;0;L;;;;;N;;;;; +1D05F;BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO;So;0;L;;;;;N;;;;; +1D060;BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA;So;0;L;;;;;N;;;;; +1D061;BYZANTINE MUSICAL SYMBOL KYLISMA;So;0;L;;;;;N;;;;; +1D062;BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA;So;0;L;;;;;N;;;;; +1D063;BYZANTINE MUSICAL SYMBOL TROMIKON NEO;So;0;L;;;;;N;;;;; +1D064;BYZANTINE MUSICAL SYMBOL EKSTREPTON;So;0;L;;;;;N;;;;; +1D065;BYZANTINE MUSICAL SYMBOL SYNAGMA NEO;So;0;L;;;;;N;;;;; +1D066;BYZANTINE MUSICAL SYMBOL SYRMA;So;0;L;;;;;N;;;;; +1D067;BYZANTINE MUSICAL SYMBOL CHOREVMA NEO;So;0;L;;;;;N;;;;; +1D068;BYZANTINE MUSICAL SYMBOL EPEGERMA;So;0;L;;;;;N;;;;; +1D069;BYZANTINE MUSICAL SYMBOL SEISMA NEO;So;0;L;;;;;N;;;;; +1D06A;BYZANTINE MUSICAL SYMBOL XIRON KLASMA;So;0;L;;;;;N;;;;; +1D06B;BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON;So;0;L;;;;;N;;;;; +1D06C;BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA;So;0;L;;;;;N;;;;; +1D06D;BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA;So;0;L;;;;;N;;;;; +1D06E;BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA;So;0;L;;;;;N;;;;; +1D06F;BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA;So;0;L;;;;;N;;;;; +1D070;BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA;So;0;L;;;;;N;;;;; +1D071;BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA;So;0;L;;;;;N;;;;; +1D072;BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON;So;0;L;;;;;N;;;;; +1D073;BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON;So;0;L;;;;;N;;;;; +1D074;BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON;So;0;L;;;;;N;;;;; +1D075;BYZANTINE MUSICAL SYMBOL OYRANISMA NEO;So;0;L;;;;;N;;;;; +1D076;BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO;So;0;L;;;;;N;;;;; +1D077;BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO;So;0;L;;;;;N;;;;; +1D078;BYZANTINE MUSICAL SYMBOL THEMA APLOUN;So;0;L;;;;;N;;;;; +1D079;BYZANTINE MUSICAL SYMBOL THES KAI APOTHES;So;0;L;;;;;N;;;;; +1D07A;BYZANTINE MUSICAL SYMBOL KATAVASMA;So;0;L;;;;;N;;;;; +1D07B;BYZANTINE MUSICAL SYMBOL ENDOFONON;So;0;L;;;;;N;;;;; +1D07C;BYZANTINE MUSICAL SYMBOL YFEN KATO;So;0;L;;;;;N;;;;; +1D07D;BYZANTINE MUSICAL SYMBOL YFEN ANO;So;0;L;;;;;N;;;;; +1D07E;BYZANTINE MUSICAL SYMBOL STAVROS;So;0;L;;;;;N;;;;; +1D07F;BYZANTINE MUSICAL SYMBOL KLASMA ANO;So;0;L;;;;;N;;;;; +1D080;BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION;So;0;L;;;;;N;;;;; +1D081;BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION;So;0;L;;;;;N;;;;; +1D082;BYZANTINE MUSICAL SYMBOL KRATIMA ALLO;So;0;L;;;;;N;;;;; +1D083;BYZANTINE MUSICAL SYMBOL KRATIMA NEO;So;0;L;;;;;N;;;;; +1D084;BYZANTINE MUSICAL SYMBOL APODERMA NEO;So;0;L;;;;;N;;;;; +1D085;BYZANTINE MUSICAL SYMBOL APLI;So;0;L;;;;;N;;;;; +1D086;BYZANTINE MUSICAL SYMBOL DIPLI;So;0;L;;;;;N;;;;; +1D087;BYZANTINE MUSICAL SYMBOL TRIPLI;So;0;L;;;;;N;;;;; +1D088;BYZANTINE MUSICAL SYMBOL TETRAPLI;So;0;L;;;;;N;;;;; +1D089;BYZANTINE MUSICAL SYMBOL KORONIS;So;0;L;;;;;N;;;;; +1D08A;BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU;So;0;L;;;;;N;;;;; +1D08B;BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON;So;0;L;;;;;N;;;;; +1D08C;BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON;So;0;L;;;;;N;;;;; +1D08D;BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON;So;0;L;;;;;N;;;;; +1D08E;BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU;So;0;L;;;;;N;;;;; +1D08F;BYZANTINE MUSICAL SYMBOL GORGON NEO ANO;So;0;L;;;;;N;;;;; +1D090;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA;So;0;L;;;;;N;;;;; +1D091;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; +1D092;BYZANTINE MUSICAL SYMBOL DIGORGON;So;0;L;;;;;N;;;;; +1D093;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO;So;0;L;;;;;N;;;;; +1D094;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO;So;0;L;;;;;N;;;;; +1D095;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; +1D096;BYZANTINE MUSICAL SYMBOL TRIGORGON;So;0;L;;;;;N;;;;; +1D097;BYZANTINE MUSICAL SYMBOL ARGON;So;0;L;;;;;N;;;;; +1D098;BYZANTINE MUSICAL SYMBOL IMIDIARGON;So;0;L;;;;;N;;;;; +1D099;BYZANTINE MUSICAL SYMBOL DIARGON;So;0;L;;;;;N;;;;; +1D09A;BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI;So;0;L;;;;;N;;;;; +1D09B;BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI;So;0;L;;;;;N;;;;; +1D09C;BYZANTINE MUSICAL SYMBOL AGOGI ARGI;So;0;L;;;;;N;;;;; +1D09D;BYZANTINE MUSICAL SYMBOL AGOGI METRIA;So;0;L;;;;;N;;;;; +1D09E;BYZANTINE MUSICAL SYMBOL AGOGI MESI;So;0;L;;;;;N;;;;; +1D09F;BYZANTINE MUSICAL SYMBOL AGOGI GORGI;So;0;L;;;;;N;;;;; +1D0A0;BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI;So;0;L;;;;;N;;;;; +1D0A1;BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI;So;0;L;;;;;N;;;;; +1D0A2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A3;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A4;BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS;So;0;L;;;;;N;;;;; +1D0A5;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS;So;0;L;;;;;N;;;;; +1D0A6;BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS;So;0;L;;;;;N;;;;; +1D0A7;BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS;So;0;L;;;;;N;;;;; +1D0A8;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A9;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS;So;0;L;;;;;N;;;;; +1D0AA;BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS;So;0;L;;;;;N;;;;; +1D0AB;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS;So;0;L;;;;;N;;;;; +1D0AC;BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; +1D0AD;BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; +1D0AE;BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS;So;0;L;;;;;N;;;;; +1D0AF;BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS;So;0;L;;;;;N;;;;; +1D0B0;BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS;So;0;L;;;;;N;;;;; +1D0B1;BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS;So;0;L;;;;;N;;;;; +1D0B2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS;So;0;L;;;;;N;;;;; +1D0B3;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS;So;0;L;;;;;N;;;;; +1D0B4;BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN;So;0;L;;;;;N;;;;; +1D0B5;BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN;So;0;L;;;;;N;;;;; +1D0B6;BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU;So;0;L;;;;;N;;;;; +1D0B7;BYZANTINE MUSICAL SYMBOL IMIFONON;So;0;L;;;;;N;;;;; +1D0B8;BYZANTINE MUSICAL SYMBOL IMIFTHORON;So;0;L;;;;;N;;;;; +1D0B9;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU;So;0;L;;;;;N;;;;; +1D0BA;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA;So;0;L;;;;;N;;;;; +1D0BB;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA;So;0;L;;;;;N;;;;; +1D0BC;BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS;So;0;L;;;;;N;;;;; +1D0BD;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI;So;0;L;;;;;N;;;;; +1D0BE;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI;So;0;L;;;;;N;;;;; +1D0BF;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE;So;0;L;;;;;N;;;;; +1D0C0;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO;So;0;L;;;;;N;;;;; +1D0C1;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO;So;0;L;;;;;N;;;;; +1D0C2;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO;So;0;L;;;;;N;;;;; +1D0C3;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS;So;0;L;;;;;N;;;;; +1D0C4;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS;So;0;L;;;;;N;;;;; +1D0C5;BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS;So;0;L;;;;;N;;;;; +1D0C6;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI;So;0;L;;;;;N;;;;; +1D0C7;BYZANTINE MUSICAL SYMBOL FTHORA NENANO;So;0;L;;;;;N;;;;; +1D0C8;BYZANTINE MUSICAL SYMBOL CHROA ZYGOS;So;0;L;;;;;N;;;;; +1D0C9;BYZANTINE MUSICAL SYMBOL CHROA KLITON;So;0;L;;;;;N;;;;; +1D0CA;BYZANTINE MUSICAL SYMBOL CHROA SPATHI;So;0;L;;;;;N;;;;; +1D0CB;BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION;So;0;L;;;;;N;;;;; +1D0CC;BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA;So;0;L;;;;;N;;;;; +1D0CD;BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION;So;0;L;;;;;N;;;;; +1D0CE;BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION;So;0;L;;;;;N;;;;; +1D0CF;BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION;So;0;L;;;;;N;;;;; +1D0D0;BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; +1D0D1;BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; +1D0D2;BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; +1D0D3;BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; +1D0D4;BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; +1D0D5;BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; +1D0D6;BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; +1D0D7;BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; +1D0D8;BYZANTINE MUSICAL SYMBOL GENIKI DIESIS;So;0;L;;;;;N;;;;; +1D0D9;BYZANTINE MUSICAL SYMBOL GENIKI YFESIS;So;0;L;;;;;N;;;;; +1D0DA;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI;So;0;L;;;;;N;;;;; +1D0DB;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI;So;0;L;;;;;N;;;;; +1D0DC;BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI;So;0;L;;;;;N;;;;; +1D0DD;BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS;So;0;L;;;;;N;;;;; +1D0DE;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS;So;0;L;;;;;N;;;;; +1D0DF;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU;So;0;L;;;;;N;;;;; +1D0E0;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU;So;0;L;;;;;N;;;;; +1D0E1;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU;So;0;L;;;;;N;;;;; +1D0E2;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS;So;0;L;;;;;N;;;;; +1D0E3;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU;So;0;L;;;;;N;;;;; +1D0E4;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU;So;0;L;;;;;N;;;;; +1D0E5;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU;So;0;L;;;;;N;;;;; +1D0E6;BYZANTINE MUSICAL SYMBOL DIGRAMMA GG;So;0;L;;;;;N;;;;; +1D0E7;BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU;So;0;L;;;;;N;;;;; +1D0E8;BYZANTINE MUSICAL SYMBOL STIGMA;So;0;L;;;;;N;;;;; +1D0E9;BYZANTINE MUSICAL SYMBOL ARKTIKO PA;So;0;L;;;;;N;;;;; +1D0EA;BYZANTINE MUSICAL SYMBOL ARKTIKO VOU;So;0;L;;;;;N;;;;; +1D0EB;BYZANTINE MUSICAL SYMBOL ARKTIKO GA;So;0;L;;;;;N;;;;; +1D0EC;BYZANTINE MUSICAL SYMBOL ARKTIKO DI;So;0;L;;;;;N;;;;; +1D0ED;BYZANTINE MUSICAL SYMBOL ARKTIKO KE;So;0;L;;;;;N;;;;; +1D0EE;BYZANTINE MUSICAL SYMBOL ARKTIKO ZO;So;0;L;;;;;N;;;;; +1D0EF;BYZANTINE MUSICAL SYMBOL ARKTIKO NI;So;0;L;;;;;N;;;;; +1D0F0;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO;So;0;L;;;;;N;;;;; +1D0F1;BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO;So;0;L;;;;;N;;;;; +1D0F2;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO;So;0;L;;;;;N;;;;; +1D0F3;BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO;So;0;L;;;;;N;;;;; +1D0F4;BYZANTINE MUSICAL SYMBOL KLASMA KATO;So;0;L;;;;;N;;;;; +1D0F5;BYZANTINE MUSICAL SYMBOL GORGON NEO KATO;So;0;L;;;;;N;;;;; +1D100;MUSICAL SYMBOL SINGLE BARLINE;So;0;L;;;;;N;;;;; +1D101;MUSICAL SYMBOL DOUBLE BARLINE;So;0;L;;;;;N;;;;; +1D102;MUSICAL SYMBOL FINAL BARLINE;So;0;L;;;;;N;;;;; +1D103;MUSICAL SYMBOL REVERSE FINAL BARLINE;So;0;L;;;;;N;;;;; +1D104;MUSICAL SYMBOL DASHED BARLINE;So;0;L;;;;;N;;;;; +1D105;MUSICAL SYMBOL SHORT BARLINE;So;0;L;;;;;N;;;;; +1D106;MUSICAL SYMBOL LEFT REPEAT SIGN;So;0;L;;;;;N;;;;; +1D107;MUSICAL SYMBOL RIGHT REPEAT SIGN;So;0;L;;;;;N;;;;; +1D108;MUSICAL SYMBOL REPEAT DOTS;So;0;L;;;;;N;;;;; +1D109;MUSICAL SYMBOL DAL SEGNO;So;0;L;;;;;N;;;;; +1D10A;MUSICAL SYMBOL DA CAPO;So;0;L;;;;;N;;;;; +1D10B;MUSICAL SYMBOL SEGNO;So;0;L;;;;;N;;;;; +1D10C;MUSICAL SYMBOL CODA;So;0;L;;;;;N;;;;; +1D10D;MUSICAL SYMBOL REPEATED FIGURE-1;So;0;L;;;;;N;;;;; +1D10E;MUSICAL SYMBOL REPEATED FIGURE-2;So;0;L;;;;;N;;;;; +1D10F;MUSICAL SYMBOL REPEATED FIGURE-3;So;0;L;;;;;N;;;;; +1D110;MUSICAL SYMBOL FERMATA;So;0;L;;;;;N;;;;; +1D111;MUSICAL SYMBOL FERMATA BELOW;So;0;L;;;;;N;;;;; +1D112;MUSICAL SYMBOL BREATH MARK;So;0;L;;;;;N;;;;; +1D113;MUSICAL SYMBOL CAESURA;So;0;L;;;;;N;;;;; +1D114;MUSICAL SYMBOL BRACE;So;0;L;;;;;N;;;;; +1D115;MUSICAL SYMBOL BRACKET;So;0;L;;;;;N;;;;; +1D116;MUSICAL SYMBOL ONE-LINE STAFF;So;0;L;;;;;N;;;;; +1D117;MUSICAL SYMBOL TWO-LINE STAFF;So;0;L;;;;;N;;;;; +1D118;MUSICAL SYMBOL THREE-LINE STAFF;So;0;L;;;;;N;;;;; +1D119;MUSICAL SYMBOL FOUR-LINE STAFF;So;0;L;;;;;N;;;;; +1D11A;MUSICAL SYMBOL FIVE-LINE STAFF;So;0;L;;;;;N;;;;; +1D11B;MUSICAL SYMBOL SIX-LINE STAFF;So;0;L;;;;;N;;;;; +1D11C;MUSICAL SYMBOL SIX-STRING FRETBOARD;So;0;L;;;;;N;;;;; +1D11D;MUSICAL SYMBOL FOUR-STRING FRETBOARD;So;0;L;;;;;N;;;;; +1D11E;MUSICAL SYMBOL G CLEF;So;0;L;;;;;N;;;;; +1D11F;MUSICAL SYMBOL G CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D120;MUSICAL SYMBOL G CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D121;MUSICAL SYMBOL C CLEF;So;0;L;;;;;N;;;;; +1D122;MUSICAL SYMBOL F CLEF;So;0;L;;;;;N;;;;; +1D123;MUSICAL SYMBOL F CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D124;MUSICAL SYMBOL F CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D125;MUSICAL SYMBOL DRUM CLEF-1;So;0;L;;;;;N;;;;; +1D126;MUSICAL SYMBOL DRUM CLEF-2;So;0;L;;;;;N;;;;; +1D12A;MUSICAL SYMBOL DOUBLE SHARP;So;0;L;;;;;N;;;;; +1D12B;MUSICAL SYMBOL DOUBLE FLAT;So;0;L;;;;;N;;;;; +1D12C;MUSICAL SYMBOL FLAT UP;So;0;L;;;;;N;;;;; +1D12D;MUSICAL SYMBOL FLAT DOWN;So;0;L;;;;;N;;;;; +1D12E;MUSICAL SYMBOL NATURAL UP;So;0;L;;;;;N;;;;; +1D12F;MUSICAL SYMBOL NATURAL DOWN;So;0;L;;;;;N;;;;; +1D130;MUSICAL SYMBOL SHARP UP;So;0;L;;;;;N;;;;; +1D131;MUSICAL SYMBOL SHARP DOWN;So;0;L;;;;;N;;;;; +1D132;MUSICAL SYMBOL QUARTER TONE SHARP;So;0;L;;;;;N;;;;; +1D133;MUSICAL SYMBOL QUARTER TONE FLAT;So;0;L;;;;;N;;;;; +1D134;MUSICAL SYMBOL COMMON TIME;So;0;L;;;;;N;;;;; +1D135;MUSICAL SYMBOL CUT TIME;So;0;L;;;;;N;;;;; +1D136;MUSICAL SYMBOL OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D137;MUSICAL SYMBOL OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D138;MUSICAL SYMBOL QUINDICESIMA ALTA;So;0;L;;;;;N;;;;; +1D139;MUSICAL SYMBOL QUINDICESIMA BASSA;So;0;L;;;;;N;;;;; +1D13A;MUSICAL SYMBOL MULTI REST;So;0;L;;;;;N;;;;; +1D13B;MUSICAL SYMBOL WHOLE REST;So;0;L;;;;;N;;;;; +1D13C;MUSICAL SYMBOL HALF REST;So;0;L;;;;;N;;;;; +1D13D;MUSICAL SYMBOL QUARTER REST;So;0;L;;;;;N;;;;; +1D13E;MUSICAL SYMBOL EIGHTH REST;So;0;L;;;;;N;;;;; +1D13F;MUSICAL SYMBOL SIXTEENTH REST;So;0;L;;;;;N;;;;; +1D140;MUSICAL SYMBOL THIRTY-SECOND REST;So;0;L;;;;;N;;;;; +1D141;MUSICAL SYMBOL SIXTY-FOURTH REST;So;0;L;;;;;N;;;;; +1D142;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST;So;0;L;;;;;N;;;;; +1D143;MUSICAL SYMBOL X NOTEHEAD;So;0;L;;;;;N;;;;; +1D144;MUSICAL SYMBOL PLUS NOTEHEAD;So;0;L;;;;;N;;;;; +1D145;MUSICAL SYMBOL CIRCLE X NOTEHEAD;So;0;L;;;;;N;;;;; +1D146;MUSICAL SYMBOL SQUARE NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D147;MUSICAL SYMBOL SQUARE NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D148;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE;So;0;L;;;;;N;;;;; +1D149;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK;So;0;L;;;;;N;;;;; +1D14A;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE;So;0;L;;;;;N;;;;; +1D14B;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK;So;0;L;;;;;N;;;;; +1D14C;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE;So;0;L;;;;;N;;;;; +1D14D;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK;So;0;L;;;;;N;;;;; +1D14E;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; +1D14F;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; +1D150;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE;So;0;L;;;;;N;;;;; +1D151;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK;So;0;L;;;;;N;;;;; +1D152;MUSICAL SYMBOL MOON NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D153;MUSICAL SYMBOL MOON NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D154;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; +1D155;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; +1D156;MUSICAL SYMBOL PARENTHESIS NOTEHEAD;So;0;L;;;;;N;;;;; +1D157;MUSICAL SYMBOL VOID NOTEHEAD;So;0;L;;;;;N;;;;; +1D158;MUSICAL SYMBOL NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D159;MUSICAL SYMBOL NULL NOTEHEAD;So;0;L;;;;;N;;;;; +1D15A;MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D15B;MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D15C;MUSICAL SYMBOL BREVE;So;0;L;;;;;N;;;;; +1D15D;MUSICAL SYMBOL WHOLE NOTE;So;0;L;;;;;N;;;;; +1D15E;MUSICAL SYMBOL HALF NOTE;So;0;L;1D157 1D165;;;;N;;;;; +1D15F;MUSICAL SYMBOL QUARTER NOTE;So;0;L;1D158 1D165;;;;N;;;;; +1D160;MUSICAL SYMBOL EIGHTH NOTE;So;0;L;1D15F 1D16E;;;;N;;;;; +1D161;MUSICAL SYMBOL SIXTEENTH NOTE;So;0;L;1D15F 1D16F;;;;N;;;;; +1D162;MUSICAL SYMBOL THIRTY-SECOND NOTE;So;0;L;1D15F 1D170;;;;N;;;;; +1D163;MUSICAL SYMBOL SIXTY-FOURTH NOTE;So;0;L;1D15F 1D171;;;;N;;;;; +1D164;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE;So;0;L;1D15F 1D172;;;;N;;;;; +1D165;MUSICAL SYMBOL COMBINING STEM;Mc;216;L;;;;;N;;;;; +1D166;MUSICAL SYMBOL COMBINING SPRECHGESANG STEM;Mc;216;L;;;;;N;;;;; +1D167;MUSICAL SYMBOL COMBINING TREMOLO-1;Mn;1;NSM;;;;;N;;;;; +1D168;MUSICAL SYMBOL COMBINING TREMOLO-2;Mn;1;NSM;;;;;N;;;;; +1D169;MUSICAL SYMBOL COMBINING TREMOLO-3;Mn;1;NSM;;;;;N;;;;; +1D16A;MUSICAL SYMBOL FINGERED TREMOLO-1;So;0;L;;;;;N;;;;; +1D16B;MUSICAL SYMBOL FINGERED TREMOLO-2;So;0;L;;;;;N;;;;; +1D16C;MUSICAL SYMBOL FINGERED TREMOLO-3;So;0;L;;;;;N;;;;; +1D16D;MUSICAL SYMBOL COMBINING AUGMENTATION DOT;Mc;226;L;;;;;N;;;;; +1D16E;MUSICAL SYMBOL COMBINING FLAG-1;Mc;216;L;;;;;N;;;;; +1D16F;MUSICAL SYMBOL COMBINING FLAG-2;Mc;216;L;;;;;N;;;;; +1D170;MUSICAL SYMBOL COMBINING FLAG-3;Mc;216;L;;;;;N;;;;; +1D171;MUSICAL SYMBOL COMBINING FLAG-4;Mc;216;L;;;;;N;;;;; +1D172;MUSICAL SYMBOL COMBINING FLAG-5;Mc;216;L;;;;;N;;;;; +1D173;MUSICAL SYMBOL BEGIN BEAM;Cf;0;BN;;;;;N;;;;; +1D174;MUSICAL SYMBOL END BEAM;Cf;0;BN;;;;;N;;;;; +1D175;MUSICAL SYMBOL BEGIN TIE;Cf;0;BN;;;;;N;;;;; +1D176;MUSICAL SYMBOL END TIE;Cf;0;BN;;;;;N;;;;; +1D177;MUSICAL SYMBOL BEGIN SLUR;Cf;0;BN;;;;;N;;;;; +1D178;MUSICAL SYMBOL END SLUR;Cf;0;BN;;;;;N;;;;; +1D179;MUSICAL SYMBOL BEGIN PHRASE;Cf;0;BN;;;;;N;;;;; +1D17A;MUSICAL SYMBOL END PHRASE;Cf;0;BN;;;;;N;;;;; +1D17B;MUSICAL SYMBOL COMBINING ACCENT;Mn;220;NSM;;;;;N;;;;; +1D17C;MUSICAL SYMBOL COMBINING STACCATO;Mn;220;NSM;;;;;N;;;;; +1D17D;MUSICAL SYMBOL COMBINING TENUTO;Mn;220;NSM;;;;;N;;;;; +1D17E;MUSICAL SYMBOL COMBINING STACCATISSIMO;Mn;220;NSM;;;;;N;;;;; +1D17F;MUSICAL SYMBOL COMBINING MARCATO;Mn;220;NSM;;;;;N;;;;; +1D180;MUSICAL SYMBOL COMBINING MARCATO-STACCATO;Mn;220;NSM;;;;;N;;;;; +1D181;MUSICAL SYMBOL COMBINING ACCENT-STACCATO;Mn;220;NSM;;;;;N;;;;; +1D182;MUSICAL SYMBOL COMBINING LOURE;Mn;220;NSM;;;;;N;;;;; +1D183;MUSICAL SYMBOL ARPEGGIATO UP;So;0;L;;;;;N;;;;; +1D184;MUSICAL SYMBOL ARPEGGIATO DOWN;So;0;L;;;;;N;;;;; +1D185;MUSICAL SYMBOL COMBINING DOIT;Mn;230;NSM;;;;;N;;;;; +1D186;MUSICAL SYMBOL COMBINING RIP;Mn;230;NSM;;;;;N;;;;; +1D187;MUSICAL SYMBOL COMBINING FLIP;Mn;230;NSM;;;;;N;;;;; +1D188;MUSICAL SYMBOL COMBINING SMEAR;Mn;230;NSM;;;;;N;;;;; +1D189;MUSICAL SYMBOL COMBINING BEND;Mn;230;NSM;;;;;N;;;;; +1D18A;MUSICAL SYMBOL COMBINING DOUBLE TONGUE;Mn;220;NSM;;;;;N;;;;; +1D18B;MUSICAL SYMBOL COMBINING TRIPLE TONGUE;Mn;220;NSM;;;;;N;;;;; +1D18C;MUSICAL SYMBOL RINFORZANDO;So;0;L;;;;;N;;;;; +1D18D;MUSICAL SYMBOL SUBITO;So;0;L;;;;;N;;;;; +1D18E;MUSICAL SYMBOL Z;So;0;L;;;;;N;;;;; +1D18F;MUSICAL SYMBOL PIANO;So;0;L;;;;;N;;;;; +1D190;MUSICAL SYMBOL MEZZO;So;0;L;;;;;N;;;;; +1D191;MUSICAL SYMBOL FORTE;So;0;L;;;;;N;;;;; +1D192;MUSICAL SYMBOL CRESCENDO;So;0;L;;;;;N;;;;; +1D193;MUSICAL SYMBOL DECRESCENDO;So;0;L;;;;;N;;;;; +1D194;MUSICAL SYMBOL GRACE NOTE SLASH;So;0;L;;;;;N;;;;; +1D195;MUSICAL SYMBOL GRACE NOTE NO SLASH;So;0;L;;;;;N;;;;; +1D196;MUSICAL SYMBOL TR;So;0;L;;;;;N;;;;; +1D197;MUSICAL SYMBOL TURN;So;0;L;;;;;N;;;;; +1D198;MUSICAL SYMBOL INVERTED TURN;So;0;L;;;;;N;;;;; +1D199;MUSICAL SYMBOL TURN SLASH;So;0;L;;;;;N;;;;; +1D19A;MUSICAL SYMBOL TURN UP;So;0;L;;;;;N;;;;; +1D19B;MUSICAL SYMBOL ORNAMENT STROKE-1;So;0;L;;;;;N;;;;; +1D19C;MUSICAL SYMBOL ORNAMENT STROKE-2;So;0;L;;;;;N;;;;; +1D19D;MUSICAL SYMBOL ORNAMENT STROKE-3;So;0;L;;;;;N;;;;; +1D19E;MUSICAL SYMBOL ORNAMENT STROKE-4;So;0;L;;;;;N;;;;; +1D19F;MUSICAL SYMBOL ORNAMENT STROKE-5;So;0;L;;;;;N;;;;; +1D1A0;MUSICAL SYMBOL ORNAMENT STROKE-6;So;0;L;;;;;N;;;;; +1D1A1;MUSICAL SYMBOL ORNAMENT STROKE-7;So;0;L;;;;;N;;;;; +1D1A2;MUSICAL SYMBOL ORNAMENT STROKE-8;So;0;L;;;;;N;;;;; +1D1A3;MUSICAL SYMBOL ORNAMENT STROKE-9;So;0;L;;;;;N;;;;; +1D1A4;MUSICAL SYMBOL ORNAMENT STROKE-10;So;0;L;;;;;N;;;;; +1D1A5;MUSICAL SYMBOL ORNAMENT STROKE-11;So;0;L;;;;;N;;;;; +1D1A6;MUSICAL SYMBOL HAUPTSTIMME;So;0;L;;;;;N;;;;; +1D1A7;MUSICAL SYMBOL NEBENSTIMME;So;0;L;;;;;N;;;;; +1D1A8;MUSICAL SYMBOL END OF STIMME;So;0;L;;;;;N;;;;; +1D1A9;MUSICAL SYMBOL DEGREE SLASH;So;0;L;;;;;N;;;;; +1D1AA;MUSICAL SYMBOL COMBINING DOWN BOW;Mn;230;NSM;;;;;N;;;;; +1D1AB;MUSICAL SYMBOL COMBINING UP BOW;Mn;230;NSM;;;;;N;;;;; +1D1AC;MUSICAL SYMBOL COMBINING HARMONIC;Mn;230;NSM;;;;;N;;;;; +1D1AD;MUSICAL SYMBOL COMBINING SNAP PIZZICATO;Mn;230;NSM;;;;;N;;;;; +1D1AE;MUSICAL SYMBOL PEDAL MARK;So;0;L;;;;;N;;;;; +1D1AF;MUSICAL SYMBOL PEDAL UP MARK;So;0;L;;;;;N;;;;; +1D1B0;MUSICAL SYMBOL HALF PEDAL MARK;So;0;L;;;;;N;;;;; +1D1B1;MUSICAL SYMBOL GLISSANDO UP;So;0;L;;;;;N;;;;; +1D1B2;MUSICAL SYMBOL GLISSANDO DOWN;So;0;L;;;;;N;;;;; +1D1B3;MUSICAL SYMBOL WITH FINGERNAILS;So;0;L;;;;;N;;;;; +1D1B4;MUSICAL SYMBOL DAMP;So;0;L;;;;;N;;;;; +1D1B5;MUSICAL SYMBOL DAMP ALL;So;0;L;;;;;N;;;;; +1D1B6;MUSICAL SYMBOL MAXIMA;So;0;L;;;;;N;;;;; +1D1B7;MUSICAL SYMBOL LONGA;So;0;L;;;;;N;;;;; +1D1B8;MUSICAL SYMBOL BREVIS;So;0;L;;;;;N;;;;; +1D1B9;MUSICAL SYMBOL SEMIBREVIS WHITE;So;0;L;;;;;N;;;;; +1D1BA;MUSICAL SYMBOL SEMIBREVIS BLACK;So;0;L;;;;;N;;;;; +1D1BB;MUSICAL SYMBOL MINIMA;So;0;L;1D1B9 1D165;;;;N;;;;; +1D1BC;MUSICAL SYMBOL MINIMA BLACK;So;0;L;1D1BA 1D165;;;;N;;;;; +1D1BD;MUSICAL SYMBOL SEMIMINIMA WHITE;So;0;L;1D1BB 1D16E;;;;N;;;;; +1D1BE;MUSICAL SYMBOL SEMIMINIMA BLACK;So;0;L;1D1BC 1D16E;;;;N;;;;; +1D1BF;MUSICAL SYMBOL FUSA WHITE;So;0;L;1D1BB 1D16F;;;;N;;;;; +1D1C0;MUSICAL SYMBOL FUSA BLACK;So;0;L;1D1BC 1D16F;;;;N;;;;; +1D1C1;MUSICAL SYMBOL LONGA PERFECTA REST;So;0;L;;;;;N;;;;; +1D1C2;MUSICAL SYMBOL LONGA IMPERFECTA REST;So;0;L;;;;;N;;;;; +1D1C3;MUSICAL SYMBOL BREVIS REST;So;0;L;;;;;N;;;;; +1D1C4;MUSICAL SYMBOL SEMIBREVIS REST;So;0;L;;;;;N;;;;; +1D1C5;MUSICAL SYMBOL MINIMA REST;So;0;L;;;;;N;;;;; +1D1C6;MUSICAL SYMBOL SEMIMINIMA REST;So;0;L;;;;;N;;;;; +1D1C7;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; +1D1C8;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; +1D1C9;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; +1D1CA;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; +1D1CB;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; +1D1CC;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; +1D1CD;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2;So;0;L;;;;;N;;;;; +1D1CE;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3;So;0;L;;;;;N;;;;; +1D1CF;MUSICAL SYMBOL CROIX;So;0;L;;;;;N;;;;; +1D1D0;MUSICAL SYMBOL GREGORIAN C CLEF;So;0;L;;;;;N;;;;; +1D1D1;MUSICAL SYMBOL GREGORIAN F CLEF;So;0;L;;;;;N;;;;; +1D1D2;MUSICAL SYMBOL SQUARE B;So;0;L;;;;;N;;;;; +1D1D3;MUSICAL SYMBOL VIRGA;So;0;L;;;;;N;;;;; +1D1D4;MUSICAL SYMBOL PODATUS;So;0;L;;;;;N;;;;; +1D1D5;MUSICAL SYMBOL CLIVIS;So;0;L;;;;;N;;;;; +1D1D6;MUSICAL SYMBOL SCANDICUS;So;0;L;;;;;N;;;;; +1D1D7;MUSICAL SYMBOL CLIMACUS;So;0;L;;;;;N;;;;; +1D1D8;MUSICAL SYMBOL TORCULUS;So;0;L;;;;;N;;;;; +1D1D9;MUSICAL SYMBOL PORRECTUS;So;0;L;;;;;N;;;;; +1D1DA;MUSICAL SYMBOL PORRECTUS FLEXUS;So;0;L;;;;;N;;;;; +1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;; +1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;; +1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;; +1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D403;MATHEMATICAL BOLD CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D404;MATHEMATICAL BOLD CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D405;MATHEMATICAL BOLD CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D406;MATHEMATICAL BOLD CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D407;MATHEMATICAL BOLD CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D408;MATHEMATICAL BOLD CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D409;MATHEMATICAL BOLD CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D40A;MATHEMATICAL BOLD CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D40B;MATHEMATICAL BOLD CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D40C;MATHEMATICAL BOLD CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D40D;MATHEMATICAL BOLD CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D40E;MATHEMATICAL BOLD CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D40F;MATHEMATICAL BOLD CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D410;MATHEMATICAL BOLD CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D411;MATHEMATICAL BOLD CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D412;MATHEMATICAL BOLD CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D413;MATHEMATICAL BOLD CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D414;MATHEMATICAL BOLD CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D415;MATHEMATICAL BOLD CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D416;MATHEMATICAL BOLD CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D417;MATHEMATICAL BOLD CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D418;MATHEMATICAL BOLD CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D419;MATHEMATICAL BOLD CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D41A;MATHEMATICAL BOLD SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D41B;MATHEMATICAL BOLD SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D41C;MATHEMATICAL BOLD SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D41D;MATHEMATICAL BOLD SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D41E;MATHEMATICAL BOLD SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D41F;MATHEMATICAL BOLD SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D420;MATHEMATICAL BOLD SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D421;MATHEMATICAL BOLD SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D422;MATHEMATICAL BOLD SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D423;MATHEMATICAL BOLD SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D424;MATHEMATICAL BOLD SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D425;MATHEMATICAL BOLD SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D426;MATHEMATICAL BOLD SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D427;MATHEMATICAL BOLD SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D428;MATHEMATICAL BOLD SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D429;MATHEMATICAL BOLD SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D42A;MATHEMATICAL BOLD SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D42B;MATHEMATICAL BOLD SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D42C;MATHEMATICAL BOLD SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D42D;MATHEMATICAL BOLD SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D42E;MATHEMATICAL BOLD SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D42F;MATHEMATICAL BOLD SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D430;MATHEMATICAL BOLD SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D431;MATHEMATICAL BOLD SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D432;MATHEMATICAL BOLD SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D433;MATHEMATICAL BOLD SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D434;MATHEMATICAL ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D435;MATHEMATICAL ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D436;MATHEMATICAL ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D437;MATHEMATICAL ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D438;MATHEMATICAL ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D439;MATHEMATICAL ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D43A;MATHEMATICAL ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D43B;MATHEMATICAL ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D43C;MATHEMATICAL ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D43D;MATHEMATICAL ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D43E;MATHEMATICAL ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D43F;MATHEMATICAL ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D440;MATHEMATICAL ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D441;MATHEMATICAL ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D442;MATHEMATICAL ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D443;MATHEMATICAL ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D444;MATHEMATICAL ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D445;MATHEMATICAL ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D446;MATHEMATICAL ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D447;MATHEMATICAL ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D448;MATHEMATICAL ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D449;MATHEMATICAL ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D44A;MATHEMATICAL ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D44B;MATHEMATICAL ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D44C;MATHEMATICAL ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D44D;MATHEMATICAL ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D44E;MATHEMATICAL ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D44F;MATHEMATICAL ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D450;MATHEMATICAL ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D451;MATHEMATICAL ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D452;MATHEMATICAL ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D453;MATHEMATICAL ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D454;MATHEMATICAL ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D456;MATHEMATICAL ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D457;MATHEMATICAL ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D458;MATHEMATICAL ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D459;MATHEMATICAL ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D45A;MATHEMATICAL ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D45B;MATHEMATICAL ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D45C;MATHEMATICAL ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D45D;MATHEMATICAL ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D45E;MATHEMATICAL ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D45F;MATHEMATICAL ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D460;MATHEMATICAL ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D461;MATHEMATICAL ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D462;MATHEMATICAL ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D463;MATHEMATICAL ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D464;MATHEMATICAL ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D465;MATHEMATICAL ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D466;MATHEMATICAL ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D467;MATHEMATICAL ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D468;MATHEMATICAL BOLD ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D469;MATHEMATICAL BOLD ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D46A;MATHEMATICAL BOLD ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D46B;MATHEMATICAL BOLD ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D46C;MATHEMATICAL BOLD ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D46D;MATHEMATICAL BOLD ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D46E;MATHEMATICAL BOLD ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D46F;MATHEMATICAL BOLD ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D470;MATHEMATICAL BOLD ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D471;MATHEMATICAL BOLD ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D472;MATHEMATICAL BOLD ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D473;MATHEMATICAL BOLD ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D474;MATHEMATICAL BOLD ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D475;MATHEMATICAL BOLD ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D476;MATHEMATICAL BOLD ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D477;MATHEMATICAL BOLD ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D478;MATHEMATICAL BOLD ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D479;MATHEMATICAL BOLD ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D47A;MATHEMATICAL BOLD ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D47B;MATHEMATICAL BOLD ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D47C;MATHEMATICAL BOLD ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D47D;MATHEMATICAL BOLD ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D47E;MATHEMATICAL BOLD ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D47F;MATHEMATICAL BOLD ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D480;MATHEMATICAL BOLD ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D481;MATHEMATICAL BOLD ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D482;MATHEMATICAL BOLD ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D483;MATHEMATICAL BOLD ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D484;MATHEMATICAL BOLD ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D485;MATHEMATICAL BOLD ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D486;MATHEMATICAL BOLD ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D487;MATHEMATICAL BOLD ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D488;MATHEMATICAL BOLD ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D489;MATHEMATICAL BOLD ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D48A;MATHEMATICAL BOLD ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D48B;MATHEMATICAL BOLD ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D48C;MATHEMATICAL BOLD ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D48D;MATHEMATICAL BOLD ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D48E;MATHEMATICAL BOLD ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D48F;MATHEMATICAL BOLD ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D490;MATHEMATICAL BOLD ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D491;MATHEMATICAL BOLD ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D492;MATHEMATICAL BOLD ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D493;MATHEMATICAL BOLD ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D494;MATHEMATICAL BOLD ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D495;MATHEMATICAL BOLD ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D496;MATHEMATICAL BOLD ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D497;MATHEMATICAL BOLD ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D498;MATHEMATICAL BOLD ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D499;MATHEMATICAL BOLD ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D49A;MATHEMATICAL BOLD ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D49B;MATHEMATICAL BOLD ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D49C;MATHEMATICAL SCRIPT CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D49E;MATHEMATICAL SCRIPT CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D49F;MATHEMATICAL SCRIPT CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D4A2;MATHEMATICAL SCRIPT CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D4A5;MATHEMATICAL SCRIPT CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D4A6;MATHEMATICAL SCRIPT CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D4A9;MATHEMATICAL SCRIPT CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D4AA;MATHEMATICAL SCRIPT CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D4AB;MATHEMATICAL SCRIPT CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D4AC;MATHEMATICAL SCRIPT CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D4AE;MATHEMATICAL SCRIPT CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D4AF;MATHEMATICAL SCRIPT CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D4B0;MATHEMATICAL SCRIPT CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D4B1;MATHEMATICAL SCRIPT CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D4B2;MATHEMATICAL SCRIPT CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D4B3;MATHEMATICAL SCRIPT CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D4B4;MATHEMATICAL SCRIPT CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D4B5;MATHEMATICAL SCRIPT CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D4B6;MATHEMATICAL SCRIPT SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D4B7;MATHEMATICAL SCRIPT SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D4B8;MATHEMATICAL SCRIPT SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D4B9;MATHEMATICAL SCRIPT SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D4BB;MATHEMATICAL SCRIPT SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D4BD;MATHEMATICAL SCRIPT SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D4BE;MATHEMATICAL SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D4BF;MATHEMATICAL SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D4C0;MATHEMATICAL SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D4C2;MATHEMATICAL SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D4C3;MATHEMATICAL SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D4C5;MATHEMATICAL SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D4C6;MATHEMATICAL SCRIPT SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D4C7;MATHEMATICAL SCRIPT SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D4C8;MATHEMATICAL SCRIPT SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D4C9;MATHEMATICAL SCRIPT SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D4CA;MATHEMATICAL SCRIPT SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D4CB;MATHEMATICAL SCRIPT SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D4CC;MATHEMATICAL SCRIPT SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D4CD;MATHEMATICAL SCRIPT SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D4CE;MATHEMATICAL SCRIPT SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D4CF;MATHEMATICAL SCRIPT SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D4D0;MATHEMATICAL BOLD SCRIPT CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D4D1;MATHEMATICAL BOLD SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D4D2;MATHEMATICAL BOLD SCRIPT CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D4D3;MATHEMATICAL BOLD SCRIPT CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D4D4;MATHEMATICAL BOLD SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D4D5;MATHEMATICAL BOLD SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D4D6;MATHEMATICAL BOLD SCRIPT CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D4D7;MATHEMATICAL BOLD SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D4D8;MATHEMATICAL BOLD SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D4D9;MATHEMATICAL BOLD SCRIPT CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D4DA;MATHEMATICAL BOLD SCRIPT CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D4DB;MATHEMATICAL BOLD SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D4DC;MATHEMATICAL BOLD SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D4DD;MATHEMATICAL BOLD SCRIPT CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D4DE;MATHEMATICAL BOLD SCRIPT CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D4DF;MATHEMATICAL BOLD SCRIPT CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D4E0;MATHEMATICAL BOLD SCRIPT CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D4E1;MATHEMATICAL BOLD SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D4E2;MATHEMATICAL BOLD SCRIPT CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D4E3;MATHEMATICAL BOLD SCRIPT CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D4E4;MATHEMATICAL BOLD SCRIPT CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D4E5;MATHEMATICAL BOLD SCRIPT CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D4E6;MATHEMATICAL BOLD SCRIPT CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D4E7;MATHEMATICAL BOLD SCRIPT CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D4E8;MATHEMATICAL BOLD SCRIPT CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D4E9;MATHEMATICAL BOLD SCRIPT CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D4EA;MATHEMATICAL BOLD SCRIPT SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D4EB;MATHEMATICAL BOLD SCRIPT SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D4EC;MATHEMATICAL BOLD SCRIPT SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D4ED;MATHEMATICAL BOLD SCRIPT SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D4EE;MATHEMATICAL BOLD SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D4EF;MATHEMATICAL BOLD SCRIPT SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D4F0;MATHEMATICAL BOLD SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D4F1;MATHEMATICAL BOLD SCRIPT SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D4F2;MATHEMATICAL BOLD SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D4F3;MATHEMATICAL BOLD SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D4F4;MATHEMATICAL BOLD SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D4F5;MATHEMATICAL BOLD SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D4F6;MATHEMATICAL BOLD SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D4F7;MATHEMATICAL BOLD SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D4F8;MATHEMATICAL BOLD SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D4F9;MATHEMATICAL BOLD SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D4FA;MATHEMATICAL BOLD SCRIPT SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D4FB;MATHEMATICAL BOLD SCRIPT SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D4FC;MATHEMATICAL BOLD SCRIPT SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D4FD;MATHEMATICAL BOLD SCRIPT SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D4FE;MATHEMATICAL BOLD SCRIPT SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D4FF;MATHEMATICAL BOLD SCRIPT SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D500;MATHEMATICAL BOLD SCRIPT SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D501;MATHEMATICAL BOLD SCRIPT SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D502;MATHEMATICAL BOLD SCRIPT SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D503;MATHEMATICAL BOLD SCRIPT SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D504;MATHEMATICAL FRAKTUR CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D505;MATHEMATICAL FRAKTUR CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D507;MATHEMATICAL FRAKTUR CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D508;MATHEMATICAL FRAKTUR CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D509;MATHEMATICAL FRAKTUR CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D50A;MATHEMATICAL FRAKTUR CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D50D;MATHEMATICAL FRAKTUR CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D50E;MATHEMATICAL FRAKTUR CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D50F;MATHEMATICAL FRAKTUR CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D510;MATHEMATICAL FRAKTUR CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D511;MATHEMATICAL FRAKTUR CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D512;MATHEMATICAL FRAKTUR CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D513;MATHEMATICAL FRAKTUR CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D514;MATHEMATICAL FRAKTUR CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D516;MATHEMATICAL FRAKTUR CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D517;MATHEMATICAL FRAKTUR CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D518;MATHEMATICAL FRAKTUR CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D519;MATHEMATICAL FRAKTUR CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D51A;MATHEMATICAL FRAKTUR CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D51B;MATHEMATICAL FRAKTUR CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D51C;MATHEMATICAL FRAKTUR CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D51E;MATHEMATICAL FRAKTUR SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D51F;MATHEMATICAL FRAKTUR SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D520;MATHEMATICAL FRAKTUR SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D521;MATHEMATICAL FRAKTUR SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D522;MATHEMATICAL FRAKTUR SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D523;MATHEMATICAL FRAKTUR SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D524;MATHEMATICAL FRAKTUR SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D525;MATHEMATICAL FRAKTUR SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D526;MATHEMATICAL FRAKTUR SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D527;MATHEMATICAL FRAKTUR SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D528;MATHEMATICAL FRAKTUR SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D529;MATHEMATICAL FRAKTUR SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D52A;MATHEMATICAL FRAKTUR SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D52B;MATHEMATICAL FRAKTUR SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D52C;MATHEMATICAL FRAKTUR SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D52D;MATHEMATICAL FRAKTUR SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D52E;MATHEMATICAL FRAKTUR SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D52F;MATHEMATICAL FRAKTUR SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D530;MATHEMATICAL FRAKTUR SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D531;MATHEMATICAL FRAKTUR SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D532;MATHEMATICAL FRAKTUR SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D533;MATHEMATICAL FRAKTUR SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D534;MATHEMATICAL FRAKTUR SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D535;MATHEMATICAL FRAKTUR SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D536;MATHEMATICAL FRAKTUR SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D537;MATHEMATICAL FRAKTUR SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D538;MATHEMATICAL DOUBLE-STRUCK CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D539;MATHEMATICAL DOUBLE-STRUCK CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D53B;MATHEMATICAL DOUBLE-STRUCK CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D53C;MATHEMATICAL DOUBLE-STRUCK CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D53D;MATHEMATICAL DOUBLE-STRUCK CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D53E;MATHEMATICAL DOUBLE-STRUCK CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D540;MATHEMATICAL DOUBLE-STRUCK CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D541;MATHEMATICAL DOUBLE-STRUCK CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D542;MATHEMATICAL DOUBLE-STRUCK CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D543;MATHEMATICAL DOUBLE-STRUCK CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D544;MATHEMATICAL DOUBLE-STRUCK CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D546;MATHEMATICAL DOUBLE-STRUCK CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D54A;MATHEMATICAL DOUBLE-STRUCK CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D54B;MATHEMATICAL DOUBLE-STRUCK CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D54C;MATHEMATICAL DOUBLE-STRUCK CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D54D;MATHEMATICAL DOUBLE-STRUCK CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D54E;MATHEMATICAL DOUBLE-STRUCK CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D54F;MATHEMATICAL DOUBLE-STRUCK CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D550;MATHEMATICAL DOUBLE-STRUCK CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D552;MATHEMATICAL DOUBLE-STRUCK SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D553;MATHEMATICAL DOUBLE-STRUCK SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D554;MATHEMATICAL DOUBLE-STRUCK SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D555;MATHEMATICAL DOUBLE-STRUCK SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D556;MATHEMATICAL DOUBLE-STRUCK SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D557;MATHEMATICAL DOUBLE-STRUCK SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D558;MATHEMATICAL DOUBLE-STRUCK SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D559;MATHEMATICAL DOUBLE-STRUCK SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D55A;MATHEMATICAL DOUBLE-STRUCK SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D55B;MATHEMATICAL DOUBLE-STRUCK SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D55C;MATHEMATICAL DOUBLE-STRUCK SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D55D;MATHEMATICAL DOUBLE-STRUCK SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D55E;MATHEMATICAL DOUBLE-STRUCK SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D55F;MATHEMATICAL DOUBLE-STRUCK SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D560;MATHEMATICAL DOUBLE-STRUCK SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D561;MATHEMATICAL DOUBLE-STRUCK SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D562;MATHEMATICAL DOUBLE-STRUCK SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D563;MATHEMATICAL DOUBLE-STRUCK SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D564;MATHEMATICAL DOUBLE-STRUCK SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D565;MATHEMATICAL DOUBLE-STRUCK SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D566;MATHEMATICAL DOUBLE-STRUCK SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D567;MATHEMATICAL DOUBLE-STRUCK SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D568;MATHEMATICAL DOUBLE-STRUCK SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D569;MATHEMATICAL DOUBLE-STRUCK SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D56A;MATHEMATICAL DOUBLE-STRUCK SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D56B;MATHEMATICAL DOUBLE-STRUCK SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D56C;MATHEMATICAL BOLD FRAKTUR CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D56D;MATHEMATICAL BOLD FRAKTUR CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D56E;MATHEMATICAL BOLD FRAKTUR CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D56F;MATHEMATICAL BOLD FRAKTUR CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D570;MATHEMATICAL BOLD FRAKTUR CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D571;MATHEMATICAL BOLD FRAKTUR CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D572;MATHEMATICAL BOLD FRAKTUR CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D573;MATHEMATICAL BOLD FRAKTUR CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D574;MATHEMATICAL BOLD FRAKTUR CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D575;MATHEMATICAL BOLD FRAKTUR CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D576;MATHEMATICAL BOLD FRAKTUR CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D577;MATHEMATICAL BOLD FRAKTUR CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D578;MATHEMATICAL BOLD FRAKTUR CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D579;MATHEMATICAL BOLD FRAKTUR CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D57A;MATHEMATICAL BOLD FRAKTUR CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D57B;MATHEMATICAL BOLD FRAKTUR CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D57C;MATHEMATICAL BOLD FRAKTUR CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D57D;MATHEMATICAL BOLD FRAKTUR CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D57E;MATHEMATICAL BOLD FRAKTUR CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D57F;MATHEMATICAL BOLD FRAKTUR CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D580;MATHEMATICAL BOLD FRAKTUR CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D581;MATHEMATICAL BOLD FRAKTUR CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D582;MATHEMATICAL BOLD FRAKTUR CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D583;MATHEMATICAL BOLD FRAKTUR CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D584;MATHEMATICAL BOLD FRAKTUR CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D585;MATHEMATICAL BOLD FRAKTUR CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D586;MATHEMATICAL BOLD FRAKTUR SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D587;MATHEMATICAL BOLD FRAKTUR SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D588;MATHEMATICAL BOLD FRAKTUR SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D589;MATHEMATICAL BOLD FRAKTUR SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D58A;MATHEMATICAL BOLD FRAKTUR SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D58B;MATHEMATICAL BOLD FRAKTUR SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D58C;MATHEMATICAL BOLD FRAKTUR SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D58D;MATHEMATICAL BOLD FRAKTUR SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D58E;MATHEMATICAL BOLD FRAKTUR SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D58F;MATHEMATICAL BOLD FRAKTUR SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D590;MATHEMATICAL BOLD FRAKTUR SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D591;MATHEMATICAL BOLD FRAKTUR SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D592;MATHEMATICAL BOLD FRAKTUR SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D593;MATHEMATICAL BOLD FRAKTUR SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D594;MATHEMATICAL BOLD FRAKTUR SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D595;MATHEMATICAL BOLD FRAKTUR SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D596;MATHEMATICAL BOLD FRAKTUR SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D597;MATHEMATICAL BOLD FRAKTUR SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D598;MATHEMATICAL BOLD FRAKTUR SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D599;MATHEMATICAL BOLD FRAKTUR SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D59A;MATHEMATICAL BOLD FRAKTUR SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D59B;MATHEMATICAL BOLD FRAKTUR SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D59C;MATHEMATICAL BOLD FRAKTUR SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D59D;MATHEMATICAL BOLD FRAKTUR SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D59E;MATHEMATICAL BOLD FRAKTUR SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D59F;MATHEMATICAL BOLD FRAKTUR SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D5A0;MATHEMATICAL SANS-SERIF CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D5A1;MATHEMATICAL SANS-SERIF CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D5A2;MATHEMATICAL SANS-SERIF CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D5A3;MATHEMATICAL SANS-SERIF CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D5A4;MATHEMATICAL SANS-SERIF CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D5A5;MATHEMATICAL SANS-SERIF CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D5A6;MATHEMATICAL SANS-SERIF CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D5A7;MATHEMATICAL SANS-SERIF CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D5A8;MATHEMATICAL SANS-SERIF CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D5A9;MATHEMATICAL SANS-SERIF CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D5AA;MATHEMATICAL SANS-SERIF CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D5AB;MATHEMATICAL SANS-SERIF CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D5AC;MATHEMATICAL SANS-SERIF CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D5AD;MATHEMATICAL SANS-SERIF CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D5AE;MATHEMATICAL SANS-SERIF CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D5AF;MATHEMATICAL SANS-SERIF CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D5B0;MATHEMATICAL SANS-SERIF CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D5B1;MATHEMATICAL SANS-SERIF CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D5B2;MATHEMATICAL SANS-SERIF CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D5B3;MATHEMATICAL SANS-SERIF CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D5B4;MATHEMATICAL SANS-SERIF CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D5B5;MATHEMATICAL SANS-SERIF CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D5B6;MATHEMATICAL SANS-SERIF CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D5B7;MATHEMATICAL SANS-SERIF CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D5B8;MATHEMATICAL SANS-SERIF CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D5B9;MATHEMATICAL SANS-SERIF CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D5BA;MATHEMATICAL SANS-SERIF SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D5BB;MATHEMATICAL SANS-SERIF SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D5BC;MATHEMATICAL SANS-SERIF SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D5BD;MATHEMATICAL SANS-SERIF SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D5BE;MATHEMATICAL SANS-SERIF SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D5BF;MATHEMATICAL SANS-SERIF SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D5C0;MATHEMATICAL SANS-SERIF SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D5C1;MATHEMATICAL SANS-SERIF SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D5C2;MATHEMATICAL SANS-SERIF SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D5C3;MATHEMATICAL SANS-SERIF SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D5C4;MATHEMATICAL SANS-SERIF SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D5C5;MATHEMATICAL SANS-SERIF SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D5C6;MATHEMATICAL SANS-SERIF SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D5C7;MATHEMATICAL SANS-SERIF SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D5C8;MATHEMATICAL SANS-SERIF SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D5C9;MATHEMATICAL SANS-SERIF SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D5CA;MATHEMATICAL SANS-SERIF SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D5CB;MATHEMATICAL SANS-SERIF SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D5CC;MATHEMATICAL SANS-SERIF SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D5CD;MATHEMATICAL SANS-SERIF SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D5CE;MATHEMATICAL SANS-SERIF SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D5CF;MATHEMATICAL SANS-SERIF SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D5D0;MATHEMATICAL SANS-SERIF SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D5D1;MATHEMATICAL SANS-SERIF SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D5D2;MATHEMATICAL SANS-SERIF SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D5D3;MATHEMATICAL SANS-SERIF SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D5D4;MATHEMATICAL SANS-SERIF BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D5D5;MATHEMATICAL SANS-SERIF BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D5D6;MATHEMATICAL SANS-SERIF BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D5D7;MATHEMATICAL SANS-SERIF BOLD CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D5D8;MATHEMATICAL SANS-SERIF BOLD CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D5D9;MATHEMATICAL SANS-SERIF BOLD CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D5DA;MATHEMATICAL SANS-SERIF BOLD CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D5DB;MATHEMATICAL SANS-SERIF BOLD CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D5DC;MATHEMATICAL SANS-SERIF BOLD CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D5DD;MATHEMATICAL SANS-SERIF BOLD CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D5DE;MATHEMATICAL SANS-SERIF BOLD CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D5DF;MATHEMATICAL SANS-SERIF BOLD CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D5E0;MATHEMATICAL SANS-SERIF BOLD CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D5E1;MATHEMATICAL SANS-SERIF BOLD CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D5E2;MATHEMATICAL SANS-SERIF BOLD CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D5E3;MATHEMATICAL SANS-SERIF BOLD CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D5E4;MATHEMATICAL SANS-SERIF BOLD CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D5E5;MATHEMATICAL SANS-SERIF BOLD CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D5E6;MATHEMATICAL SANS-SERIF BOLD CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D5E7;MATHEMATICAL SANS-SERIF BOLD CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D5E8;MATHEMATICAL SANS-SERIF BOLD CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D5E9;MATHEMATICAL SANS-SERIF BOLD CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D5EA;MATHEMATICAL SANS-SERIF BOLD CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D5EB;MATHEMATICAL SANS-SERIF BOLD CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D5EC;MATHEMATICAL SANS-SERIF BOLD CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D5ED;MATHEMATICAL SANS-SERIF BOLD CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D5EE;MATHEMATICAL SANS-SERIF BOLD SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D5EF;MATHEMATICAL SANS-SERIF BOLD SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D5F0;MATHEMATICAL SANS-SERIF BOLD SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D5F1;MATHEMATICAL SANS-SERIF BOLD SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D5F2;MATHEMATICAL SANS-SERIF BOLD SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D5F3;MATHEMATICAL SANS-SERIF BOLD SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D5F4;MATHEMATICAL SANS-SERIF BOLD SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D5F5;MATHEMATICAL SANS-SERIF BOLD SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D5F6;MATHEMATICAL SANS-SERIF BOLD SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D5F7;MATHEMATICAL SANS-SERIF BOLD SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D5F8;MATHEMATICAL SANS-SERIF BOLD SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D5F9;MATHEMATICAL SANS-SERIF BOLD SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D5FA;MATHEMATICAL SANS-SERIF BOLD SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D5FB;MATHEMATICAL SANS-SERIF BOLD SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D5FC;MATHEMATICAL SANS-SERIF BOLD SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D5FD;MATHEMATICAL SANS-SERIF BOLD SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D5FE;MATHEMATICAL SANS-SERIF BOLD SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D5FF;MATHEMATICAL SANS-SERIF BOLD SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D600;MATHEMATICAL SANS-SERIF BOLD SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D601;MATHEMATICAL SANS-SERIF BOLD SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D602;MATHEMATICAL SANS-SERIF BOLD SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D603;MATHEMATICAL SANS-SERIF BOLD SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D604;MATHEMATICAL SANS-SERIF BOLD SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D605;MATHEMATICAL SANS-SERIF BOLD SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D606;MATHEMATICAL SANS-SERIF BOLD SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D607;MATHEMATICAL SANS-SERIF BOLD SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D608;MATHEMATICAL SANS-SERIF ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D609;MATHEMATICAL SANS-SERIF ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D60A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D60B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D60C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D60D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D60E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D60F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D610;MATHEMATICAL SANS-SERIF ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D611;MATHEMATICAL SANS-SERIF ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D612;MATHEMATICAL SANS-SERIF ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D613;MATHEMATICAL SANS-SERIF ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D614;MATHEMATICAL SANS-SERIF ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D615;MATHEMATICAL SANS-SERIF ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D616;MATHEMATICAL SANS-SERIF ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D617;MATHEMATICAL SANS-SERIF ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D618;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D619;MATHEMATICAL SANS-SERIF ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D61A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D61B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D61C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D61D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D61E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D61F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D620;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D621;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D622;MATHEMATICAL SANS-SERIF ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D623;MATHEMATICAL SANS-SERIF ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D624;MATHEMATICAL SANS-SERIF ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D625;MATHEMATICAL SANS-SERIF ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D626;MATHEMATICAL SANS-SERIF ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D627;MATHEMATICAL SANS-SERIF ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D628;MATHEMATICAL SANS-SERIF ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D629;MATHEMATICAL SANS-SERIF ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D62A;MATHEMATICAL SANS-SERIF ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D62B;MATHEMATICAL SANS-SERIF ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D62C;MATHEMATICAL SANS-SERIF ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D62D;MATHEMATICAL SANS-SERIF ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D62E;MATHEMATICAL SANS-SERIF ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D62F;MATHEMATICAL SANS-SERIF ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D630;MATHEMATICAL SANS-SERIF ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D631;MATHEMATICAL SANS-SERIF ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D632;MATHEMATICAL SANS-SERIF ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D633;MATHEMATICAL SANS-SERIF ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D634;MATHEMATICAL SANS-SERIF ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D635;MATHEMATICAL SANS-SERIF ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D636;MATHEMATICAL SANS-SERIF ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D637;MATHEMATICAL SANS-SERIF ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D638;MATHEMATICAL SANS-SERIF ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D639;MATHEMATICAL SANS-SERIF ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D63A;MATHEMATICAL SANS-SERIF ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D63B;MATHEMATICAL SANS-SERIF ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D63C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D63D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D63E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D63F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D640;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D641;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D642;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D643;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D644;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D645;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D646;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D647;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D648;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D649;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D64A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D64B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D64C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D64D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D64E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D64F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D650;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D651;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D652;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D653;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D654;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D655;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D656;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D657;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D658;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D659;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D65A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D65B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D65C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D65D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D65E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D65F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D660;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D661;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D662;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D663;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D664;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D665;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D666;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D667;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D668;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D669;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D66A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D66B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D66C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D66D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D66E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D66F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D670;MATHEMATICAL MONOSPACE CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D671;MATHEMATICAL MONOSPACE CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D672;MATHEMATICAL MONOSPACE CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D673;MATHEMATICAL MONOSPACE CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D674;MATHEMATICAL MONOSPACE CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D675;MATHEMATICAL MONOSPACE CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D676;MATHEMATICAL MONOSPACE CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D677;MATHEMATICAL MONOSPACE CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D678;MATHEMATICAL MONOSPACE CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D679;MATHEMATICAL MONOSPACE CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D67A;MATHEMATICAL MONOSPACE CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D67B;MATHEMATICAL MONOSPACE CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D67C;MATHEMATICAL MONOSPACE CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D67D;MATHEMATICAL MONOSPACE CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D67E;MATHEMATICAL MONOSPACE CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D67F;MATHEMATICAL MONOSPACE CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D680;MATHEMATICAL MONOSPACE CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D681;MATHEMATICAL MONOSPACE CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D682;MATHEMATICAL MONOSPACE CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D683;MATHEMATICAL MONOSPACE CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D684;MATHEMATICAL MONOSPACE CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D685;MATHEMATICAL MONOSPACE CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D686;MATHEMATICAL MONOSPACE CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D687;MATHEMATICAL MONOSPACE CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D688;MATHEMATICAL MONOSPACE CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D689;MATHEMATICAL MONOSPACE CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D68A;MATHEMATICAL MONOSPACE SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D68B;MATHEMATICAL MONOSPACE SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D68C;MATHEMATICAL MONOSPACE SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D68D;MATHEMATICAL MONOSPACE SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D68E;MATHEMATICAL MONOSPACE SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D68F;MATHEMATICAL MONOSPACE SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D690;MATHEMATICAL MONOSPACE SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D691;MATHEMATICAL MONOSPACE SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D692;MATHEMATICAL MONOSPACE SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D693;MATHEMATICAL MONOSPACE SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D694;MATHEMATICAL MONOSPACE SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D695;MATHEMATICAL MONOSPACE SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D696;MATHEMATICAL MONOSPACE SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D697;MATHEMATICAL MONOSPACE SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D698;MATHEMATICAL MONOSPACE SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D699;MATHEMATICAL MONOSPACE SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D69A;MATHEMATICAL MONOSPACE SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D69B;MATHEMATICAL MONOSPACE SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D69C;MATHEMATICAL MONOSPACE SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D69D;MATHEMATICAL MONOSPACE SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D69E;MATHEMATICAL MONOSPACE SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D69F;MATHEMATICAL MONOSPACE SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D6A0;MATHEMATICAL MONOSPACE SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D6A1;MATHEMATICAL MONOSPACE SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D6A2;MATHEMATICAL MONOSPACE SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; +1D6A9;MATHEMATICAL BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; +1D6AA;MATHEMATICAL BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +1D6AB;MATHEMATICAL BOLD CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; +1D6AC;MATHEMATICAL BOLD CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; +1D6AD;MATHEMATICAL BOLD CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; +1D6AE;MATHEMATICAL BOLD CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; +1D6AF;MATHEMATICAL BOLD CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; +1D6B0;MATHEMATICAL BOLD CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; +1D6B1;MATHEMATICAL BOLD CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; +1D6B2;MATHEMATICAL BOLD CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; +1D6B3;MATHEMATICAL BOLD CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; +1D6B4;MATHEMATICAL BOLD CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; +1D6B5;MATHEMATICAL BOLD CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; +1D6B6;MATHEMATICAL BOLD CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; +1D6B7;MATHEMATICAL BOLD CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +1D6B8;MATHEMATICAL BOLD CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; +1D6B9;MATHEMATICAL BOLD CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; +1D6BA;MATHEMATICAL BOLD CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; +1D6BB;MATHEMATICAL BOLD CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; +1D6BC;MATHEMATICAL BOLD CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; +1D6BD;MATHEMATICAL BOLD CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; +1D6BE;MATHEMATICAL BOLD CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; +1D6BF;MATHEMATICAL BOLD CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; +1D6C0;MATHEMATICAL BOLD CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; +1D6C1;MATHEMATICAL BOLD NABLA;Sm;0;L;<font> 2207;;;;N;;;;; +1D6C2;MATHEMATICAL BOLD SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; +1D6C3;MATHEMATICAL BOLD SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; +1D6C4;MATHEMATICAL BOLD SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +1D6C5;MATHEMATICAL BOLD SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; +1D6C6;MATHEMATICAL BOLD SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; +1D6C7;MATHEMATICAL BOLD SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; +1D6C8;MATHEMATICAL BOLD SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; +1D6C9;MATHEMATICAL BOLD SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; +1D6CA;MATHEMATICAL BOLD SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; +1D6CB;MATHEMATICAL BOLD SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; +1D6CC;MATHEMATICAL BOLD SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; +1D6CD;MATHEMATICAL BOLD SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; +1D6CE;MATHEMATICAL BOLD SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; +1D6CF;MATHEMATICAL BOLD SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; +1D6D0;MATHEMATICAL BOLD SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; +1D6D1;MATHEMATICAL BOLD SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +1D6D2;MATHEMATICAL BOLD SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; +1D6D3;MATHEMATICAL BOLD SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; +1D6D4;MATHEMATICAL BOLD SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; +1D6D5;MATHEMATICAL BOLD SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; +1D6D6;MATHEMATICAL BOLD SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; +1D6D7;MATHEMATICAL BOLD SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; +1D6D8;MATHEMATICAL BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; +1D6D9;MATHEMATICAL BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; +1D6DA;MATHEMATICAL BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; +1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;N;;;;; +1D6DC;MATHEMATICAL BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; +1D6DD;MATHEMATICAL BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; +1D6DE;MATHEMATICAL BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; +1D6DF;MATHEMATICAL BOLD PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; +1D6E0;MATHEMATICAL BOLD RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; +1D6E1;MATHEMATICAL BOLD PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; +1D6E2;MATHEMATICAL ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; +1D6E3;MATHEMATICAL ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; +1D6E4;MATHEMATICAL ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +1D6E5;MATHEMATICAL ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; +1D6E6;MATHEMATICAL ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; +1D6E7;MATHEMATICAL ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; +1D6E8;MATHEMATICAL ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; +1D6E9;MATHEMATICAL ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; +1D6EA;MATHEMATICAL ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; +1D6EB;MATHEMATICAL ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; +1D6EC;MATHEMATICAL ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; +1D6ED;MATHEMATICAL ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; +1D6EE;MATHEMATICAL ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; +1D6EF;MATHEMATICAL ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; +1D6F0;MATHEMATICAL ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; +1D6F1;MATHEMATICAL ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +1D6F2;MATHEMATICAL ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; +1D6F3;MATHEMATICAL ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; +1D6F4;MATHEMATICAL ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; +1D6F5;MATHEMATICAL ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; +1D6F6;MATHEMATICAL ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; +1D6F7;MATHEMATICAL ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; +1D6F8;MATHEMATICAL ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; +1D6F9;MATHEMATICAL ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; +1D6FA;MATHEMATICAL ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; +1D6FB;MATHEMATICAL ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;; +1D6FC;MATHEMATICAL ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; +1D6FD;MATHEMATICAL ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; +1D6FE;MATHEMATICAL ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +1D6FF;MATHEMATICAL ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; +1D700;MATHEMATICAL ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; +1D701;MATHEMATICAL ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; +1D702;MATHEMATICAL ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; +1D703;MATHEMATICAL ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; +1D704;MATHEMATICAL ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; +1D705;MATHEMATICAL ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; +1D706;MATHEMATICAL ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; +1D707;MATHEMATICAL ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; +1D708;MATHEMATICAL ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; +1D709;MATHEMATICAL ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; +1D70A;MATHEMATICAL ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; +1D70B;MATHEMATICAL ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +1D70C;MATHEMATICAL ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; +1D70D;MATHEMATICAL ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; +1D70E;MATHEMATICAL ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; +1D70F;MATHEMATICAL ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; +1D710;MATHEMATICAL ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; +1D711;MATHEMATICAL ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; +1D712;MATHEMATICAL ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; +1D713;MATHEMATICAL ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; +1D714;MATHEMATICAL ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; +1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;N;;;;; +1D716;MATHEMATICAL ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; +1D717;MATHEMATICAL ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; +1D718;MATHEMATICAL ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; +1D719;MATHEMATICAL ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; +1D71A;MATHEMATICAL ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; +1D71B;MATHEMATICAL ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; +1D71C;MATHEMATICAL BOLD ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; +1D71D;MATHEMATICAL BOLD ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; +1D71E;MATHEMATICAL BOLD ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +1D71F;MATHEMATICAL BOLD ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; +1D720;MATHEMATICAL BOLD ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; +1D721;MATHEMATICAL BOLD ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; +1D722;MATHEMATICAL BOLD ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; +1D723;MATHEMATICAL BOLD ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; +1D724;MATHEMATICAL BOLD ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; +1D725;MATHEMATICAL BOLD ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; +1D726;MATHEMATICAL BOLD ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; +1D727;MATHEMATICAL BOLD ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; +1D728;MATHEMATICAL BOLD ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; +1D729;MATHEMATICAL BOLD ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; +1D72A;MATHEMATICAL BOLD ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; +1D72B;MATHEMATICAL BOLD ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +1D72C;MATHEMATICAL BOLD ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; +1D72D;MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; +1D72E;MATHEMATICAL BOLD ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; +1D72F;MATHEMATICAL BOLD ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; +1D730;MATHEMATICAL BOLD ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; +1D731;MATHEMATICAL BOLD ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; +1D732;MATHEMATICAL BOLD ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; +1D733;MATHEMATICAL BOLD ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; +1D734;MATHEMATICAL BOLD ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; +1D735;MATHEMATICAL BOLD ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;; +1D736;MATHEMATICAL BOLD ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; +1D737;MATHEMATICAL BOLD ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; +1D738;MATHEMATICAL BOLD ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +1D739;MATHEMATICAL BOLD ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; +1D73A;MATHEMATICAL BOLD ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; +1D73B;MATHEMATICAL BOLD ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; +1D73C;MATHEMATICAL BOLD ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; +1D73D;MATHEMATICAL BOLD ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; +1D73E;MATHEMATICAL BOLD ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; +1D73F;MATHEMATICAL BOLD ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; +1D740;MATHEMATICAL BOLD ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; +1D741;MATHEMATICAL BOLD ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; +1D742;MATHEMATICAL BOLD ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; +1D743;MATHEMATICAL BOLD ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; +1D744;MATHEMATICAL BOLD ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; +1D745;MATHEMATICAL BOLD ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +1D746;MATHEMATICAL BOLD ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; +1D747;MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; +1D748;MATHEMATICAL BOLD ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; +1D749;MATHEMATICAL BOLD ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; +1D74A;MATHEMATICAL BOLD ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; +1D74B;MATHEMATICAL BOLD ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; +1D74C;MATHEMATICAL BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; +1D74D;MATHEMATICAL BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; +1D74E;MATHEMATICAL BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; +1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;N;;;;; +1D750;MATHEMATICAL BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; +1D751;MATHEMATICAL BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; +1D752;MATHEMATICAL BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; +1D753;MATHEMATICAL BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; +1D754;MATHEMATICAL BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; +1D755;MATHEMATICAL BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; +1D756;MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; +1D757;MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; +1D758;MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +1D759;MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; +1D75A;MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; +1D75B;MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; +1D75C;MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; +1D75D;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; +1D75E;MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; +1D75F;MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; +1D760;MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; +1D761;MATHEMATICAL SANS-SERIF BOLD CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; +1D762;MATHEMATICAL SANS-SERIF BOLD CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; +1D763;MATHEMATICAL SANS-SERIF BOLD CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; +1D764;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; +1D765;MATHEMATICAL SANS-SERIF BOLD CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +1D766;MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; +1D767;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; +1D768;MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; +1D769;MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; +1D76A;MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; +1D76B;MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; +1D76C;MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; +1D76D;MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; +1D76E;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; +1D76F;MATHEMATICAL SANS-SERIF BOLD NABLA;Sm;0;L;<font> 2207;;;;N;;;;; +1D770;MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; +1D771;MATHEMATICAL SANS-SERIF BOLD SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; +1D772;MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +1D773;MATHEMATICAL SANS-SERIF BOLD SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; +1D774;MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; +1D775;MATHEMATICAL SANS-SERIF BOLD SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; +1D776;MATHEMATICAL SANS-SERIF BOLD SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; +1D777;MATHEMATICAL SANS-SERIF BOLD SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; +1D778;MATHEMATICAL SANS-SERIF BOLD SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; +1D779;MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; +1D77A;MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; +1D77B;MATHEMATICAL SANS-SERIF BOLD SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; +1D77C;MATHEMATICAL SANS-SERIF BOLD SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; +1D77D;MATHEMATICAL SANS-SERIF BOLD SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; +1D77E;MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; +1D77F;MATHEMATICAL SANS-SERIF BOLD SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +1D780;MATHEMATICAL SANS-SERIF BOLD SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; +1D781;MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; +1D782;MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; +1D783;MATHEMATICAL SANS-SERIF BOLD SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; +1D784;MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; +1D785;MATHEMATICAL SANS-SERIF BOLD SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; +1D786;MATHEMATICAL SANS-SERIF BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; +1D787;MATHEMATICAL SANS-SERIF BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; +1D788;MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; +1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;N;;;;; +1D78A;MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; +1D78B;MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; +1D78C;MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; +1D78D;MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; +1D78E;MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; +1D78F;MATHEMATICAL SANS-SERIF BOLD PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; +1D790;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; +1D791;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; +1D792;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +1D793;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; +1D794;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; +1D795;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; +1D796;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; +1D797;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; +1D798;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; +1D799;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; +1D79A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; +1D79B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; +1D79C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; +1D79D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; +1D79E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; +1D79F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +1D7A0;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; +1D7A1;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; +1D7A2;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; +1D7A3;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; +1D7A4;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; +1D7A5;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; +1D7A6;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; +1D7A7;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; +1D7A8;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; +1D7A9;MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;; +1D7AA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; +1D7AB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; +1D7AC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +1D7AD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; +1D7AE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; +1D7AF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; +1D7B0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; +1D7B1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; +1D7B2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; +1D7B3;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; +1D7B4;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; +1D7B5;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; +1D7B6;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; +1D7B7;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; +1D7B8;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; +1D7B9;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +1D7BA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; +1D7BB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; +1D7BC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; +1D7BD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; +1D7BE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; +1D7BF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; +1D7C0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; +1D7C1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; +1D7C2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; +1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;N;;;;; +1D7C4;MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; +1D7C5;MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; +1D7C6;MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; +1D7C7;MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; +1D7C8;MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; +1D7C9;MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; +1D7CE;MATHEMATICAL BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; +1D7CF;MATHEMATICAL BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; +1D7D0;MATHEMATICAL BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; +1D7D1;MATHEMATICAL BOLD DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; +1D7D2;MATHEMATICAL BOLD DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; +1D7D3;MATHEMATICAL BOLD DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; +1D7D4;MATHEMATICAL BOLD DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; +1D7D5;MATHEMATICAL BOLD DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; +1D7D6;MATHEMATICAL BOLD DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; +1D7D7;MATHEMATICAL BOLD DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +1D7D8;MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; +1D7D9;MATHEMATICAL DOUBLE-STRUCK DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; +1D7DA;MATHEMATICAL DOUBLE-STRUCK DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; +1D7DB;MATHEMATICAL DOUBLE-STRUCK DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; +1D7DC;MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; +1D7DD;MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; +1D7DE;MATHEMATICAL DOUBLE-STRUCK DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; +1D7DF;MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; +1D7E0;MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; +1D7E1;MATHEMATICAL DOUBLE-STRUCK DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +1D7E2;MATHEMATICAL SANS-SERIF DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; +1D7E3;MATHEMATICAL SANS-SERIF DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; +1D7E4;MATHEMATICAL SANS-SERIF DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; +1D7E5;MATHEMATICAL SANS-SERIF DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; +1D7E6;MATHEMATICAL SANS-SERIF DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; +1D7E7;MATHEMATICAL SANS-SERIF DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; +1D7E8;MATHEMATICAL SANS-SERIF DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; +1D7E9;MATHEMATICAL SANS-SERIF DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; +1D7EA;MATHEMATICAL SANS-SERIF DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; +1D7EB;MATHEMATICAL SANS-SERIF DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +1D7EC;MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; +1D7ED;MATHEMATICAL SANS-SERIF BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; +1D7EE;MATHEMATICAL SANS-SERIF BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; +1D7EF;MATHEMATICAL SANS-SERIF BOLD DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; +1D7F0;MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; +1D7F1;MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; +1D7F2;MATHEMATICAL SANS-SERIF BOLD DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; +1D7F3;MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; +1D7F4;MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; +1D7F5;MATHEMATICAL SANS-SERIF BOLD DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +1D7F6;MATHEMATICAL MONOSPACE DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; +1D7F7;MATHEMATICAL MONOSPACE DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; +1D7F8;MATHEMATICAL MONOSPACE DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; +1D7F9;MATHEMATICAL MONOSPACE DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; +1D7FA;MATHEMATICAL MONOSPACE DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; +1D7FB;MATHEMATICAL MONOSPACE DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; +1D7FC;MATHEMATICAL MONOSPACE DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; +1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; +1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; +1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +20000;<CJK Ideograph Extension B, First>;Lo;0;L;;;;;N;;;;; +2A6D6;<CJK Ideograph Extension B, Last>;Lo;0;L;;;;;N;;;;; +2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;; +2F801;CJK COMPATIBILITY IDEOGRAPH-2F801;Lo;0;L;4E38;;;;N;;;;; +2F802;CJK COMPATIBILITY IDEOGRAPH-2F802;Lo;0;L;4E41;;;;N;;;;; +2F803;CJK COMPATIBILITY IDEOGRAPH-2F803;Lo;0;L;20122;;;;N;;;;; +2F804;CJK COMPATIBILITY IDEOGRAPH-2F804;Lo;0;L;4F60;;;;N;;;;; +2F805;CJK COMPATIBILITY IDEOGRAPH-2F805;Lo;0;L;4FAE;;;;N;;;;; +2F806;CJK COMPATIBILITY IDEOGRAPH-2F806;Lo;0;L;4FBB;;;;N;;;;; +2F807;CJK COMPATIBILITY IDEOGRAPH-2F807;Lo;0;L;5002;;;;N;;;;; +2F808;CJK COMPATIBILITY IDEOGRAPH-2F808;Lo;0;L;507A;;;;N;;;;; +2F809;CJK COMPATIBILITY IDEOGRAPH-2F809;Lo;0;L;5099;;;;N;;;;; +2F80A;CJK COMPATIBILITY IDEOGRAPH-2F80A;Lo;0;L;50E7;;;;N;;;;; +2F80B;CJK COMPATIBILITY IDEOGRAPH-2F80B;Lo;0;L;50CF;;;;N;;;;; +2F80C;CJK COMPATIBILITY IDEOGRAPH-2F80C;Lo;0;L;349E;;;;N;;;;; +2F80D;CJK COMPATIBILITY IDEOGRAPH-2F80D;Lo;0;L;2063A;;;;N;;;;; +2F80E;CJK COMPATIBILITY IDEOGRAPH-2F80E;Lo;0;L;514D;;;;N;;;;; +2F80F;CJK COMPATIBILITY IDEOGRAPH-2F80F;Lo;0;L;5154;;;;N;;;;; +2F810;CJK COMPATIBILITY IDEOGRAPH-2F810;Lo;0;L;5164;;;;N;;;;; +2F811;CJK COMPATIBILITY IDEOGRAPH-2F811;Lo;0;L;5177;;;;N;;;;; +2F812;CJK COMPATIBILITY IDEOGRAPH-2F812;Lo;0;L;2051C;;;;N;;;;; +2F813;CJK COMPATIBILITY IDEOGRAPH-2F813;Lo;0;L;34B9;;;;N;;;;; +2F814;CJK COMPATIBILITY IDEOGRAPH-2F814;Lo;0;L;5167;;;;N;;;;; +2F815;CJK COMPATIBILITY IDEOGRAPH-2F815;Lo;0;L;518D;;;;N;;;;; +2F816;CJK COMPATIBILITY IDEOGRAPH-2F816;Lo;0;L;2054B;;;;N;;;;; +2F817;CJK COMPATIBILITY IDEOGRAPH-2F817;Lo;0;L;5197;;;;N;;;;; +2F818;CJK COMPATIBILITY IDEOGRAPH-2F818;Lo;0;L;51A4;;;;N;;;;; +2F819;CJK COMPATIBILITY IDEOGRAPH-2F819;Lo;0;L;4ECC;;;;N;;;;; +2F81A;CJK COMPATIBILITY IDEOGRAPH-2F81A;Lo;0;L;51AC;;;;N;;;;; +2F81B;CJK COMPATIBILITY IDEOGRAPH-2F81B;Lo;0;L;51B5;;;;N;;;;; +2F81C;CJK COMPATIBILITY IDEOGRAPH-2F81C;Lo;0;L;291DF;;;;N;;;;; +2F81D;CJK COMPATIBILITY IDEOGRAPH-2F81D;Lo;0;L;51F5;;;;N;;;;; +2F81E;CJK COMPATIBILITY IDEOGRAPH-2F81E;Lo;0;L;5203;;;;N;;;;; +2F81F;CJK COMPATIBILITY IDEOGRAPH-2F81F;Lo;0;L;34DF;;;;N;;;;; +2F820;CJK COMPATIBILITY IDEOGRAPH-2F820;Lo;0;L;523B;;;;N;;;;; +2F821;CJK COMPATIBILITY IDEOGRAPH-2F821;Lo;0;L;5246;;;;N;;;;; +2F822;CJK COMPATIBILITY IDEOGRAPH-2F822;Lo;0;L;5272;;;;N;;;;; +2F823;CJK COMPATIBILITY IDEOGRAPH-2F823;Lo;0;L;5277;;;;N;;;;; +2F824;CJK COMPATIBILITY IDEOGRAPH-2F824;Lo;0;L;3515;;;;N;;;;; +2F825;CJK COMPATIBILITY IDEOGRAPH-2F825;Lo;0;L;52C7;;;;N;;;;; +2F826;CJK COMPATIBILITY IDEOGRAPH-2F826;Lo;0;L;52C9;;;;N;;;;; +2F827;CJK COMPATIBILITY IDEOGRAPH-2F827;Lo;0;L;52E4;;;;N;;;;; +2F828;CJK COMPATIBILITY IDEOGRAPH-2F828;Lo;0;L;52FA;;;;N;;;;; +2F829;CJK COMPATIBILITY IDEOGRAPH-2F829;Lo;0;L;5305;;;;N;;;;; +2F82A;CJK COMPATIBILITY IDEOGRAPH-2F82A;Lo;0;L;5306;;;;N;;;;; +2F82B;CJK COMPATIBILITY IDEOGRAPH-2F82B;Lo;0;L;5317;;;;N;;;;; +2F82C;CJK COMPATIBILITY IDEOGRAPH-2F82C;Lo;0;L;5349;;;;N;;;;; +2F82D;CJK COMPATIBILITY IDEOGRAPH-2F82D;Lo;0;L;5351;;;;N;;;;; +2F82E;CJK COMPATIBILITY IDEOGRAPH-2F82E;Lo;0;L;535A;;;;N;;;;; +2F82F;CJK COMPATIBILITY IDEOGRAPH-2F82F;Lo;0;L;5373;;;;N;;;;; +2F830;CJK COMPATIBILITY IDEOGRAPH-2F830;Lo;0;L;537D;;;;N;;;;; +2F831;CJK COMPATIBILITY IDEOGRAPH-2F831;Lo;0;L;537F;;;;N;;;;; +2F832;CJK COMPATIBILITY IDEOGRAPH-2F832;Lo;0;L;537F;;;;N;;;;; +2F833;CJK COMPATIBILITY IDEOGRAPH-2F833;Lo;0;L;537F;;;;N;;;;; +2F834;CJK COMPATIBILITY IDEOGRAPH-2F834;Lo;0;L;20A2C;;;;N;;;;; +2F835;CJK COMPATIBILITY IDEOGRAPH-2F835;Lo;0;L;7070;;;;N;;;;; +2F836;CJK COMPATIBILITY IDEOGRAPH-2F836;Lo;0;L;53CA;;;;N;;;;; +2F837;CJK COMPATIBILITY IDEOGRAPH-2F837;Lo;0;L;53DF;;;;N;;;;; +2F838;CJK COMPATIBILITY IDEOGRAPH-2F838;Lo;0;L;20B63;;;;N;;;;; +2F839;CJK COMPATIBILITY IDEOGRAPH-2F839;Lo;0;L;53EB;;;;N;;;;; +2F83A;CJK COMPATIBILITY IDEOGRAPH-2F83A;Lo;0;L;53F1;;;;N;;;;; +2F83B;CJK COMPATIBILITY IDEOGRAPH-2F83B;Lo;0;L;5406;;;;N;;;;; +2F83C;CJK COMPATIBILITY IDEOGRAPH-2F83C;Lo;0;L;549E;;;;N;;;;; +2F83D;CJK COMPATIBILITY IDEOGRAPH-2F83D;Lo;0;L;5438;;;;N;;;;; +2F83E;CJK COMPATIBILITY IDEOGRAPH-2F83E;Lo;0;L;5448;;;;N;;;;; +2F83F;CJK COMPATIBILITY IDEOGRAPH-2F83F;Lo;0;L;5468;;;;N;;;;; +2F840;CJK COMPATIBILITY IDEOGRAPH-2F840;Lo;0;L;54A2;;;;N;;;;; +2F841;CJK COMPATIBILITY IDEOGRAPH-2F841;Lo;0;L;54F6;;;;N;;;;; +2F842;CJK COMPATIBILITY IDEOGRAPH-2F842;Lo;0;L;5510;;;;N;;;;; +2F843;CJK COMPATIBILITY IDEOGRAPH-2F843;Lo;0;L;5553;;;;N;;;;; +2F844;CJK COMPATIBILITY IDEOGRAPH-2F844;Lo;0;L;5563;;;;N;;;;; +2F845;CJK COMPATIBILITY IDEOGRAPH-2F845;Lo;0;L;5584;;;;N;;;;; +2F846;CJK COMPATIBILITY IDEOGRAPH-2F846;Lo;0;L;5584;;;;N;;;;; +2F847;CJK COMPATIBILITY IDEOGRAPH-2F847;Lo;0;L;5599;;;;N;;;;; +2F848;CJK COMPATIBILITY IDEOGRAPH-2F848;Lo;0;L;55AB;;;;N;;;;; +2F849;CJK COMPATIBILITY IDEOGRAPH-2F849;Lo;0;L;55B3;;;;N;;;;; +2F84A;CJK COMPATIBILITY IDEOGRAPH-2F84A;Lo;0;L;55C2;;;;N;;;;; +2F84B;CJK COMPATIBILITY IDEOGRAPH-2F84B;Lo;0;L;5716;;;;N;;;;; +2F84C;CJK COMPATIBILITY IDEOGRAPH-2F84C;Lo;0;L;5606;;;;N;;;;; +2F84D;CJK COMPATIBILITY IDEOGRAPH-2F84D;Lo;0;L;5717;;;;N;;;;; +2F84E;CJK COMPATIBILITY IDEOGRAPH-2F84E;Lo;0;L;5651;;;;N;;;;; +2F84F;CJK COMPATIBILITY IDEOGRAPH-2F84F;Lo;0;L;5674;;;;N;;;;; +2F850;CJK COMPATIBILITY IDEOGRAPH-2F850;Lo;0;L;5207;;;;N;;;;; +2F851;CJK COMPATIBILITY IDEOGRAPH-2F851;Lo;0;L;58EE;;;;N;;;;; +2F852;CJK COMPATIBILITY IDEOGRAPH-2F852;Lo;0;L;57CE;;;;N;;;;; +2F853;CJK COMPATIBILITY IDEOGRAPH-2F853;Lo;0;L;57F4;;;;N;;;;; +2F854;CJK COMPATIBILITY IDEOGRAPH-2F854;Lo;0;L;580D;;;;N;;;;; +2F855;CJK COMPATIBILITY IDEOGRAPH-2F855;Lo;0;L;578B;;;;N;;;;; +2F856;CJK COMPATIBILITY IDEOGRAPH-2F856;Lo;0;L;5832;;;;N;;;;; +2F857;CJK COMPATIBILITY IDEOGRAPH-2F857;Lo;0;L;5831;;;;N;;;;; +2F858;CJK COMPATIBILITY IDEOGRAPH-2F858;Lo;0;L;58AC;;;;N;;;;; +2F859;CJK COMPATIBILITY IDEOGRAPH-2F859;Lo;0;L;214E4;;;;N;;;;; +2F85A;CJK COMPATIBILITY IDEOGRAPH-2F85A;Lo;0;L;58F2;;;;N;;;;; +2F85B;CJK COMPATIBILITY IDEOGRAPH-2F85B;Lo;0;L;58F7;;;;N;;;;; +2F85C;CJK COMPATIBILITY IDEOGRAPH-2F85C;Lo;0;L;5906;;;;N;;;;; +2F85D;CJK COMPATIBILITY IDEOGRAPH-2F85D;Lo;0;L;591A;;;;N;;;;; +2F85E;CJK COMPATIBILITY IDEOGRAPH-2F85E;Lo;0;L;5922;;;;N;;;;; +2F85F;CJK COMPATIBILITY IDEOGRAPH-2F85F;Lo;0;L;5962;;;;N;;;;; +2F860;CJK COMPATIBILITY IDEOGRAPH-2F860;Lo;0;L;216A8;;;;N;;;;; +2F861;CJK COMPATIBILITY IDEOGRAPH-2F861;Lo;0;L;216EA;;;;N;;;;; +2F862;CJK COMPATIBILITY IDEOGRAPH-2F862;Lo;0;L;59EC;;;;N;;;;; +2F863;CJK COMPATIBILITY IDEOGRAPH-2F863;Lo;0;L;5A1B;;;;N;;;;; +2F864;CJK COMPATIBILITY IDEOGRAPH-2F864;Lo;0;L;5A27;;;;N;;;;; +2F865;CJK COMPATIBILITY IDEOGRAPH-2F865;Lo;0;L;59D8;;;;N;;;;; +2F866;CJK COMPATIBILITY IDEOGRAPH-2F866;Lo;0;L;5A66;;;;N;;;;; +2F867;CJK COMPATIBILITY IDEOGRAPH-2F867;Lo;0;L;36EE;;;;N;;;;; +2F868;CJK COMPATIBILITY IDEOGRAPH-2F868;Lo;0;L;2136A;;;;N;;;;; +2F869;CJK COMPATIBILITY IDEOGRAPH-2F869;Lo;0;L;5B08;;;;N;;;;; +2F86A;CJK COMPATIBILITY IDEOGRAPH-2F86A;Lo;0;L;5B3E;;;;N;;;;; +2F86B;CJK COMPATIBILITY IDEOGRAPH-2F86B;Lo;0;L;5B3E;;;;N;;;;; +2F86C;CJK COMPATIBILITY IDEOGRAPH-2F86C;Lo;0;L;219C8;;;;N;;;;; +2F86D;CJK COMPATIBILITY IDEOGRAPH-2F86D;Lo;0;L;5BC3;;;;N;;;;; +2F86E;CJK COMPATIBILITY IDEOGRAPH-2F86E;Lo;0;L;5BD8;;;;N;;;;; +2F86F;CJK COMPATIBILITY IDEOGRAPH-2F86F;Lo;0;L;5BE7;;;;N;;;;; +2F870;CJK COMPATIBILITY IDEOGRAPH-2F870;Lo;0;L;5BF3;;;;N;;;;; +2F871;CJK COMPATIBILITY IDEOGRAPH-2F871;Lo;0;L;21B18;;;;N;;;;; +2F872;CJK COMPATIBILITY IDEOGRAPH-2F872;Lo;0;L;5BFF;;;;N;;;;; +2F873;CJK COMPATIBILITY IDEOGRAPH-2F873;Lo;0;L;5C06;;;;N;;;;; +2F874;CJK COMPATIBILITY IDEOGRAPH-2F874;Lo;0;L;5F33;;;;N;;;;; +2F875;CJK COMPATIBILITY IDEOGRAPH-2F875;Lo;0;L;5C22;;;;N;;;;; +2F876;CJK COMPATIBILITY IDEOGRAPH-2F876;Lo;0;L;3781;;;;N;;;;; +2F877;CJK COMPATIBILITY IDEOGRAPH-2F877;Lo;0;L;5C60;;;;N;;;;; +2F878;CJK COMPATIBILITY IDEOGRAPH-2F878;Lo;0;L;5C6E;;;;N;;;;; +2F879;CJK COMPATIBILITY IDEOGRAPH-2F879;Lo;0;L;5CC0;;;;N;;;;; +2F87A;CJK COMPATIBILITY IDEOGRAPH-2F87A;Lo;0;L;5C8D;;;;N;;;;; +2F87B;CJK COMPATIBILITY IDEOGRAPH-2F87B;Lo;0;L;21DE4;;;;N;;;;; +2F87C;CJK COMPATIBILITY IDEOGRAPH-2F87C;Lo;0;L;5D43;;;;N;;;;; +2F87D;CJK COMPATIBILITY IDEOGRAPH-2F87D;Lo;0;L;21DE6;;;;N;;;;; +2F87E;CJK COMPATIBILITY IDEOGRAPH-2F87E;Lo;0;L;5D6E;;;;N;;;;; +2F87F;CJK COMPATIBILITY IDEOGRAPH-2F87F;Lo;0;L;5D6B;;;;N;;;;; +2F880;CJK COMPATIBILITY IDEOGRAPH-2F880;Lo;0;L;5D7C;;;;N;;;;; +2F881;CJK COMPATIBILITY IDEOGRAPH-2F881;Lo;0;L;5DE1;;;;N;;;;; +2F882;CJK COMPATIBILITY IDEOGRAPH-2F882;Lo;0;L;5DE2;;;;N;;;;; +2F883;CJK COMPATIBILITY IDEOGRAPH-2F883;Lo;0;L;382F;;;;N;;;;; +2F884;CJK COMPATIBILITY IDEOGRAPH-2F884;Lo;0;L;5DFD;;;;N;;;;; +2F885;CJK COMPATIBILITY IDEOGRAPH-2F885;Lo;0;L;5E28;;;;N;;;;; +2F886;CJK COMPATIBILITY IDEOGRAPH-2F886;Lo;0;L;5E3D;;;;N;;;;; +2F887;CJK COMPATIBILITY IDEOGRAPH-2F887;Lo;0;L;5E69;;;;N;;;;; +2F888;CJK COMPATIBILITY IDEOGRAPH-2F888;Lo;0;L;3862;;;;N;;;;; +2F889;CJK COMPATIBILITY IDEOGRAPH-2F889;Lo;0;L;22183;;;;N;;;;; +2F88A;CJK COMPATIBILITY IDEOGRAPH-2F88A;Lo;0;L;387C;;;;N;;;;; +2F88B;CJK COMPATIBILITY IDEOGRAPH-2F88B;Lo;0;L;5EB0;;;;N;;;;; +2F88C;CJK COMPATIBILITY IDEOGRAPH-2F88C;Lo;0;L;5EB3;;;;N;;;;; +2F88D;CJK COMPATIBILITY IDEOGRAPH-2F88D;Lo;0;L;5EB6;;;;N;;;;; +2F88E;CJK COMPATIBILITY IDEOGRAPH-2F88E;Lo;0;L;5ECA;;;;N;;;;; +2F88F;CJK COMPATIBILITY IDEOGRAPH-2F88F;Lo;0;L;2A392;;;;N;;;;; +2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;;N;;;;; +2F891;CJK COMPATIBILITY IDEOGRAPH-2F891;Lo;0;L;22331;;;;N;;;;; +2F892;CJK COMPATIBILITY IDEOGRAPH-2F892;Lo;0;L;22331;;;;N;;;;; +2F893;CJK COMPATIBILITY IDEOGRAPH-2F893;Lo;0;L;8201;;;;N;;;;; +2F894;CJK COMPATIBILITY IDEOGRAPH-2F894;Lo;0;L;5F22;;;;N;;;;; +2F895;CJK COMPATIBILITY IDEOGRAPH-2F895;Lo;0;L;5F22;;;;N;;;;; +2F896;CJK COMPATIBILITY IDEOGRAPH-2F896;Lo;0;L;38C7;;;;N;;;;; +2F897;CJK COMPATIBILITY IDEOGRAPH-2F897;Lo;0;L;232B8;;;;N;;;;; +2F898;CJK COMPATIBILITY IDEOGRAPH-2F898;Lo;0;L;261DA;;;;N;;;;; +2F899;CJK COMPATIBILITY IDEOGRAPH-2F899;Lo;0;L;5F62;;;;N;;;;; +2F89A;CJK COMPATIBILITY IDEOGRAPH-2F89A;Lo;0;L;5F6B;;;;N;;;;; +2F89B;CJK COMPATIBILITY IDEOGRAPH-2F89B;Lo;0;L;38E3;;;;N;;;;; +2F89C;CJK COMPATIBILITY IDEOGRAPH-2F89C;Lo;0;L;5F9A;;;;N;;;;; +2F89D;CJK COMPATIBILITY IDEOGRAPH-2F89D;Lo;0;L;5FCD;;;;N;;;;; +2F89E;CJK COMPATIBILITY IDEOGRAPH-2F89E;Lo;0;L;5FD7;;;;N;;;;; +2F89F;CJK COMPATIBILITY IDEOGRAPH-2F89F;Lo;0;L;5FF9;;;;N;;;;; +2F8A0;CJK COMPATIBILITY IDEOGRAPH-2F8A0;Lo;0;L;6081;;;;N;;;;; +2F8A1;CJK COMPATIBILITY IDEOGRAPH-2F8A1;Lo;0;L;393A;;;;N;;;;; +2F8A2;CJK COMPATIBILITY IDEOGRAPH-2F8A2;Lo;0;L;391C;;;;N;;;;; +2F8A3;CJK COMPATIBILITY IDEOGRAPH-2F8A3;Lo;0;L;6094;;;;N;;;;; +2F8A4;CJK COMPATIBILITY IDEOGRAPH-2F8A4;Lo;0;L;226D4;;;;N;;;;; +2F8A5;CJK COMPATIBILITY IDEOGRAPH-2F8A5;Lo;0;L;60C7;;;;N;;;;; +2F8A6;CJK COMPATIBILITY IDEOGRAPH-2F8A6;Lo;0;L;6148;;;;N;;;;; +2F8A7;CJK COMPATIBILITY IDEOGRAPH-2F8A7;Lo;0;L;614C;;;;N;;;;; +2F8A8;CJK COMPATIBILITY IDEOGRAPH-2F8A8;Lo;0;L;614E;;;;N;;;;; +2F8A9;CJK COMPATIBILITY IDEOGRAPH-2F8A9;Lo;0;L;614C;;;;N;;;;; +2F8AA;CJK COMPATIBILITY IDEOGRAPH-2F8AA;Lo;0;L;617A;;;;N;;;;; +2F8AB;CJK COMPATIBILITY IDEOGRAPH-2F8AB;Lo;0;L;618E;;;;N;;;;; +2F8AC;CJK COMPATIBILITY IDEOGRAPH-2F8AC;Lo;0;L;61B2;;;;N;;;;; +2F8AD;CJK COMPATIBILITY IDEOGRAPH-2F8AD;Lo;0;L;61A4;;;;N;;;;; +2F8AE;CJK COMPATIBILITY IDEOGRAPH-2F8AE;Lo;0;L;61AF;;;;N;;;;; +2F8AF;CJK COMPATIBILITY IDEOGRAPH-2F8AF;Lo;0;L;61DE;;;;N;;;;; +2F8B0;CJK COMPATIBILITY IDEOGRAPH-2F8B0;Lo;0;L;61F2;;;;N;;;;; +2F8B1;CJK COMPATIBILITY IDEOGRAPH-2F8B1;Lo;0;L;61F6;;;;N;;;;; +2F8B2;CJK COMPATIBILITY IDEOGRAPH-2F8B2;Lo;0;L;6210;;;;N;;;;; +2F8B3;CJK COMPATIBILITY IDEOGRAPH-2F8B3;Lo;0;L;621B;;;;N;;;;; +2F8B4;CJK COMPATIBILITY IDEOGRAPH-2F8B4;Lo;0;L;625D;;;;N;;;;; +2F8B5;CJK COMPATIBILITY IDEOGRAPH-2F8B5;Lo;0;L;62B1;;;;N;;;;; +2F8B6;CJK COMPATIBILITY IDEOGRAPH-2F8B6;Lo;0;L;62D4;;;;N;;;;; +2F8B7;CJK COMPATIBILITY IDEOGRAPH-2F8B7;Lo;0;L;6350;;;;N;;;;; +2F8B8;CJK COMPATIBILITY IDEOGRAPH-2F8B8;Lo;0;L;22B0C;;;;N;;;;; +2F8B9;CJK COMPATIBILITY IDEOGRAPH-2F8B9;Lo;0;L;633D;;;;N;;;;; +2F8BA;CJK COMPATIBILITY IDEOGRAPH-2F8BA;Lo;0;L;62FC;;;;N;;;;; +2F8BB;CJK COMPATIBILITY IDEOGRAPH-2F8BB;Lo;0;L;6368;;;;N;;;;; +2F8BC;CJK COMPATIBILITY IDEOGRAPH-2F8BC;Lo;0;L;6383;;;;N;;;;; +2F8BD;CJK COMPATIBILITY IDEOGRAPH-2F8BD;Lo;0;L;63E4;;;;N;;;;; +2F8BE;CJK COMPATIBILITY IDEOGRAPH-2F8BE;Lo;0;L;22BF1;;;;N;;;;; +2F8BF;CJK COMPATIBILITY IDEOGRAPH-2F8BF;Lo;0;L;6422;;;;N;;;;; +2F8C0;CJK COMPATIBILITY IDEOGRAPH-2F8C0;Lo;0;L;63C5;;;;N;;;;; +2F8C1;CJK COMPATIBILITY IDEOGRAPH-2F8C1;Lo;0;L;63A9;;;;N;;;;; +2F8C2;CJK COMPATIBILITY IDEOGRAPH-2F8C2;Lo;0;L;3A2E;;;;N;;;;; +2F8C3;CJK COMPATIBILITY IDEOGRAPH-2F8C3;Lo;0;L;6469;;;;N;;;;; +2F8C4;CJK COMPATIBILITY IDEOGRAPH-2F8C4;Lo;0;L;647E;;;;N;;;;; +2F8C5;CJK COMPATIBILITY IDEOGRAPH-2F8C5;Lo;0;L;649D;;;;N;;;;; +2F8C6;CJK COMPATIBILITY IDEOGRAPH-2F8C6;Lo;0;L;6477;;;;N;;;;; +2F8C7;CJK COMPATIBILITY IDEOGRAPH-2F8C7;Lo;0;L;3A6C;;;;N;;;;; +2F8C8;CJK COMPATIBILITY IDEOGRAPH-2F8C8;Lo;0;L;654F;;;;N;;;;; +2F8C9;CJK COMPATIBILITY IDEOGRAPH-2F8C9;Lo;0;L;656C;;;;N;;;;; +2F8CA;CJK COMPATIBILITY IDEOGRAPH-2F8CA;Lo;0;L;2300A;;;;N;;;;; +2F8CB;CJK COMPATIBILITY IDEOGRAPH-2F8CB;Lo;0;L;65E3;;;;N;;;;; +2F8CC;CJK COMPATIBILITY IDEOGRAPH-2F8CC;Lo;0;L;66F8;;;;N;;;;; +2F8CD;CJK COMPATIBILITY IDEOGRAPH-2F8CD;Lo;0;L;6649;;;;N;;;;; +2F8CE;CJK COMPATIBILITY IDEOGRAPH-2F8CE;Lo;0;L;3B19;;;;N;;;;; +2F8CF;CJK COMPATIBILITY IDEOGRAPH-2F8CF;Lo;0;L;6691;;;;N;;;;; +2F8D0;CJK COMPATIBILITY IDEOGRAPH-2F8D0;Lo;0;L;3B08;;;;N;;;;; +2F8D1;CJK COMPATIBILITY IDEOGRAPH-2F8D1;Lo;0;L;3AE4;;;;N;;;;; +2F8D2;CJK COMPATIBILITY IDEOGRAPH-2F8D2;Lo;0;L;5192;;;;N;;;;; +2F8D3;CJK COMPATIBILITY IDEOGRAPH-2F8D3;Lo;0;L;5195;;;;N;;;;; +2F8D4;CJK COMPATIBILITY IDEOGRAPH-2F8D4;Lo;0;L;6700;;;;N;;;;; +2F8D5;CJK COMPATIBILITY IDEOGRAPH-2F8D5;Lo;0;L;669C;;;;N;;;;; +2F8D6;CJK COMPATIBILITY IDEOGRAPH-2F8D6;Lo;0;L;80AD;;;;N;;;;; +2F8D7;CJK COMPATIBILITY IDEOGRAPH-2F8D7;Lo;0;L;43D9;;;;N;;;;; +2F8D8;CJK COMPATIBILITY IDEOGRAPH-2F8D8;Lo;0;L;6717;;;;N;;;;; +2F8D9;CJK COMPATIBILITY IDEOGRAPH-2F8D9;Lo;0;L;671B;;;;N;;;;; +2F8DA;CJK COMPATIBILITY IDEOGRAPH-2F8DA;Lo;0;L;6721;;;;N;;;;; +2F8DB;CJK COMPATIBILITY IDEOGRAPH-2F8DB;Lo;0;L;675E;;;;N;;;;; +2F8DC;CJK COMPATIBILITY IDEOGRAPH-2F8DC;Lo;0;L;6753;;;;N;;;;; +2F8DD;CJK COMPATIBILITY IDEOGRAPH-2F8DD;Lo;0;L;233C3;;;;N;;;;; +2F8DE;CJK COMPATIBILITY IDEOGRAPH-2F8DE;Lo;0;L;3B49;;;;N;;;;; +2F8DF;CJK COMPATIBILITY IDEOGRAPH-2F8DF;Lo;0;L;67FA;;;;N;;;;; +2F8E0;CJK COMPATIBILITY IDEOGRAPH-2F8E0;Lo;0;L;6785;;;;N;;;;; +2F8E1;CJK COMPATIBILITY IDEOGRAPH-2F8E1;Lo;0;L;6852;;;;N;;;;; +2F8E2;CJK COMPATIBILITY IDEOGRAPH-2F8E2;Lo;0;L;6885;;;;N;;;;; +2F8E3;CJK COMPATIBILITY IDEOGRAPH-2F8E3;Lo;0;L;2346D;;;;N;;;;; +2F8E4;CJK COMPATIBILITY IDEOGRAPH-2F8E4;Lo;0;L;688E;;;;N;;;;; +2F8E5;CJK COMPATIBILITY IDEOGRAPH-2F8E5;Lo;0;L;681F;;;;N;;;;; +2F8E6;CJK COMPATIBILITY IDEOGRAPH-2F8E6;Lo;0;L;6914;;;;N;;;;; +2F8E7;CJK COMPATIBILITY IDEOGRAPH-2F8E7;Lo;0;L;3B9D;;;;N;;;;; +2F8E8;CJK COMPATIBILITY IDEOGRAPH-2F8E8;Lo;0;L;6942;;;;N;;;;; +2F8E9;CJK COMPATIBILITY IDEOGRAPH-2F8E9;Lo;0;L;69A3;;;;N;;;;; +2F8EA;CJK COMPATIBILITY IDEOGRAPH-2F8EA;Lo;0;L;69EA;;;;N;;;;; +2F8EB;CJK COMPATIBILITY IDEOGRAPH-2F8EB;Lo;0;L;6AA8;;;;N;;;;; +2F8EC;CJK COMPATIBILITY IDEOGRAPH-2F8EC;Lo;0;L;236A3;;;;N;;;;; +2F8ED;CJK COMPATIBILITY IDEOGRAPH-2F8ED;Lo;0;L;6ADB;;;;N;;;;; +2F8EE;CJK COMPATIBILITY IDEOGRAPH-2F8EE;Lo;0;L;3C18;;;;N;;;;; +2F8EF;CJK COMPATIBILITY IDEOGRAPH-2F8EF;Lo;0;L;6B21;;;;N;;;;; +2F8F0;CJK COMPATIBILITY IDEOGRAPH-2F8F0;Lo;0;L;238A7;;;;N;;;;; +2F8F1;CJK COMPATIBILITY IDEOGRAPH-2F8F1;Lo;0;L;6B54;;;;N;;;;; +2F8F2;CJK COMPATIBILITY IDEOGRAPH-2F8F2;Lo;0;L;3C4E;;;;N;;;;; +2F8F3;CJK COMPATIBILITY IDEOGRAPH-2F8F3;Lo;0;L;6B72;;;;N;;;;; +2F8F4;CJK COMPATIBILITY IDEOGRAPH-2F8F4;Lo;0;L;6B9F;;;;N;;;;; +2F8F5;CJK COMPATIBILITY IDEOGRAPH-2F8F5;Lo;0;L;6BBA;;;;N;;;;; +2F8F6;CJK COMPATIBILITY IDEOGRAPH-2F8F6;Lo;0;L;6BBB;;;;N;;;;; +2F8F7;CJK COMPATIBILITY IDEOGRAPH-2F8F7;Lo;0;L;23A8D;;;;N;;;;; +2F8F8;CJK COMPATIBILITY IDEOGRAPH-2F8F8;Lo;0;L;21D0B;;;;N;;;;; +2F8F9;CJK COMPATIBILITY IDEOGRAPH-2F8F9;Lo;0;L;23AFA;;;;N;;;;; +2F8FA;CJK COMPATIBILITY IDEOGRAPH-2F8FA;Lo;0;L;6C4E;;;;N;;;;; +2F8FB;CJK COMPATIBILITY IDEOGRAPH-2F8FB;Lo;0;L;23CBC;;;;N;;;;; +2F8FC;CJK COMPATIBILITY IDEOGRAPH-2F8FC;Lo;0;L;6CBF;;;;N;;;;; +2F8FD;CJK COMPATIBILITY IDEOGRAPH-2F8FD;Lo;0;L;6CCD;;;;N;;;;; +2F8FE;CJK COMPATIBILITY IDEOGRAPH-2F8FE;Lo;0;L;6C67;;;;N;;;;; +2F8FF;CJK COMPATIBILITY IDEOGRAPH-2F8FF;Lo;0;L;6D16;;;;N;;;;; +2F900;CJK COMPATIBILITY IDEOGRAPH-2F900;Lo;0;L;6D3E;;;;N;;;;; +2F901;CJK COMPATIBILITY IDEOGRAPH-2F901;Lo;0;L;6D77;;;;N;;;;; +2F902;CJK COMPATIBILITY IDEOGRAPH-2F902;Lo;0;L;6D41;;;;N;;;;; +2F903;CJK COMPATIBILITY IDEOGRAPH-2F903;Lo;0;L;6D69;;;;N;;;;; +2F904;CJK COMPATIBILITY IDEOGRAPH-2F904;Lo;0;L;6D78;;;;N;;;;; +2F905;CJK COMPATIBILITY IDEOGRAPH-2F905;Lo;0;L;6D85;;;;N;;;;; +2F906;CJK COMPATIBILITY IDEOGRAPH-2F906;Lo;0;L;23D1E;;;;N;;;;; +2F907;CJK COMPATIBILITY IDEOGRAPH-2F907;Lo;0;L;6D34;;;;N;;;;; +2F908;CJK COMPATIBILITY IDEOGRAPH-2F908;Lo;0;L;6E2F;;;;N;;;;; +2F909;CJK COMPATIBILITY IDEOGRAPH-2F909;Lo;0;L;6E6E;;;;N;;;;; +2F90A;CJK COMPATIBILITY IDEOGRAPH-2F90A;Lo;0;L;3D33;;;;N;;;;; +2F90B;CJK COMPATIBILITY IDEOGRAPH-2F90B;Lo;0;L;6ECB;;;;N;;;;; +2F90C;CJK COMPATIBILITY IDEOGRAPH-2F90C;Lo;0;L;6EC7;;;;N;;;;; +2F90D;CJK COMPATIBILITY IDEOGRAPH-2F90D;Lo;0;L;23ED1;;;;N;;;;; +2F90E;CJK COMPATIBILITY IDEOGRAPH-2F90E;Lo;0;L;6DF9;;;;N;;;;; +2F90F;CJK COMPATIBILITY IDEOGRAPH-2F90F;Lo;0;L;6F6E;;;;N;;;;; +2F910;CJK COMPATIBILITY IDEOGRAPH-2F910;Lo;0;L;23F5E;;;;N;;;;; +2F911;CJK COMPATIBILITY IDEOGRAPH-2F911;Lo;0;L;23F8E;;;;N;;;;; +2F912;CJK COMPATIBILITY IDEOGRAPH-2F912;Lo;0;L;6FC6;;;;N;;;;; +2F913;CJK COMPATIBILITY IDEOGRAPH-2F913;Lo;0;L;7039;;;;N;;;;; +2F914;CJK COMPATIBILITY IDEOGRAPH-2F914;Lo;0;L;701E;;;;N;;;;; +2F915;CJK COMPATIBILITY IDEOGRAPH-2F915;Lo;0;L;701B;;;;N;;;;; +2F916;CJK COMPATIBILITY IDEOGRAPH-2F916;Lo;0;L;3D96;;;;N;;;;; +2F917;CJK COMPATIBILITY IDEOGRAPH-2F917;Lo;0;L;704A;;;;N;;;;; +2F918;CJK COMPATIBILITY IDEOGRAPH-2F918;Lo;0;L;707D;;;;N;;;;; +2F919;CJK COMPATIBILITY IDEOGRAPH-2F919;Lo;0;L;7077;;;;N;;;;; +2F91A;CJK COMPATIBILITY IDEOGRAPH-2F91A;Lo;0;L;70AD;;;;N;;;;; +2F91B;CJK COMPATIBILITY IDEOGRAPH-2F91B;Lo;0;L;20525;;;;N;;;;; +2F91C;CJK COMPATIBILITY IDEOGRAPH-2F91C;Lo;0;L;7145;;;;N;;;;; +2F91D;CJK COMPATIBILITY IDEOGRAPH-2F91D;Lo;0;L;24263;;;;N;;;;; +2F91E;CJK COMPATIBILITY IDEOGRAPH-2F91E;Lo;0;L;719C;;;;N;;;;; +2F91F;CJK COMPATIBILITY IDEOGRAPH-2F91F;Lo;0;L;43AB;;;;N;;;;; +2F920;CJK COMPATIBILITY IDEOGRAPH-2F920;Lo;0;L;7228;;;;N;;;;; +2F921;CJK COMPATIBILITY IDEOGRAPH-2F921;Lo;0;L;7235;;;;N;;;;; +2F922;CJK COMPATIBILITY IDEOGRAPH-2F922;Lo;0;L;7250;;;;N;;;;; +2F923;CJK COMPATIBILITY IDEOGRAPH-2F923;Lo;0;L;24608;;;;N;;;;; +2F924;CJK COMPATIBILITY IDEOGRAPH-2F924;Lo;0;L;7280;;;;N;;;;; +2F925;CJK COMPATIBILITY IDEOGRAPH-2F925;Lo;0;L;7295;;;;N;;;;; +2F926;CJK COMPATIBILITY IDEOGRAPH-2F926;Lo;0;L;24735;;;;N;;;;; +2F927;CJK COMPATIBILITY IDEOGRAPH-2F927;Lo;0;L;24814;;;;N;;;;; +2F928;CJK COMPATIBILITY IDEOGRAPH-2F928;Lo;0;L;737A;;;;N;;;;; +2F929;CJK COMPATIBILITY IDEOGRAPH-2F929;Lo;0;L;738B;;;;N;;;;; +2F92A;CJK COMPATIBILITY IDEOGRAPH-2F92A;Lo;0;L;3EAC;;;;N;;;;; +2F92B;CJK COMPATIBILITY IDEOGRAPH-2F92B;Lo;0;L;73A5;;;;N;;;;; +2F92C;CJK COMPATIBILITY IDEOGRAPH-2F92C;Lo;0;L;3EB8;;;;N;;;;; +2F92D;CJK COMPATIBILITY IDEOGRAPH-2F92D;Lo;0;L;3EB8;;;;N;;;;; +2F92E;CJK COMPATIBILITY IDEOGRAPH-2F92E;Lo;0;L;7447;;;;N;;;;; +2F92F;CJK COMPATIBILITY IDEOGRAPH-2F92F;Lo;0;L;745C;;;;N;;;;; +2F930;CJK COMPATIBILITY IDEOGRAPH-2F930;Lo;0;L;7471;;;;N;;;;; +2F931;CJK COMPATIBILITY IDEOGRAPH-2F931;Lo;0;L;7485;;;;N;;;;; +2F932;CJK COMPATIBILITY IDEOGRAPH-2F932;Lo;0;L;74CA;;;;N;;;;; +2F933;CJK COMPATIBILITY IDEOGRAPH-2F933;Lo;0;L;3F1B;;;;N;;;;; +2F934;CJK COMPATIBILITY IDEOGRAPH-2F934;Lo;0;L;7524;;;;N;;;;; +2F935;CJK COMPATIBILITY IDEOGRAPH-2F935;Lo;0;L;24C36;;;;N;;;;; +2F936;CJK COMPATIBILITY IDEOGRAPH-2F936;Lo;0;L;753E;;;;N;;;;; +2F937;CJK COMPATIBILITY IDEOGRAPH-2F937;Lo;0;L;24C92;;;;N;;;;; +2F938;CJK COMPATIBILITY IDEOGRAPH-2F938;Lo;0;L;7570;;;;N;;;;; +2F939;CJK COMPATIBILITY IDEOGRAPH-2F939;Lo;0;L;2219F;;;;N;;;;; +2F93A;CJK COMPATIBILITY IDEOGRAPH-2F93A;Lo;0;L;7610;;;;N;;;;; +2F93B;CJK COMPATIBILITY IDEOGRAPH-2F93B;Lo;0;L;24FA1;;;;N;;;;; +2F93C;CJK COMPATIBILITY IDEOGRAPH-2F93C;Lo;0;L;24FB8;;;;N;;;;; +2F93D;CJK COMPATIBILITY IDEOGRAPH-2F93D;Lo;0;L;25044;;;;N;;;;; +2F93E;CJK COMPATIBILITY IDEOGRAPH-2F93E;Lo;0;L;3FFC;;;;N;;;;; +2F93F;CJK COMPATIBILITY IDEOGRAPH-2F93F;Lo;0;L;4008;;;;N;;;;; +2F940;CJK COMPATIBILITY IDEOGRAPH-2F940;Lo;0;L;76F4;;;;N;;;;; +2F941;CJK COMPATIBILITY IDEOGRAPH-2F941;Lo;0;L;250F3;;;;N;;;;; +2F942;CJK COMPATIBILITY IDEOGRAPH-2F942;Lo;0;L;250F2;;;;N;;;;; +2F943;CJK COMPATIBILITY IDEOGRAPH-2F943;Lo;0;L;25119;;;;N;;;;; +2F944;CJK COMPATIBILITY IDEOGRAPH-2F944;Lo;0;L;25133;;;;N;;;;; +2F945;CJK COMPATIBILITY IDEOGRAPH-2F945;Lo;0;L;771E;;;;N;;;;; +2F946;CJK COMPATIBILITY IDEOGRAPH-2F946;Lo;0;L;771F;;;;N;;;;; +2F947;CJK COMPATIBILITY IDEOGRAPH-2F947;Lo;0;L;771F;;;;N;;;;; +2F948;CJK COMPATIBILITY IDEOGRAPH-2F948;Lo;0;L;774A;;;;N;;;;; +2F949;CJK COMPATIBILITY IDEOGRAPH-2F949;Lo;0;L;4039;;;;N;;;;; +2F94A;CJK COMPATIBILITY IDEOGRAPH-2F94A;Lo;0;L;778B;;;;N;;;;; +2F94B;CJK COMPATIBILITY IDEOGRAPH-2F94B;Lo;0;L;4046;;;;N;;;;; +2F94C;CJK COMPATIBILITY IDEOGRAPH-2F94C;Lo;0;L;4096;;;;N;;;;; +2F94D;CJK COMPATIBILITY IDEOGRAPH-2F94D;Lo;0;L;2541D;;;;N;;;;; +2F94E;CJK COMPATIBILITY IDEOGRAPH-2F94E;Lo;0;L;784E;;;;N;;;;; +2F94F;CJK COMPATIBILITY IDEOGRAPH-2F94F;Lo;0;L;788C;;;;N;;;;; +2F950;CJK COMPATIBILITY IDEOGRAPH-2F950;Lo;0;L;78CC;;;;N;;;;; +2F951;CJK COMPATIBILITY IDEOGRAPH-2F951;Lo;0;L;40E3;;;;N;;;;; +2F952;CJK COMPATIBILITY IDEOGRAPH-2F952;Lo;0;L;25626;;;;N;;;;; +2F953;CJK COMPATIBILITY IDEOGRAPH-2F953;Lo;0;L;7956;;;;N;;;;; +2F954;CJK COMPATIBILITY IDEOGRAPH-2F954;Lo;0;L;2569A;;;;N;;;;; +2F955;CJK COMPATIBILITY IDEOGRAPH-2F955;Lo;0;L;256C5;;;;N;;;;; +2F956;CJK COMPATIBILITY IDEOGRAPH-2F956;Lo;0;L;798F;;;;N;;;;; +2F957;CJK COMPATIBILITY IDEOGRAPH-2F957;Lo;0;L;79EB;;;;N;;;;; +2F958;CJK COMPATIBILITY IDEOGRAPH-2F958;Lo;0;L;412F;;;;N;;;;; +2F959;CJK COMPATIBILITY IDEOGRAPH-2F959;Lo;0;L;7A40;;;;N;;;;; +2F95A;CJK COMPATIBILITY IDEOGRAPH-2F95A;Lo;0;L;7A4A;;;;N;;;;; +2F95B;CJK COMPATIBILITY IDEOGRAPH-2F95B;Lo;0;L;7A4F;;;;N;;;;; +2F95C;CJK COMPATIBILITY IDEOGRAPH-2F95C;Lo;0;L;2597C;;;;N;;;;; +2F95D;CJK COMPATIBILITY IDEOGRAPH-2F95D;Lo;0;L;25AA7;;;;N;;;;; +2F95E;CJK COMPATIBILITY IDEOGRAPH-2F95E;Lo;0;L;25AA7;;;;N;;;;; +2F95F;CJK COMPATIBILITY IDEOGRAPH-2F95F;Lo;0;L;7AAE;;;;N;;;;; +2F960;CJK COMPATIBILITY IDEOGRAPH-2F960;Lo;0;L;4202;;;;N;;;;; +2F961;CJK COMPATIBILITY IDEOGRAPH-2F961;Lo;0;L;25BAB;;;;N;;;;; +2F962;CJK COMPATIBILITY IDEOGRAPH-2F962;Lo;0;L;7BC6;;;;N;;;;; +2F963;CJK COMPATIBILITY IDEOGRAPH-2F963;Lo;0;L;7BC9;;;;N;;;;; +2F964;CJK COMPATIBILITY IDEOGRAPH-2F964;Lo;0;L;4227;;;;N;;;;; +2F965;CJK COMPATIBILITY IDEOGRAPH-2F965;Lo;0;L;25C80;;;;N;;;;; +2F966;CJK COMPATIBILITY IDEOGRAPH-2F966;Lo;0;L;7CD2;;;;N;;;;; +2F967;CJK COMPATIBILITY IDEOGRAPH-2F967;Lo;0;L;42A0;;;;N;;;;; +2F968;CJK COMPATIBILITY IDEOGRAPH-2F968;Lo;0;L;7CE8;;;;N;;;;; +2F969;CJK COMPATIBILITY IDEOGRAPH-2F969;Lo;0;L;7CE3;;;;N;;;;; +2F96A;CJK COMPATIBILITY IDEOGRAPH-2F96A;Lo;0;L;7D00;;;;N;;;;; +2F96B;CJK COMPATIBILITY IDEOGRAPH-2F96B;Lo;0;L;25F86;;;;N;;;;; +2F96C;CJK COMPATIBILITY IDEOGRAPH-2F96C;Lo;0;L;7D63;;;;N;;;;; +2F96D;CJK COMPATIBILITY IDEOGRAPH-2F96D;Lo;0;L;4301;;;;N;;;;; +2F96E;CJK COMPATIBILITY IDEOGRAPH-2F96E;Lo;0;L;7DC7;;;;N;;;;; +2F96F;CJK COMPATIBILITY IDEOGRAPH-2F96F;Lo;0;L;7E02;;;;N;;;;; +2F970;CJK COMPATIBILITY IDEOGRAPH-2F970;Lo;0;L;7E45;;;;N;;;;; +2F971;CJK COMPATIBILITY IDEOGRAPH-2F971;Lo;0;L;4334;;;;N;;;;; +2F972;CJK COMPATIBILITY IDEOGRAPH-2F972;Lo;0;L;26228;;;;N;;;;; +2F973;CJK COMPATIBILITY IDEOGRAPH-2F973;Lo;0;L;26247;;;;N;;;;; +2F974;CJK COMPATIBILITY IDEOGRAPH-2F974;Lo;0;L;4359;;;;N;;;;; +2F975;CJK COMPATIBILITY IDEOGRAPH-2F975;Lo;0;L;262D9;;;;N;;;;; +2F976;CJK COMPATIBILITY IDEOGRAPH-2F976;Lo;0;L;7F7A;;;;N;;;;; +2F977;CJK COMPATIBILITY IDEOGRAPH-2F977;Lo;0;L;2633E;;;;N;;;;; +2F978;CJK COMPATIBILITY IDEOGRAPH-2F978;Lo;0;L;7F95;;;;N;;;;; +2F979;CJK COMPATIBILITY IDEOGRAPH-2F979;Lo;0;L;7FFA;;;;N;;;;; +2F97A;CJK COMPATIBILITY IDEOGRAPH-2F97A;Lo;0;L;8005;;;;N;;;;; +2F97B;CJK COMPATIBILITY IDEOGRAPH-2F97B;Lo;0;L;264DA;;;;N;;;;; +2F97C;CJK COMPATIBILITY IDEOGRAPH-2F97C;Lo;0;L;26523;;;;N;;;;; +2F97D;CJK COMPATIBILITY IDEOGRAPH-2F97D;Lo;0;L;8060;;;;N;;;;; +2F97E;CJK COMPATIBILITY IDEOGRAPH-2F97E;Lo;0;L;265A8;;;;N;;;;; +2F97F;CJK COMPATIBILITY IDEOGRAPH-2F97F;Lo;0;L;8070;;;;N;;;;; +2F980;CJK COMPATIBILITY IDEOGRAPH-2F980;Lo;0;L;2335F;;;;N;;;;; +2F981;CJK COMPATIBILITY IDEOGRAPH-2F981;Lo;0;L;43D5;;;;N;;;;; +2F982;CJK COMPATIBILITY IDEOGRAPH-2F982;Lo;0;L;80B2;;;;N;;;;; +2F983;CJK COMPATIBILITY IDEOGRAPH-2F983;Lo;0;L;8103;;;;N;;;;; +2F984;CJK COMPATIBILITY IDEOGRAPH-2F984;Lo;0;L;440B;;;;N;;;;; +2F985;CJK COMPATIBILITY IDEOGRAPH-2F985;Lo;0;L;813E;;;;N;;;;; +2F986;CJK COMPATIBILITY IDEOGRAPH-2F986;Lo;0;L;5AB5;;;;N;;;;; +2F987;CJK COMPATIBILITY IDEOGRAPH-2F987;Lo;0;L;267A7;;;;N;;;;; +2F988;CJK COMPATIBILITY IDEOGRAPH-2F988;Lo;0;L;267B5;;;;N;;;;; +2F989;CJK COMPATIBILITY IDEOGRAPH-2F989;Lo;0;L;23393;;;;N;;;;; +2F98A;CJK COMPATIBILITY IDEOGRAPH-2F98A;Lo;0;L;2339C;;;;N;;;;; +2F98B;CJK COMPATIBILITY IDEOGRAPH-2F98B;Lo;0;L;8201;;;;N;;;;; +2F98C;CJK COMPATIBILITY IDEOGRAPH-2F98C;Lo;0;L;8204;;;;N;;;;; +2F98D;CJK COMPATIBILITY IDEOGRAPH-2F98D;Lo;0;L;8F9E;;;;N;;;;; +2F98E;CJK COMPATIBILITY IDEOGRAPH-2F98E;Lo;0;L;446B;;;;N;;;;; +2F98F;CJK COMPATIBILITY IDEOGRAPH-2F98F;Lo;0;L;8291;;;;N;;;;; +2F990;CJK COMPATIBILITY IDEOGRAPH-2F990;Lo;0;L;828B;;;;N;;;;; +2F991;CJK COMPATIBILITY IDEOGRAPH-2F991;Lo;0;L;829D;;;;N;;;;; +2F992;CJK COMPATIBILITY IDEOGRAPH-2F992;Lo;0;L;52B3;;;;N;;;;; +2F993;CJK COMPATIBILITY IDEOGRAPH-2F993;Lo;0;L;82B1;;;;N;;;;; +2F994;CJK COMPATIBILITY IDEOGRAPH-2F994;Lo;0;L;82B3;;;;N;;;;; +2F995;CJK COMPATIBILITY IDEOGRAPH-2F995;Lo;0;L;82BD;;;;N;;;;; +2F996;CJK COMPATIBILITY IDEOGRAPH-2F996;Lo;0;L;82E6;;;;N;;;;; +2F997;CJK COMPATIBILITY IDEOGRAPH-2F997;Lo;0;L;26B3C;;;;N;;;;; +2F998;CJK COMPATIBILITY IDEOGRAPH-2F998;Lo;0;L;82E5;;;;N;;;;; +2F999;CJK COMPATIBILITY IDEOGRAPH-2F999;Lo;0;L;831D;;;;N;;;;; +2F99A;CJK COMPATIBILITY IDEOGRAPH-2F99A;Lo;0;L;8363;;;;N;;;;; +2F99B;CJK COMPATIBILITY IDEOGRAPH-2F99B;Lo;0;L;83AD;;;;N;;;;; +2F99C;CJK COMPATIBILITY IDEOGRAPH-2F99C;Lo;0;L;8323;;;;N;;;;; +2F99D;CJK COMPATIBILITY IDEOGRAPH-2F99D;Lo;0;L;83BD;;;;N;;;;; +2F99E;CJK COMPATIBILITY IDEOGRAPH-2F99E;Lo;0;L;83E7;;;;N;;;;; +2F99F;CJK COMPATIBILITY IDEOGRAPH-2F99F;Lo;0;L;8457;;;;N;;;;; +2F9A0;CJK COMPATIBILITY IDEOGRAPH-2F9A0;Lo;0;L;8353;;;;N;;;;; +2F9A1;CJK COMPATIBILITY IDEOGRAPH-2F9A1;Lo;0;L;83CA;;;;N;;;;; +2F9A2;CJK COMPATIBILITY IDEOGRAPH-2F9A2;Lo;0;L;83CC;;;;N;;;;; +2F9A3;CJK COMPATIBILITY IDEOGRAPH-2F9A3;Lo;0;L;83DC;;;;N;;;;; +2F9A4;CJK COMPATIBILITY IDEOGRAPH-2F9A4;Lo;0;L;26C36;;;;N;;;;; +2F9A5;CJK COMPATIBILITY IDEOGRAPH-2F9A5;Lo;0;L;26D6B;;;;N;;;;; +2F9A6;CJK COMPATIBILITY IDEOGRAPH-2F9A6;Lo;0;L;26CD5;;;;N;;;;; +2F9A7;CJK COMPATIBILITY IDEOGRAPH-2F9A7;Lo;0;L;452B;;;;N;;;;; +2F9A8;CJK COMPATIBILITY IDEOGRAPH-2F9A8;Lo;0;L;84F1;;;;N;;;;; +2F9A9;CJK COMPATIBILITY IDEOGRAPH-2F9A9;Lo;0;L;84F3;;;;N;;;;; +2F9AA;CJK COMPATIBILITY IDEOGRAPH-2F9AA;Lo;0;L;8516;;;;N;;;;; +2F9AB;CJK COMPATIBILITY IDEOGRAPH-2F9AB;Lo;0;L;273CA;;;;N;;;;; +2F9AC;CJK COMPATIBILITY IDEOGRAPH-2F9AC;Lo;0;L;8564;;;;N;;;;; +2F9AD;CJK COMPATIBILITY IDEOGRAPH-2F9AD;Lo;0;L;26F2C;;;;N;;;;; +2F9AE;CJK COMPATIBILITY IDEOGRAPH-2F9AE;Lo;0;L;455D;;;;N;;;;; +2F9AF;CJK COMPATIBILITY IDEOGRAPH-2F9AF;Lo;0;L;4561;;;;N;;;;; +2F9B0;CJK COMPATIBILITY IDEOGRAPH-2F9B0;Lo;0;L;26FB1;;;;N;;;;; +2F9B1;CJK COMPATIBILITY IDEOGRAPH-2F9B1;Lo;0;L;270D2;;;;N;;;;; +2F9B2;CJK COMPATIBILITY IDEOGRAPH-2F9B2;Lo;0;L;456B;;;;N;;;;; +2F9B3;CJK COMPATIBILITY IDEOGRAPH-2F9B3;Lo;0;L;8650;;;;N;;;;; +2F9B4;CJK COMPATIBILITY IDEOGRAPH-2F9B4;Lo;0;L;865C;;;;N;;;;; +2F9B5;CJK COMPATIBILITY IDEOGRAPH-2F9B5;Lo;0;L;8667;;;;N;;;;; +2F9B6;CJK COMPATIBILITY IDEOGRAPH-2F9B6;Lo;0;L;8669;;;;N;;;;; +2F9B7;CJK COMPATIBILITY IDEOGRAPH-2F9B7;Lo;0;L;86A9;;;;N;;;;; +2F9B8;CJK COMPATIBILITY IDEOGRAPH-2F9B8;Lo;0;L;8688;;;;N;;;;; +2F9B9;CJK COMPATIBILITY IDEOGRAPH-2F9B9;Lo;0;L;870E;;;;N;;;;; +2F9BA;CJK COMPATIBILITY IDEOGRAPH-2F9BA;Lo;0;L;86E2;;;;N;;;;; +2F9BB;CJK COMPATIBILITY IDEOGRAPH-2F9BB;Lo;0;L;8779;;;;N;;;;; +2F9BC;CJK COMPATIBILITY IDEOGRAPH-2F9BC;Lo;0;L;8728;;;;N;;;;; +2F9BD;CJK COMPATIBILITY IDEOGRAPH-2F9BD;Lo;0;L;876B;;;;N;;;;; +2F9BE;CJK COMPATIBILITY IDEOGRAPH-2F9BE;Lo;0;L;8786;;;;N;;;;; +2F9BF;CJK COMPATIBILITY IDEOGRAPH-2F9BF;Lo;0;L;4D57;;;;N;;;;; +2F9C0;CJK COMPATIBILITY IDEOGRAPH-2F9C0;Lo;0;L;87E1;;;;N;;;;; +2F9C1;CJK COMPATIBILITY IDEOGRAPH-2F9C1;Lo;0;L;8801;;;;N;;;;; +2F9C2;CJK COMPATIBILITY IDEOGRAPH-2F9C2;Lo;0;L;45F9;;;;N;;;;; +2F9C3;CJK COMPATIBILITY IDEOGRAPH-2F9C3;Lo;0;L;8860;;;;N;;;;; +2F9C4;CJK COMPATIBILITY IDEOGRAPH-2F9C4;Lo;0;L;8863;;;;N;;;;; +2F9C5;CJK COMPATIBILITY IDEOGRAPH-2F9C5;Lo;0;L;27667;;;;N;;;;; +2F9C6;CJK COMPATIBILITY IDEOGRAPH-2F9C6;Lo;0;L;88D7;;;;N;;;;; +2F9C7;CJK COMPATIBILITY IDEOGRAPH-2F9C7;Lo;0;L;88DE;;;;N;;;;; +2F9C8;CJK COMPATIBILITY IDEOGRAPH-2F9C8;Lo;0;L;4635;;;;N;;;;; +2F9C9;CJK COMPATIBILITY IDEOGRAPH-2F9C9;Lo;0;L;88FA;;;;N;;;;; +2F9CA;CJK COMPATIBILITY IDEOGRAPH-2F9CA;Lo;0;L;34BB;;;;N;;;;; +2F9CB;CJK COMPATIBILITY IDEOGRAPH-2F9CB;Lo;0;L;278AE;;;;N;;;;; +2F9CC;CJK COMPATIBILITY IDEOGRAPH-2F9CC;Lo;0;L;27966;;;;N;;;;; +2F9CD;CJK COMPATIBILITY IDEOGRAPH-2F9CD;Lo;0;L;46BE;;;;N;;;;; +2F9CE;CJK COMPATIBILITY IDEOGRAPH-2F9CE;Lo;0;L;46C7;;;;N;;;;; +2F9CF;CJK COMPATIBILITY IDEOGRAPH-2F9CF;Lo;0;L;8AA0;;;;N;;;;; +2F9D0;CJK COMPATIBILITY IDEOGRAPH-2F9D0;Lo;0;L;8AED;;;;N;;;;; +2F9D1;CJK COMPATIBILITY IDEOGRAPH-2F9D1;Lo;0;L;8B8A;;;;N;;;;; +2F9D2;CJK COMPATIBILITY IDEOGRAPH-2F9D2;Lo;0;L;8C55;;;;N;;;;; +2F9D3;CJK COMPATIBILITY IDEOGRAPH-2F9D3;Lo;0;L;27CA8;;;;N;;;;; +2F9D4;CJK COMPATIBILITY IDEOGRAPH-2F9D4;Lo;0;L;8CAB;;;;N;;;;; +2F9D5;CJK COMPATIBILITY IDEOGRAPH-2F9D5;Lo;0;L;8CC1;;;;N;;;;; +2F9D6;CJK COMPATIBILITY IDEOGRAPH-2F9D6;Lo;0;L;8D1B;;;;N;;;;; +2F9D7;CJK COMPATIBILITY IDEOGRAPH-2F9D7;Lo;0;L;8D77;;;;N;;;;; +2F9D8;CJK COMPATIBILITY IDEOGRAPH-2F9D8;Lo;0;L;27F2F;;;;N;;;;; +2F9D9;CJK COMPATIBILITY IDEOGRAPH-2F9D9;Lo;0;L;20804;;;;N;;;;; +2F9DA;CJK COMPATIBILITY IDEOGRAPH-2F9DA;Lo;0;L;8DCB;;;;N;;;;; +2F9DB;CJK COMPATIBILITY IDEOGRAPH-2F9DB;Lo;0;L;8DBC;;;;N;;;;; +2F9DC;CJK COMPATIBILITY IDEOGRAPH-2F9DC;Lo;0;L;8DF0;;;;N;;;;; +2F9DD;CJK COMPATIBILITY IDEOGRAPH-2F9DD;Lo;0;L;208DE;;;;N;;;;; +2F9DE;CJK COMPATIBILITY IDEOGRAPH-2F9DE;Lo;0;L;8ED4;;;;N;;;;; +2F9DF;CJK COMPATIBILITY IDEOGRAPH-2F9DF;Lo;0;L;8F38;;;;N;;;;; +2F9E0;CJK COMPATIBILITY IDEOGRAPH-2F9E0;Lo;0;L;285D2;;;;N;;;;; +2F9E1;CJK COMPATIBILITY IDEOGRAPH-2F9E1;Lo;0;L;285ED;;;;N;;;;; +2F9E2;CJK COMPATIBILITY IDEOGRAPH-2F9E2;Lo;0;L;9094;;;;N;;;;; +2F9E3;CJK COMPATIBILITY IDEOGRAPH-2F9E3;Lo;0;L;90F1;;;;N;;;;; +2F9E4;CJK COMPATIBILITY IDEOGRAPH-2F9E4;Lo;0;L;9111;;;;N;;;;; +2F9E5;CJK COMPATIBILITY IDEOGRAPH-2F9E5;Lo;0;L;2872E;;;;N;;;;; +2F9E6;CJK COMPATIBILITY IDEOGRAPH-2F9E6;Lo;0;L;911B;;;;N;;;;; +2F9E7;CJK COMPATIBILITY IDEOGRAPH-2F9E7;Lo;0;L;9238;;;;N;;;;; +2F9E8;CJK COMPATIBILITY IDEOGRAPH-2F9E8;Lo;0;L;92D7;;;;N;;;;; +2F9E9;CJK COMPATIBILITY IDEOGRAPH-2F9E9;Lo;0;L;92D8;;;;N;;;;; +2F9EA;CJK COMPATIBILITY IDEOGRAPH-2F9EA;Lo;0;L;927C;;;;N;;;;; +2F9EB;CJK COMPATIBILITY IDEOGRAPH-2F9EB;Lo;0;L;93F9;;;;N;;;;; +2F9EC;CJK COMPATIBILITY IDEOGRAPH-2F9EC;Lo;0;L;9415;;;;N;;;;; +2F9ED;CJK COMPATIBILITY IDEOGRAPH-2F9ED;Lo;0;L;28BFA;;;;N;;;;; +2F9EE;CJK COMPATIBILITY IDEOGRAPH-2F9EE;Lo;0;L;958B;;;;N;;;;; +2F9EF;CJK COMPATIBILITY IDEOGRAPH-2F9EF;Lo;0;L;4995;;;;N;;;;; +2F9F0;CJK COMPATIBILITY IDEOGRAPH-2F9F0;Lo;0;L;95B7;;;;N;;;;; +2F9F1;CJK COMPATIBILITY IDEOGRAPH-2F9F1;Lo;0;L;28D77;;;;N;;;;; +2F9F2;CJK COMPATIBILITY IDEOGRAPH-2F9F2;Lo;0;L;49E6;;;;N;;;;; +2F9F3;CJK COMPATIBILITY IDEOGRAPH-2F9F3;Lo;0;L;96C3;;;;N;;;;; +2F9F4;CJK COMPATIBILITY IDEOGRAPH-2F9F4;Lo;0;L;5DB2;;;;N;;;;; +2F9F5;CJK COMPATIBILITY IDEOGRAPH-2F9F5;Lo;0;L;9723;;;;N;;;;; +2F9F6;CJK COMPATIBILITY IDEOGRAPH-2F9F6;Lo;0;L;29145;;;;N;;;;; +2F9F7;CJK COMPATIBILITY IDEOGRAPH-2F9F7;Lo;0;L;2921A;;;;N;;;;; +2F9F8;CJK COMPATIBILITY IDEOGRAPH-2F9F8;Lo;0;L;4A6E;;;;N;;;;; +2F9F9;CJK COMPATIBILITY IDEOGRAPH-2F9F9;Lo;0;L;4A76;;;;N;;;;; +2F9FA;CJK COMPATIBILITY IDEOGRAPH-2F9FA;Lo;0;L;97E0;;;;N;;;;; +2F9FB;CJK COMPATIBILITY IDEOGRAPH-2F9FB;Lo;0;L;2940A;;;;N;;;;; +2F9FC;CJK COMPATIBILITY IDEOGRAPH-2F9FC;Lo;0;L;4AB2;;;;N;;;;; +2F9FD;CJK COMPATIBILITY IDEOGRAPH-2F9FD;Lo;0;L;29496;;;;N;;;;; +2F9FE;CJK COMPATIBILITY IDEOGRAPH-2F9FE;Lo;0;L;980B;;;;N;;;;; +2F9FF;CJK COMPATIBILITY IDEOGRAPH-2F9FF;Lo;0;L;980B;;;;N;;;;; +2FA00;CJK COMPATIBILITY IDEOGRAPH-2FA00;Lo;0;L;9829;;;;N;;;;; +2FA01;CJK COMPATIBILITY IDEOGRAPH-2FA01;Lo;0;L;295B6;;;;N;;;;; +2FA02;CJK COMPATIBILITY IDEOGRAPH-2FA02;Lo;0;L;98E2;;;;N;;;;; +2FA03;CJK COMPATIBILITY IDEOGRAPH-2FA03;Lo;0;L;4B33;;;;N;;;;; +2FA04;CJK COMPATIBILITY IDEOGRAPH-2FA04;Lo;0;L;9929;;;;N;;;;; +2FA05;CJK COMPATIBILITY IDEOGRAPH-2FA05;Lo;0;L;99A7;;;;N;;;;; +2FA06;CJK COMPATIBILITY IDEOGRAPH-2FA06;Lo;0;L;99C2;;;;N;;;;; +2FA07;CJK COMPATIBILITY IDEOGRAPH-2FA07;Lo;0;L;99FE;;;;N;;;;; +2FA08;CJK COMPATIBILITY IDEOGRAPH-2FA08;Lo;0;L;4BCE;;;;N;;;;; +2FA09;CJK COMPATIBILITY IDEOGRAPH-2FA09;Lo;0;L;29B30;;;;N;;;;; +2FA0A;CJK COMPATIBILITY IDEOGRAPH-2FA0A;Lo;0;L;9B12;;;;N;;;;; +2FA0B;CJK COMPATIBILITY IDEOGRAPH-2FA0B;Lo;0;L;9C40;;;;N;;;;; +2FA0C;CJK COMPATIBILITY IDEOGRAPH-2FA0C;Lo;0;L;9CFD;;;;N;;;;; +2FA0D;CJK COMPATIBILITY IDEOGRAPH-2FA0D;Lo;0;L;4CCE;;;;N;;;;; +2FA0E;CJK COMPATIBILITY IDEOGRAPH-2FA0E;Lo;0;L;4CED;;;;N;;;;; +2FA0F;CJK COMPATIBILITY IDEOGRAPH-2FA0F;Lo;0;L;9D67;;;;N;;;;; +2FA10;CJK COMPATIBILITY IDEOGRAPH-2FA10;Lo;0;L;2A0CE;;;;N;;;;; +2FA11;CJK COMPATIBILITY IDEOGRAPH-2FA11;Lo;0;L;4CF8;;;;N;;;;; +2FA12;CJK COMPATIBILITY IDEOGRAPH-2FA12;Lo;0;L;2A105;;;;N;;;;; +2FA13;CJK COMPATIBILITY IDEOGRAPH-2FA13;Lo;0;L;2A20E;;;;N;;;;; +2FA14;CJK COMPATIBILITY IDEOGRAPH-2FA14;Lo;0;L;2A291;;;;N;;;;; +2FA15;CJK COMPATIBILITY IDEOGRAPH-2FA15;Lo;0;L;9EBB;;;;N;;;;; +2FA16;CJK COMPATIBILITY IDEOGRAPH-2FA16;Lo;0;L;4D56;;;;N;;;;; +2FA17;CJK COMPATIBILITY IDEOGRAPH-2FA17;Lo;0;L;9EF9;;;;N;;;;; +2FA18;CJK COMPATIBILITY IDEOGRAPH-2FA18;Lo;0;L;9EFE;;;;N;;;;; +2FA19;CJK COMPATIBILITY IDEOGRAPH-2FA19;Lo;0;L;9F05;;;;N;;;;; +2FA1A;CJK COMPATIBILITY IDEOGRAPH-2FA1A;Lo;0;L;9F0F;;;;N;;;;; +2FA1B;CJK COMPATIBILITY IDEOGRAPH-2FA1B;Lo;0;L;9F16;;;;N;;;;; +2FA1C;CJK COMPATIBILITY IDEOGRAPH-2FA1C;Lo;0;L;9F3B;;;;N;;;;; +2FA1D;CJK COMPATIBILITY IDEOGRAPH-2FA1D;Lo;0;L;2A600;;;;N;;;;; +E0001;LANGUAGE TAG;Cf;0;BN;;;;;N;;;;; +E0020;TAG SPACE;Cf;0;BN;;;;;N;;;;; +E0021;TAG EXCLAMATION MARK;Cf;0;BN;;;;;N;;;;; +E0022;TAG QUOTATION MARK;Cf;0;BN;;;;;N;;;;; +E0023;TAG NUMBER SIGN;Cf;0;BN;;;;;N;;;;; +E0024;TAG DOLLAR SIGN;Cf;0;BN;;;;;N;;;;; +E0025;TAG PERCENT SIGN;Cf;0;BN;;;;;N;;;;; +E0026;TAG AMPERSAND;Cf;0;BN;;;;;N;;;;; +E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;; +E0028;TAG LEFT PARENTHESIS;Cf;0;BN;;;;;N;;;;; +E0029;TAG RIGHT PARENTHESIS;Cf;0;BN;;;;;N;;;;; +E002A;TAG ASTERISK;Cf;0;BN;;;;;N;;;;; +E002B;TAG PLUS SIGN;Cf;0;BN;;;;;N;;;;; +E002C;TAG COMMA;Cf;0;BN;;;;;N;;;;; +E002D;TAG HYPHEN-MINUS;Cf;0;BN;;;;;N;;;;; +E002E;TAG FULL STOP;Cf;0;BN;;;;;N;;;;; +E002F;TAG SOLIDUS;Cf;0;BN;;;;;N;;;;; +E0030;TAG DIGIT ZERO;Cf;0;BN;;;;;N;;;;; +E0031;TAG DIGIT ONE;Cf;0;BN;;;;;N;;;;; +E0032;TAG DIGIT TWO;Cf;0;BN;;;;;N;;;;; +E0033;TAG DIGIT THREE;Cf;0;BN;;;;;N;;;;; +E0034;TAG DIGIT FOUR;Cf;0;BN;;;;;N;;;;; +E0035;TAG DIGIT FIVE;Cf;0;BN;;;;;N;;;;; +E0036;TAG DIGIT SIX;Cf;0;BN;;;;;N;;;;; +E0037;TAG DIGIT SEVEN;Cf;0;BN;;;;;N;;;;; +E0038;TAG DIGIT EIGHT;Cf;0;BN;;;;;N;;;;; +E0039;TAG DIGIT NINE;Cf;0;BN;;;;;N;;;;; +E003A;TAG COLON;Cf;0;BN;;;;;N;;;;; +E003B;TAG SEMICOLON;Cf;0;BN;;;;;N;;;;; +E003C;TAG LESS-THAN SIGN;Cf;0;BN;;;;;N;;;;; +E003D;TAG EQUALS SIGN;Cf;0;BN;;;;;N;;;;; +E003E;TAG GREATER-THAN SIGN;Cf;0;BN;;;;;N;;;;; +E003F;TAG QUESTION MARK;Cf;0;BN;;;;;N;;;;; +E0040;TAG COMMERCIAL AT;Cf;0;BN;;;;;N;;;;; +E0041;TAG LATIN CAPITAL LETTER A;Cf;0;BN;;;;;N;;;;; +E0042;TAG LATIN CAPITAL LETTER B;Cf;0;BN;;;;;N;;;;; +E0043;TAG LATIN CAPITAL LETTER C;Cf;0;BN;;;;;N;;;;; +E0044;TAG LATIN CAPITAL LETTER D;Cf;0;BN;;;;;N;;;;; +E0045;TAG LATIN CAPITAL LETTER E;Cf;0;BN;;;;;N;;;;; +E0046;TAG LATIN CAPITAL LETTER F;Cf;0;BN;;;;;N;;;;; +E0047;TAG LATIN CAPITAL LETTER G;Cf;0;BN;;;;;N;;;;; +E0048;TAG LATIN CAPITAL LETTER H;Cf;0;BN;;;;;N;;;;; +E0049;TAG LATIN CAPITAL LETTER I;Cf;0;BN;;;;;N;;;;; +E004A;TAG LATIN CAPITAL LETTER J;Cf;0;BN;;;;;N;;;;; +E004B;TAG LATIN CAPITAL LETTER K;Cf;0;BN;;;;;N;;;;; +E004C;TAG LATIN CAPITAL LETTER L;Cf;0;BN;;;;;N;;;;; +E004D;TAG LATIN CAPITAL LETTER M;Cf;0;BN;;;;;N;;;;; +E004E;TAG LATIN CAPITAL LETTER N;Cf;0;BN;;;;;N;;;;; +E004F;TAG LATIN CAPITAL LETTER O;Cf;0;BN;;;;;N;;;;; +E0050;TAG LATIN CAPITAL LETTER P;Cf;0;BN;;;;;N;;;;; +E0051;TAG LATIN CAPITAL LETTER Q;Cf;0;BN;;;;;N;;;;; +E0052;TAG LATIN CAPITAL LETTER R;Cf;0;BN;;;;;N;;;;; +E0053;TAG LATIN CAPITAL LETTER S;Cf;0;BN;;;;;N;;;;; +E0054;TAG LATIN CAPITAL LETTER T;Cf;0;BN;;;;;N;;;;; +E0055;TAG LATIN CAPITAL LETTER U;Cf;0;BN;;;;;N;;;;; +E0056;TAG LATIN CAPITAL LETTER V;Cf;0;BN;;;;;N;;;;; +E0057;TAG LATIN CAPITAL LETTER W;Cf;0;BN;;;;;N;;;;; +E0058;TAG LATIN CAPITAL LETTER X;Cf;0;BN;;;;;N;;;;; +E0059;TAG LATIN CAPITAL LETTER Y;Cf;0;BN;;;;;N;;;;; +E005A;TAG LATIN CAPITAL LETTER Z;Cf;0;BN;;;;;N;;;;; +E005B;TAG LEFT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;; +E005C;TAG REVERSE SOLIDUS;Cf;0;BN;;;;;N;;;;; +E005D;TAG RIGHT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;; +E005E;TAG CIRCUMFLEX ACCENT;Cf;0;BN;;;;;N;;;;; +E005F;TAG LOW LINE;Cf;0;BN;;;;;N;;;;; +E0060;TAG GRAVE ACCENT;Cf;0;BN;;;;;N;;;;; +E0061;TAG LATIN SMALL LETTER A;Cf;0;BN;;;;;N;;;;; +E0062;TAG LATIN SMALL LETTER B;Cf;0;BN;;;;;N;;;;; +E0063;TAG LATIN SMALL LETTER C;Cf;0;BN;;;;;N;;;;; +E0064;TAG LATIN SMALL LETTER D;Cf;0;BN;;;;;N;;;;; +E0065;TAG LATIN SMALL LETTER E;Cf;0;BN;;;;;N;;;;; +E0066;TAG LATIN SMALL LETTER F;Cf;0;BN;;;;;N;;;;; +E0067;TAG LATIN SMALL LETTER G;Cf;0;BN;;;;;N;;;;; +E0068;TAG LATIN SMALL LETTER H;Cf;0;BN;;;;;N;;;;; +E0069;TAG LATIN SMALL LETTER I;Cf;0;BN;;;;;N;;;;; +E006A;TAG LATIN SMALL LETTER J;Cf;0;BN;;;;;N;;;;; +E006B;TAG LATIN SMALL LETTER K;Cf;0;BN;;;;;N;;;;; +E006C;TAG LATIN SMALL LETTER L;Cf;0;BN;;;;;N;;;;; +E006D;TAG LATIN SMALL LETTER M;Cf;0;BN;;;;;N;;;;; +E006E;TAG LATIN SMALL LETTER N;Cf;0;BN;;;;;N;;;;; +E006F;TAG LATIN SMALL LETTER O;Cf;0;BN;;;;;N;;;;; +E0070;TAG LATIN SMALL LETTER P;Cf;0;BN;;;;;N;;;;; +E0071;TAG LATIN SMALL LETTER Q;Cf;0;BN;;;;;N;;;;; +E0072;TAG LATIN SMALL LETTER R;Cf;0;BN;;;;;N;;;;; +E0073;TAG LATIN SMALL LETTER S;Cf;0;BN;;;;;N;;;;; +E0074;TAG LATIN SMALL LETTER T;Cf;0;BN;;;;;N;;;;; +E0075;TAG LATIN SMALL LETTER U;Cf;0;BN;;;;;N;;;;; +E0076;TAG LATIN SMALL LETTER V;Cf;0;BN;;;;;N;;;;; +E0077;TAG LATIN SMALL LETTER W;Cf;0;BN;;;;;N;;;;; +E0078;TAG LATIN SMALL LETTER X;Cf;0;BN;;;;;N;;;;; +E0079;TAG LATIN SMALL LETTER Y;Cf;0;BN;;;;;N;;;;; +E007A;TAG LATIN SMALL LETTER Z;Cf;0;BN;;;;;N;;;;; +E007B;TAG LEFT CURLY BRACKET;Cf;0;BN;;;;;N;;;;; +E007C;TAG VERTICAL LINE;Cf;0;BN;;;;;N;;;;; +E007D;TAG RIGHT CURLY BRACKET;Cf;0;BN;;;;;N;;;;; +E007E;TAG TILDE;Cf;0;BN;;;;;N;;;;; +E007F;CANCEL TAG;Cf;0;BN;;;;;N;;;;; +F0000;<Plane 15 Private Use, First>;Co;0;L;;;;;N;;;;; +FFFFD;<Plane 15 Private Use, Last>;Co;0;L;;;;;N;;;;; +100000;<Plane 16 Private Use, First>;Co;0;L;;;;;N;;;;; +10FFFD;<Plane 16 Private Use, Last>;Co;0;L;;;;;N;;;;; diff --git a/lib/anonymous.c b/lib/anonymous.c new file mode 100644 index 0000000..2cb3c8c --- /dev/null +++ b/lib/anonymous.c @@ -0,0 +1,187 @@ +/* anonymous.c implementation of SASL mechanism ANONYMOUS from RFC 2245 + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" + +#ifdef USE_ANONYMOUS + +int +_gsasl_anonymous_client_init (Gsasl_ctx *ctx) +{ + return GSASL_OK; +} + +void +_gsasl_anonymous_client_done (Gsasl_ctx *ctx) +{ + return; +} + +int +_gsasl_anonymous_client_start (Gsasl_session_ctx *cctx, + void **mech_data) +{ + Gsasl_ctx *ctx; + int *step; + + ctx = gsasl_client_ctx_get (cctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + if (gsasl_client_callback_anonymous_get (ctx) == NULL) + return GSASL_NEED_SERVER_ANONYMOUS_CALLBACK; + + step = (int*) malloc(sizeof(*step)); + if (step == NULL) + return GSASL_MALLOC_ERROR; + + *step = 0; + + *mech_data = step; + + return GSASL_OK; +} + +int +_gsasl_anonymous_client_step (Gsasl_session_ctx *cctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len) +{ + int *step = mech_data; + Gsasl_client_callback_anonymous cb_anonymous; + Gsasl_ctx *ctx; + int res; + + if (*step > 0) + return GSASL_OK; + + (*step)++; + + ctx = gsasl_client_ctx_get (cctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + cb_anonymous = gsasl_client_callback_anonymous_get (ctx); + if (cb_anonymous == NULL) + return GSASL_NEED_SERVER_ANONYMOUS_CALLBACK; + + res = cb_anonymous (cctx, output, output_len); + if (res != GSASL_OK) + return res; + + *output_len = strlen(output); + + return GSASL_NEEDS_MORE; +} + +int +_gsasl_anonymous_client_finish (Gsasl_session_ctx *cctx, + void *mech_data) +{ + int *step = mech_data; + + free(step); + + return GSASL_OK; +} + +/* Server */ + +int +_gsasl_anonymous_server_init (Gsasl_ctx *ctx) +{ + return GSASL_OK; +} + +void +_gsasl_anonymous_server_done (Gsasl_ctx *ctx) +{ + return; +} + +int +_gsasl_anonymous_server_start (Gsasl_session_ctx *sctx, + void **mech_data) +{ + Gsasl_ctx *ctx; + + ctx = gsasl_server_ctx_get (sctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + if (gsasl_server_callback_anonymous_get (ctx) == NULL) + return GSASL_NEED_SERVER_ANONYMOUS_CALLBACK; + + return GSASL_OK; +} + +int +_gsasl_anonymous_server_step (Gsasl_session_ctx *sctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len) +{ + Gsasl_server_callback_anonymous cb_anonymous; + Gsasl_ctx *ctx; + char *token; + int res; + + if (input_len == 0) + { + *output_len = 0; + return GSASL_NEEDS_MORE; + } + + ctx = gsasl_server_ctx_get (sctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + cb_anonymous = gsasl_server_callback_anonymous_get (ctx); + if (cb_anonymous == NULL) + return GSASL_NEED_SERVER_ANONYMOUS_CALLBACK; + + token = malloc(input_len + 1); + if (token == NULL) + return GSASL_MALLOC_ERROR; + + memcpy(token, input, input_len); + token[input_len] = '\0'; + + res = cb_anonymous(sctx, token); + + free(token); + + return res; +} + +int +_gsasl_anonymous_server_finish (Gsasl_session_ctx *sctx, + void *mech_data) +{ + return GSASL_OK; +} + +#endif /* USE_ANONYMOUS */ diff --git a/lib/anonymous.h b/lib/anonymous.h new file mode 100644 index 0000000..0052f71 --- /dev/null +++ b/lib/anonymous.h @@ -0,0 +1,53 @@ +/* anonymous.h header file for SASL mechanism ANONYMOUS as defined in RFC 2245 + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _ANONYMOUS_H +#define _ANONYMOUS_H + +#define _GSASL_ANONYMOUS_NAME "ANONYMOUS" + +extern int _gsasl_anonymous_client_init (Gsasl_ctx *ctx); +extern void _gsasl_anonymous_client_done (Gsasl_ctx *ctx); +extern int _gsasl_anonymous_client_start (Gsasl_session_ctx *cctx, + void **mech_data); +extern int _gsasl_anonymous_client_step (Gsasl_session_ctx *cctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len); +extern int _gsasl_anonymous_client_finish (Gsasl_session_ctx *cctx, + void *mech_data); + +extern int _gsasl_anonymous_server_init (Gsasl_ctx *ctx); +extern void _gsasl_anonymous_server_done (Gsasl_ctx *ctx); +extern int _gsasl_anonymous_server_start (Gsasl_session_ctx *sctx, + void **mech_data); +extern int _gsasl_anonymous_server_step (Gsasl_session_ctx *sctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len); +extern int _gsasl_anonymous_server_finish (Gsasl_session_ctx *sctx, + void *mech_data); + +#endif /* _ANONYMOUS_H */ diff --git a/lib/base64.c b/lib/base64.c new file mode 100644 index 0000000..62ac9cd --- /dev/null +++ b/lib/base64.c @@ -0,0 +1,331 @@ +#include "gsasl.h" + +/* This file is copied from GNU libc - libc/resolv/base64.c */ + +/* + * Copyright (c) 1996-1999 by Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS + * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE + * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + +/* + * Portions Copyright (c) 1995 by International Business Machines, Inc. + * + * International Business Machines, Inc. (hereinafter called IBM) grants + * permission under its copyrights to use, copy, modify, and distribute this + * Software with or without fee, provided that the above copyright notice and + * all paragraphs of this notice appear in all copies, and that the name of IBM + * not be used in connection with the marketing of any product incorporating + * the Software or modifications thereof, without specific, written prior + * permission. + * + * To the extent it has a right to do so, IBM grants an immunity from suit + * under its patents, if any, for the use, sale or manufacture of products to + * the extent that such products are used for performing Domain Name System + * dynamic updates in TCP/IP networks by means of the Software. No immunity is + * granted for any product per se or for any other function of any product. + * + * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, + * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN + * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#define Assert(Cond) if (!(Cond)) abort() + +static const char Base64[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +static const char Pad64 = '='; + +/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt) + The following encoding technique is taken from RFC 1521 by Borenstein + and Freed. It is reproduced here in a slightly edited form for + convenience. + + A 65-character subset of US-ASCII is used, enabling 6 bits to be + represented per printable character. (The extra 65th character, "=", + is used to signify a special processing function.) + + The encoding process represents 24-bit groups of input bits as output + strings of 4 encoded characters. Proceeding from left to right, a + 24-bit input group is formed by concatenating 3 8-bit input groups. + These 24 bits are then treated as 4 concatenated 6-bit groups, each + of which is translated into a single digit in the base64 alphabet. + + Each 6-bit group is used as an index into an array of 64 printable + characters. The character referenced by the index is placed in the + output string. + + Table 1: The Base64 Alphabet + + Value Encoding Value Encoding Value Encoding Value Encoding + 0 A 17 R 34 i 51 z + 1 B 18 S 35 j 52 0 + 2 C 19 T 36 k 53 1 + 3 D 20 U 37 l 54 2 + 4 E 21 V 38 m 55 3 + 5 F 22 W 39 n 56 4 + 6 G 23 X 40 o 57 5 + 7 H 24 Y 41 p 58 6 + 8 I 25 Z 42 q 59 7 + 9 J 26 a 43 r 60 8 + 10 K 27 b 44 s 61 9 + 11 L 28 c 45 t 62 + + 12 M 29 d 46 u 63 / + 13 N 30 e 47 v + 14 O 31 f 48 w (pad) = + 15 P 32 g 49 x + 16 Q 33 h 50 y + + Special processing is performed if fewer than 24 bits are available + at the end of the data being encoded. A full encoding quantum is + always completed at the end of a quantity. When fewer than 24 input + bits are available in an input group, zero bits are added (on the + right) to form an integral number of 6-bit groups. Padding at the + end of the data is performed using the '=' character. + + Since all base64 input is an integral number of octets, only the + ------------------------------------------------- + following cases can arise: + + (1) the final quantum of encoding input is an integral + multiple of 24 bits; here, the final unit of encoded + output will be an integral multiple of 4 characters + with no "=" padding, + (2) the final quantum of encoding input is exactly 8 bits; + here, the final unit of encoded output will be two + characters followed by two "=" padding characters, or + (3) the final quantum of encoding input is exactly 16 bits; + here, the final unit of encoded output will be three + characters followed by one "=" padding character. + */ + +/** + * gsasl_base64_encode: + * @src: input byte array + * @srclength: size of input byte array + * @target: output byte array + * @targsize: size of output byte array + * + * Encode data as base64. Converts characters, three at a time, + * starting at src into four base64 characters in the target area + * until the entire input buffer is encoded. + * + * Return value: Returns the number of data bytes stored at the + * target, or -1 on error. + **/ +int +gsasl_base64_encode (unsigned char const *src, + size_t srclength, + char *target, + size_t targsize) +{ + size_t datalength = 0; + unsigned char input[3]; + unsigned char output[4]; + size_t i; + + while (2 < srclength) { + input[0] = *src++; + input[1] = *src++; + input[2] = *src++; + srclength -= 3; + + output[0] = input[0] >> 2; + output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4); + output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6); + output[3] = input[2] & 0x3f; + Assert(output[0] < 64); + Assert(output[1] < 64); + Assert(output[2] < 64); + Assert(output[3] < 64); + + if (datalength + 4 > targsize) + return (-1); + target[datalength++] = Base64[output[0]]; + target[datalength++] = Base64[output[1]]; + target[datalength++] = Base64[output[2]]; + target[datalength++] = Base64[output[3]]; + } + + /* Now we worry about padding. */ + if (0 != srclength) { + /* Get what's left. */ + input[0] = input[1] = input[2] = '\0'; + for (i = 0; i < srclength; i++) + input[i] = *src++; + + output[0] = input[0] >> 2; + output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4); + output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6); + Assert(output[0] < 64); + Assert(output[1] < 64); + Assert(output[2] < 64); + + if (datalength + 4 > targsize) + return (-1); + target[datalength++] = Base64[output[0]]; + target[datalength++] = Base64[output[1]]; + if (srclength == 1) + target[datalength++] = Pad64; + else + target[datalength++] = Base64[output[2]]; + target[datalength++] = Pad64; + } + if (datalength >= targsize) + return (-1); + target[datalength] = '\0'; /* Returned value doesn't count \0. */ + return (datalength); +} + +/** + * gsasl_base64_decode: + * @src: input byte array + * @target: output byte array + * @targsize: size of output byte array + * + * Decode Base64 data. Skips all whitespace anywhere. Converts + * characters, four at a time, starting at (or after) src from Base64 + * numbers into three 8 bit bytes in the target area. + * + * Return value: Returns the number of data bytes stored at the + * target, or -1 on error. + **/ +int +gsasl_base64_decode (char const *src, + unsigned char *target, + size_t targsize) +{ + int tarindex, state, ch; + char *pos; + + state = 0; + tarindex = 0; + + while ((ch = *src++) != '\0') { + if (isspace(ch)) /* Skip whitespace anywhere. */ + continue; + + if (ch == Pad64) + break; + + pos = strchr(Base64, ch); + if (pos == 0) /* A non-base64 character. */ + return (-1); + + switch (state) { + case 0: + if (target) { + if ((size_t)tarindex >= targsize) + return (-1); + target[tarindex] = (pos - Base64) << 2; + } + state = 1; + break; + case 1: + if (target) { + if ((size_t)tarindex + 1 >= targsize) + return (-1); + target[tarindex] |= (pos - Base64) >> 4; + target[tarindex+1] = ((pos - Base64) & 0x0f) + << 4 ; + } + tarindex++; + state = 2; + break; + case 2: + if (target) { + if ((size_t)tarindex + 1 >= targsize) + return (-1); + target[tarindex] |= (pos - Base64) >> 2; + target[tarindex+1] = ((pos - Base64) & 0x03) + << 6; + } + tarindex++; + state = 3; + break; + case 3: + if (target) { + if ((size_t)tarindex >= targsize) + return (-1); + target[tarindex] |= (pos - Base64); + } + tarindex++; + state = 0; + break; + default: + abort(); + } + } + + /* + * We are done decoding Base-64 chars. Let's see if we ended + * on a byte boundary, and/or with erroneous trailing characters. + */ + + if (ch == Pad64) { /* We got a pad char. */ + ch = *src++; /* Skip it, get next. */ + switch (state) { + case 0: /* Invalid = in first position */ + case 1: /* Invalid = in second position */ + return (-1); + + case 2: /* Valid, means one byte of info */ + /* Skip any number of spaces. */ + for ((void)NULL; ch != '\0'; ch = *src++) + if (!isspace(ch)) + break; + /* Make sure there is another trailing = sign. */ + if (ch != Pad64) + return (-1); + ch = *src++; /* Skip the = */ + /* Fall through to "single trailing =" case. */ + /* FALLTHROUGH */ + + case 3: /* Valid, means two bytes of info */ + /* + * We know this char is an =. Is there anything but + * whitespace after it? + */ + for ((void)NULL; ch != '\0'; ch = *src++) + if (!isspace(ch)) + return (-1); + + /* + * Now make sure for cases 2 and 3 that the "extra" + * bits that slopped past the last full byte were + * zeros. If we don't check them, they become a + * subliminal channel. + */ + if (target && target[tarindex] != 0) + return (-1); + } + } else { + /* + * We ended by seeing the end of the string. Make sure we + * have no partial bytes lying around. + */ + if (state != 0) + return (-1); + } + + return (tarindex); +} diff --git a/lib/callback.c b/lib/callback.c new file mode 100644 index 0000000..8073cf6 --- /dev/null +++ b/lib/callback.c @@ -0,0 +1,841 @@ +/* callback.c callback handling + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" + +/** + * gsasl_client_ctx_get: + * @cctx: libgsasl client handle + * + * Return value: Returns the libgsasl handle given a libgsasl client handle. + **/ +Gsasl_ctx * +gsasl_client_ctx_get (Gsasl_session_ctx *cctx) +{ + return cctx->ctx; +} + +/** + * gsasl_server_ctx_get: + * @cctx: libgsasl server handle + * + * Return value: Returns the libgsasl handle given a libgsasl server handle. + **/ +Gsasl_ctx * +gsasl_server_ctx_get (Gsasl_session_ctx *sctx) +{ + return sctx->ctx; +} + +/** + * gsasl_application_data_set: + * @ctx: libgsasl handle. + * @application_data: opaque pointer to application specific data. + * + * Store application specific data in the libgsasl handle. The + * application data can be later (for instance, inside a callback) be + * retrieved by calling gsasl_application_data_get(). It is normally + * used by the application to maintain state between the main program + * and the callback. + **/ +void +gsasl_application_data_set (Gsasl_ctx *ctx, + void *application_data) +{ + ctx->application_data = application_data; +} + +/** + * gsasl_application_data_get: + * @ctx: libgsasl handle. + * + * Retrieve application specific data from libgsasl handle. The + * application data is set using gsasl_application_data_set(). It is + * normally used by the application to maintain state between the main + * program and the callback. + * + * Return value: Returns the application specific data, or NULL. + **/ +void * +gsasl_application_data_get (Gsasl_ctx *ctx) +{ + return ctx->application_data; +} + +/** + * gsasl_client_application_data_set: + * @xctx: libgsasl client handle. + * @application_data: opaque pointer to application specific data. + * + * Store application specific data in the libgsasl client handle. The + * application data can be later (for instance, inside a callback) be + * retrieved by calling gsasl_client_application_data_get(). It is + * normally used by the application to maintain state between the main + * program and the callback. + **/ +void +gsasl_client_application_data_set (Gsasl_session_ctx *cctx, + void *application_data) +{ + cctx->application_data = application_data; +} + +/** + * gsasl_client_application_data_get: + * @xctx: libgsasl client handle. + * + * Retrieve application specific data from libgsasl client handle. The + * application data is set using gsasl_client_application_data_set(). + * It is normally used by the application to maintain state between + * the main program and the callback. + * + * Return value: Returns the application specific data, or NULL. + **/ +void * +gsasl_client_application_data_get (Gsasl_session_ctx *cctx) +{ + return cctx->application_data; +} + +/** + * gsasl_server_application_data_set: + * @xctx: libgsasl server handle. + * @application_data: opaque pointer to application specific data. + * + * Store application specific data in the libgsasl server handle. The + * application data can be later (for instance, inside a callback) be + * retrieved by calling gsasl_server_application_data_get(). It is + * normally used by the application to maintain state between the main + * program and the callback. + **/ +void +gsasl_server_application_data_set (Gsasl_session_ctx *sctx, + void *application_data) +{ + sctx->application_data = application_data; +} + +/** + * gsasl_server_application_data_get: + * @xctx: libgsasl server handle. + * + * Retrieve application specific data from libgsasl server handle. The + * application data is set using gsasl_server_application_data_set(). + * It is normally used by the application to maintain state between + * the main program and the callback. + * + * Return value: Returns the application specific data, or NULL. + **/ +void * +gsasl_server_application_data_get (Gsasl_session_ctx *sctx) +{ + return sctx->application_data; +} + + +/* + * + ************************* Client Callbacks + * + */ + + +/** + * gsasl_client_callback_authentication_id_set: + * @ctx: libgsasl handle. + * @cb: callback function + * + * Specify the callback function to use in the client to set the + * authentication identity. The function can be later retrieved using + * gsasl_client_callback_authentication_id_get(). + **/ +void +gsasl_client_callback_authentication_id_set (Gsasl_ctx *ctx, + Gsasl_client_callback_authentication_id cb) +{ + ctx->cbc_authentication_id = cb; +} + +/** + * gsasl_client_callback_authentication_id_get: + * @ctx: libgsasl handle. + * + * Return the callback earlier set by calling + * gsasl_client_callback_authentication_id_set(). + **/ +Gsasl_client_callback_authentication_id +gsasl_client_callback_authentication_id_get (Gsasl_ctx *ctx) +{ + return ctx->cbc_authentication_id; +} + +/** + * gsasl_client_callback_authorization_id_set: + * @ctx: libgsasl handle. + * @cb: callback function + * + * Specify the callback function to use in the client to set the + * authorization identity. The function can be later retrieved using + * gsasl_client_callback_authorization_id_get(). + **/ +void +gsasl_client_callback_authorization_id_set (Gsasl_ctx *ctx, + Gsasl_client_callback_authorization_id cb) +{ + ctx->cbc_authorization_id = cb; +} + +/** + * gsasl_client_callback_authorization_id_get: + * @ctx: libgsasl handle. + * + * Return the callback earlier set by calling + * gsasl_client_callback_authorization_id_set(). + **/ +Gsasl_client_callback_authorization_id +gsasl_client_callback_authorization_id_get (Gsasl_ctx *ctx) +{ + return ctx->cbc_authorization_id; +} + +/** + * gsasl_client_callback_password_set: + * @ctx: libgsasl handle. + * @cb: callback function + * + * Specify the callback function to use in the client to set the + * password. The function can be later retrieved using + * gsasl_client_callback_password_get(). + **/ +void +gsasl_client_callback_password_set (Gsasl_ctx *ctx, + Gsasl_client_callback_password cb) +{ + ctx->cbc_password = cb; +} + + +/** + * gsasl_client_callback_password_get: + * @ctx: libgsasl handle. + * + * Return the callback earlier set by calling + * gsasl_client_callback_password_set(). + **/ +Gsasl_client_callback_password +gsasl_client_callback_password_get (Gsasl_ctx *ctx) +{ + return ctx->cbc_password; +} + +/** + * gsasl_client_callback_passcode_set: + * @ctx: libgsasl handle. + * @cb: callback function + * + * Specify the callback function to use in the client to set the + * passcode. The function can be later retrieved using + * gsasl_client_callback_passcode_get(). + **/ +void +gsasl_client_callback_passcode_set (Gsasl_ctx *ctx, + Gsasl_client_callback_passcode cb) +{ + ctx->cbc_passcode = cb; +} + + +/** + * gsasl_client_callback_passcode_get: + * @ctx: libgsasl handle. + * + * Return the callback earlier set by calling + * gsasl_client_callback_passcode_set(). + **/ +Gsasl_client_callback_passcode +gsasl_client_callback_passcode_get (Gsasl_ctx *ctx) +{ + return ctx->cbc_passcode; +} + +/** + * gsasl_client_callback_pin_set: + * @ctx: libgsasl handle. + * @cb: callback function + * + * Specify the callback function to use in the client to chose a new + * pin, possibly suggested by the server, for the SECURID mechanism. + * This is not normally invoked, but only when the server requests it. + * The function can be later retrieved using + * gsasl_client_callback_pin_get(). + **/ +void +gsasl_client_callback_pin_set (Gsasl_ctx *ctx, + Gsasl_client_callback_pin cb) +{ + ctx->cbc_pin = cb; +} + + +/** + * gsasl_client_callback_pin_get: + * @ctx: libgsasl handle. + * + * Return the callback earlier set by calling + * gsasl_client_callback_pin_set(). + **/ +Gsasl_client_callback_pin +gsasl_client_callback_pin_get (Gsasl_ctx *ctx) +{ + return ctx->cbc_pin; +} + +/** + * gsasl_client_callback_service_set: + * @ctx: libgsasl handle. + * @cb: callback function + * + * Specify the callback function to use in the client to set the name + * of the service. The service buffer should be a registered GSSAPI + * host-based service name, hostname the name of the server. + * Servicename is used by DIGEST-MD5 and should be the name of generic + * server in case of a replicated service. The function can be later + * retrieved using gsasl_client_callback_service_get(). + **/ +void +gsasl_client_callback_service_set (Gsasl_ctx *ctx, + Gsasl_client_callback_service cb) +{ + ctx->cbc_service = cb; +} + +/** + * gsasl_client_callback_service_get: + * @ctx: libgsasl handle. + * + * Return the callback earlier set by calling + * gsasl_client_callback_service_set(). + **/ +Gsasl_client_callback_service +gsasl_client_callback_service_get (Gsasl_ctx *ctx) +{ + return ctx->cbc_service; +} + +/** + * gsasl_client_callback_anonymous_set: + * @ctx: libgsasl handle. + * @cb: callback function + * + * Specify the callback function to use in the client to set the + * anonymous token, which usually is the users email address. The + * function can be later retrieved using + * gsasl_client_callback_anonymous_get(). + **/ +void +gsasl_client_callback_anonymous_set (Gsasl_ctx *ctx, + Gsasl_client_callback_anonymous cb) +{ + ctx->cbc_anonymous = cb; +} + +/** + * gsasl_client_callback_anonymous_get: + * @ctx: libgsasl handle. + * + * Return the callback earlier set by calling + * gsasl_client_callback_anonymous_set(). + **/ +Gsasl_client_callback_anonymous +gsasl_client_callback_anonymous_get (Gsasl_ctx *ctx) +{ + return ctx->cbc_anonymous; +} + +/** + * gsasl_client_callback_qop_set: + * @ctx: libgsasl handle. + * @cb: callback function + * + * Specify the callback function to use in the client to determine the + * qop to use after looking at what the server offered. The function + * can be later retrieved using gsasl_client_callback_qop_get(). + **/ +void +gsasl_client_callback_qop_set (Gsasl_ctx *ctx, + Gsasl_client_callback_qop cb) +{ + ctx->cbc_qop = cb; +} + +/** + * gsasl_client_callback_qop_get: + * @ctx: libgsasl handle. + * + * Return the callback earlier set by calling + * gsasl_client_callback_qop_set(). + **/ +Gsasl_client_callback_qop +gsasl_client_callback_qop_get (Gsasl_ctx *ctx) +{ + return ctx->cbc_qop; +} + +/** + * gsasl_client_callback_maxbuf_set: + * @ctx: libgsasl handle. + * @cb: callback function + * + * Specify the callback function to use in the client to inform the + * server of the largest buffer the client is able to receive when + * using the DIGEST-MD5 "auth-int" or "auth-conf" Quality of + * Protection (qop). If this directive is missing, the default value + * 65536 will be assumed. The function can be later retrieved using + * gsasl_client_callback_maxbuf_get(). + **/ +void +gsasl_client_callback_maxbuf_set (Gsasl_ctx *ctx, + Gsasl_client_callback_maxbuf cb) +{ + ctx->cbc_maxbuf = cb; +} + +/** + * gsasl_client_callback_maxbuf_get: + * @ctx: libgsasl handle. + * + * Return the callback earlier set by calling + * gsasl_client_callback_maxbuf_set(). + **/ +Gsasl_client_callback_maxbuf +gsasl_client_callback_maxbuf_get (Gsasl_ctx *ctx) +{ + return ctx->cbc_maxbuf; +} + + +/* + * + ************************* Server Callbacks + * + */ + + +/** + * gsasl_server_callback_validate_set: + * @ctx: libgsasl handle. + * @cb: callback function + * + * Specify the callback function to use in the server for deciding if + * user is authenticated using authentication identity, authorization + * identity and password. The function can be later retrieved using + * gsasl_server_callback_validate_get(). + **/ +void +gsasl_server_callback_validate_set (Gsasl_ctx *ctx, + Gsasl_server_callback_validate cb) +{ + ctx->cbs_validate = cb; +} + +/** + * gsasl_server_callback_validate_get: + * @ctx: libgsasl handle. + * + * Return the callback earlier set by calling + * gsasl_server_callback_validate_set(). + **/ +Gsasl_server_callback_validate +gsasl_server_callback_validate_get (Gsasl_ctx *ctx) +{ + return ctx->cbs_validate; +} + +/** + * gsasl_server_callback_retrieve_set: + * @ctx: libgsasl handle. + * @cb: callback function + * + * Specify the callback function to use in the server for deciding if + * user is authenticated using authentication identity, authorization + * identity and password. The function can be later retrieved using + * gsasl_server_callback_retrieve_get(). + **/ +void +gsasl_server_callback_retrieve_set (Gsasl_ctx *ctx, + Gsasl_server_callback_retrieve cb) +{ + ctx->cbs_retrieve = cb; +} + +/** + * gsasl_server_callback_retrieve_get: + * @ctx: libgsasl handle. + * + * Return the callback earlier set by calling + * gsasl_server_callback_retrieve_set(). + **/ +Gsasl_server_callback_retrieve +gsasl_server_callback_retrieve_get (Gsasl_ctx *ctx) +{ + return ctx->cbs_retrieve; +} + +/** + * gsasl_server_callback_cram_md5_set: + * @ctx: libgsasl handle. + * @cb: callback function + * + * Specify the callback function to use in the server for deciding if + * user is authenticated using CRAM-MD5 challenge and response. The + * function can be later retrieved using + * gsasl_server_callback_cram_md5_get(). + **/ +void +gsasl_server_callback_cram_md5_set (Gsasl_ctx *ctx, + Gsasl_server_callback_cram_md5 cb) +{ + ctx->cbs_cram_md5 = cb; +} + +/** + * gsasl_server_callback_cram_md5_get: + * @ctx: libgsasl handle. + * + * Return the callback earlier set by calling + * gsasl_server_callback_cram_md5_set(). + **/ +Gsasl_server_callback_cram_md5 +gsasl_server_callback_cram_md5_get (Gsasl_ctx *ctx) +{ + return ctx->cbs_cram_md5; +} + +/** + * gsasl_server_callback_digest_md5_set: + * @ctx: libgsasl handle. + * @cb: callback function + * + * Specify the callback function to use in the server for retrieving + * the secret hash of the username, realm and password for use in the + * DIGEST-MD5 mechanism. The function can be later retrieved using + * gsasl_server_callback_digest_md5_get(). + **/ +void +gsasl_server_callback_digest_md5_set (Gsasl_ctx *ctx, + Gsasl_server_callback_digest_md5 cb) +{ + ctx->cbs_digest_md5 = cb; +} + +/** + * gsasl_server_callback_digest_md5_get: + * @ctx: libgsasl handle. + * + * Return the callback earlier set by calling + * gsasl_server_callback_digest_md5_set(). + **/ +Gsasl_server_callback_digest_md5 +gsasl_server_callback_digest_md5_get (Gsasl_ctx *ctx) +{ + return ctx->cbs_digest_md5; +} + +/** + * gsasl_server_callback_external_set: + * @ctx: libgsasl handle. + * @cb: callback function + * + * Specify the callback function to use in the server for deciding if + * user is authenticated out of band. The function can be later + * retrieved using gsasl_server_callback_external_get(). + **/ +void +gsasl_server_callback_external_set (Gsasl_ctx *ctx, + Gsasl_server_callback_external cb) +{ + ctx->cbs_external = cb; +} + +/** + * gsasl_server_callback_external_get: + * @ctx: libgsasl handle. + * + * Return the callback earlier set by calling + * gsasl_server_callback_external_set(). + **/ +Gsasl_server_callback_external +gsasl_server_callback_external_get (Gsasl_ctx *ctx) +{ + return ctx->cbs_external; +} + +/** + * gsasl_server_callback_anonymous_set: + * @ctx: libgsasl handle. + * @cb: callback function + * + * Specify the callback function to use in the server for deciding if + * user is permitted anonymous access. The function can be later + * retrieved using gsasl_server_callback_anonymous_get(). + **/ +void +gsasl_server_callback_anonymous_set (Gsasl_ctx *ctx, + Gsasl_server_callback_anonymous cb) +{ + ctx->cbs_anonymous = cb; +} + +/** + * gsasl_server_callback_anonymous_get: + * @ctx: libgsasl handle. + * + * Return the callback earlier set by calling + * gsasl_server_callback_anonymous_set(). + **/ +Gsasl_server_callback_anonymous +gsasl_server_callback_anonymous_get (Gsasl_ctx *ctx) +{ + return ctx->cbs_anonymous; +} + +/** + * gsasl_server_callback_realm_set: + * @ctx: libgsasl handle. + * @cb: callback function + * + * Specify the callback function to use in the server to know which + * realm it serves. The realm is used by the user to determine which + * username and password to use. The function can be later retrieved + * using gsasl_server_callback_realm_get(). + **/ +void +gsasl_server_callback_realm_set (Gsasl_ctx *ctx, + Gsasl_server_callback_realm cb) +{ + ctx->cbs_realm = cb; +} + +/** + * gsasl_server_callback_realm_get: + * @ctx: libgsasl handle. + * + * Return the callback earlier set by calling + * gsasl_server_callback_realm_set(). + **/ +Gsasl_server_callback_realm +gsasl_server_callback_realm_get (Gsasl_ctx *ctx) +{ + return ctx->cbs_realm; +} + +/** + * gsasl_server_callback_qop_set: + * @ctx: libgsasl handle. + * @cb: callback function + * + * Specify the callback function to use in the server to know which + * quality of protection it accepts. The quality of protection + * eventually used is selected by the client though. It is currently + * used by the DIGEST-MD5 mechanism. The function can be later + * retrieved using gsasl_server_callback_qop_get(). + **/ +void +gsasl_server_callback_qop_set (Gsasl_ctx *ctx, + Gsasl_server_callback_qop cb) +{ + ctx->cbs_qop = cb; +} + +/** + * gsasl_server_callback_qop_get: + * @ctx: libgsasl handle. + * + * Return the callback earlier set by calling + * gsasl_server_callback_qop_set(). + **/ +Gsasl_server_callback_qop +gsasl_server_callback_qop_get (Gsasl_ctx *ctx) +{ + return ctx->cbs_qop; +} + +/** + * gsasl_server_callback_maxbuf_set: + * @ctx: libgsasl handle. + * @cb: callback function + * + * Specify the callback function to use in the server to inform the + * client of the largest buffer the server is able to receive when + * using the DIGEST-MD5 "auth-int" or "auth-conf" Quality of + * Protection (qop). If this directive is missing, the default value + * 65536 will be assumed. The function can be later retrieved using + * gsasl_server_callback_maxbuf_get(). + **/ +void +gsasl_server_callback_maxbuf_set (Gsasl_ctx *ctx, + Gsasl_server_callback_maxbuf cb) +{ + ctx->cbs_maxbuf = cb; +} + +/** + * gsasl_server_callback_maxbuf_get: + * @ctx: libgsasl handle. + * + * Return the callback earlier set by calling + * gsasl_server_callback_maxbuf_set(). + **/ +Gsasl_server_callback_maxbuf +gsasl_server_callback_maxbuf_get (Gsasl_ctx *ctx) +{ + return ctx->cbs_maxbuf; +} + +/** + * gsasl_server_callback_cipher_set: + * @ctx: libgsasl handle. + * @cb: callback function + * + * Specify the callback function to use in the server to inform the + * client of the cipher suites supported. The DES and 3DES ciphers + * must be supported for interoperability. It is currently used by + * the DIGEST-MD5 mechanism. The function can be later retrieved + * using gsasl_server_callback_cipher_get(). + **/ +void +gsasl_server_callback_cipher_set (Gsasl_ctx *ctx, + Gsasl_server_callback_cipher cb) +{ + ctx->cbs_cipher = cb; +} + +/** + * gsasl_server_callback_cipher_get: + * @ctx: libgsasl handle. + * + * Return the callback earlier set by calling + * gsasl_server_callback_cipher_set(). + **/ +Gsasl_server_callback_cipher +gsasl_server_callback_cipher_get (Gsasl_ctx *ctx) +{ + return ctx->cbs_cipher; +} + +/** + * gsasl_server_callback_securid_set: + * @ctx: libgsasl handle. + * @cb: callback function + * + * Specify the callback function to use in the server for validating a + * user via the SECURID mechanism. The function should return + * GSASL_OK if user authenticated successfully, + * GSASL_SECURID_SERVER_NEED_ADDITIONAL_PASSCODE if it wants another + * passcode, GSASL_SECURID_SERVER_NEED_NEW_PIN if it wants a PIN + * change, or an error. When (and only when) + * GSASL_SECURID_SERVER_NEED_NEW_PIN is returned, suggestpin can be + * populated with a PIN code the server suggests, and suggestpinlen + * set to the length of the PIN. The function can be later retrieved + * using gsasl_server_callback_securid_get(). + **/ +void +gsasl_server_callback_securid_set (Gsasl_ctx *ctx, + Gsasl_server_callback_securid cb) +{ + ctx->cbs_securid = cb; +} + +/** + * gsasl_server_callback_securid_get: + * @ctx: libgsasl handle. + * + * Return the callback earlier set by calling + * gsasl_server_callback_securid_set(). + **/ +Gsasl_server_callback_securid +gsasl_server_callback_securid_get (Gsasl_ctx *ctx) +{ + return ctx->cbs_securid; +} + +/** + * gsasl_server_callback_gssapi_set: + * @ctx: libgsasl handle. + * @cb: callback function + * + * Specify the callback function to use in the server for checking if + * a GSSAPI user is authorized for username (by, e.g., calling + * krb5_userok()). The function should return GSASL_OK if the user + * should be permitted access, or an error code such as + * GSASL_AUTHENTICATION_ERROR on failure. The function can be later + * retrieved using gsasl_server_callback_gssapi_get(). + **/ +void +gsasl_server_callback_gssapi_set (Gsasl_ctx *ctx, + Gsasl_server_callback_gssapi cb) +{ + ctx->cbs_gssapi = cb; +} + +/** + * gsasl_server_callback_gssapi_get: + * @ctx: libgsasl handle. + * + * Return the callback earlier set by calling + * gsasl_server_callback_gssapi_set(). + **/ +Gsasl_server_callback_gssapi +gsasl_server_callback_gssapi_get (Gsasl_ctx *ctx) +{ + return ctx->cbs_gssapi; +} + +/** + * gsasl_server_callback_service_set: + * @ctx: libgsasl handle. + * @cb: callback function + * + * Specify the callback function to use in the server to set the name + * of the service. The service buffer should be a registered GSSAPI + * host-based service name, hostname the name of the server. The + * function can be later retrieved using + * gsasl_server_callback_service_get(). + **/ +void +gsasl_server_callback_service_set (Gsasl_ctx *ctx, + Gsasl_server_callback_service cb) +{ + ctx->cbs_service = cb; +} + +/** + * gsasl_server_callback_service_get: + * @ctx: libgsasl handle. + * + * Return the callback earlier set by calling + * gsasl_server_callback_service_set(). + **/ +Gsasl_server_callback_service +gsasl_server_callback_service_get (Gsasl_ctx *ctx) +{ + return ctx->cbs_service; +} diff --git a/lib/common.c b/lib/common.c new file mode 100644 index 0000000..c54971e --- /dev/null +++ b/lib/common.c @@ -0,0 +1,172 @@ +/* common.c static variables + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +static const char *GSASL_VALID_MECHANISM_CHARACTERS = +"ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789-_"; + +#include "internal.h" + +#include "cram-md5.h" /* RFC 2195 */ +#include "external.h" /* RFC 2222 */ +#include "x-gssapi.h" /* RFC 2222 */ +#include "anonymous.h" /* RFC 2245 */ +#include "plain.h" /* RFC 2595 */ +#include "securid.h" /* RFC 2808 */ +#include "digest-md5.h" /* RFC 2831 */ + +#include "login.h" /* non-standard */ +#include "x-ntlm.h" /* non-standard */ + +_Gsasl_mechanism _gsasl_all_mechanisms[] = { +#ifdef USE_ANONYMOUS + { _GSASL_ANONYMOUS_NAME, + { _gsasl_anonymous_client_init, + _gsasl_anonymous_client_done, + _gsasl_anonymous_client_start, + _gsasl_anonymous_client_step, + _gsasl_anonymous_client_finish, }, + { _gsasl_anonymous_server_init, + _gsasl_anonymous_server_done, + _gsasl_anonymous_server_start, + _gsasl_anonymous_server_step, + _gsasl_anonymous_server_finish } + }, +#endif /* USE_ANONYMOUS */ + +#ifdef USE_EXTERNAL + { _GSASL_EXTERNAL_NAME, + { _gsasl_external_client_init, + _gsasl_external_client_done, + _gsasl_external_client_start, + _gsasl_external_client_step, + _gsasl_external_client_finish, }, + { _gsasl_external_server_init, + _gsasl_external_server_done, + _gsasl_external_server_start, + _gsasl_external_server_step, + _gsasl_external_server_finish } + }, +#endif /* USE_EXTERNAL */ + +#ifdef USE_LOGIN + { _GSASL_LOGIN_NAME, + { _gsasl_login_client_init, + _gsasl_login_client_done, + _gsasl_login_client_start, + _gsasl_login_client_step, + _gsasl_login_client_finish, }, + { _gsasl_login_server_init, + _gsasl_login_server_done, + _gsasl_login_server_start, + _gsasl_login_server_step, + _gsasl_login_server_finish } + }, +#endif /* USE_LOGIN */ + +#ifdef USE_PLAIN + { _GSASL_PLAIN_NAME, + { _gsasl_plain_client_init, + _gsasl_plain_client_done, + _gsasl_plain_client_start, + _gsasl_plain_client_step, + _gsasl_plain_client_finish, }, + { _gsasl_plain_server_init, + _gsasl_plain_server_done, + _gsasl_plain_server_start, + _gsasl_plain_server_step, + _gsasl_plain_server_finish } + }, +#endif /* USE_PLAIN */ + +#ifdef USE_SECURID + { _GSASL_SECURID_NAME, + { _gsasl_securid_client_init, + _gsasl_securid_client_done, + _gsasl_securid_client_start, + _gsasl_securid_client_step, + _gsasl_securid_client_finish }, + { _gsasl_securid_server_init, + _gsasl_securid_server_done, + _gsasl_securid_server_start, + _gsasl_securid_server_step, + _gsasl_securid_server_finish } + }, +#endif /* USE_SECURID */ + +#ifdef USE_NTLM + { _GSASL_NTLM_NAME, + { _gsasl_ntlm_client_init, + _gsasl_ntlm_client_done, + _gsasl_ntlm_client_start, + _gsasl_ntlm_client_step, + _gsasl_ntlm_client_finish }, + }, +#endif /* USE_NTLM */ + +#ifdef USE_CRAM_MD5 + { _GSASL_CRAM_MD5_NAME, + { _gsasl_cram_md5_client_init, + _gsasl_cram_md5_client_done, + _gsasl_cram_md5_client_start, + _gsasl_cram_md5_client_step, + _gsasl_cram_md5_client_finish }, + { _gsasl_cram_md5_server_init, + _gsasl_cram_md5_server_done, + _gsasl_cram_md5_server_start, + _gsasl_cram_md5_server_step, + _gsasl_cram_md5_server_finish } + }, +#endif /* USE_CRAM_MD5 */ + +#ifdef USE_DIGEST_MD5 + { _GSASL_DIGEST_MD5_NAME, + { _gsasl_digest_md5_client_init, + _gsasl_digest_md5_client_done, + _gsasl_digest_md5_client_start, + _gsasl_digest_md5_client_step, + _gsasl_digest_md5_client_finish }, + { _gsasl_digest_md5_server_init, + _gsasl_digest_md5_server_done, + _gsasl_digest_md5_server_start, + _gsasl_digest_md5_server_step, + _gsasl_digest_md5_server_finish } + }, +#endif /* USE_DIGEST_MD5 */ + +#if USE_GSSAPI + { _GSASL_GSSAPI_NAME, + { _gsasl_gssapi_client_init, + _gsasl_gssapi_client_done, + _gsasl_gssapi_client_start, + _gsasl_gssapi_client_step, + _gsasl_gssapi_client_finish }, + { _gsasl_gssapi_server_init, + _gsasl_gssapi_server_done, + _gsasl_gssapi_server_start, + _gsasl_gssapi_server_step, + _gsasl_gssapi_server_finish } + }, +#endif /* USE_GSSAPI */ + + { + 0 + } +}; diff --git a/lib/cram-md5.c b/lib/cram-md5.c new file mode 100644 index 0000000..8070dbd --- /dev/null +++ b/lib/cram-md5.c @@ -0,0 +1,388 @@ +/* cram-md5.c implementation of SASL mechanism CRAM-MD5 from RFC 2195 + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" + +#ifdef USE_CRAM_MD5 + +#include <gcrypt.h> + +int +_gsasl_cram_md5_client_init (Gsasl_ctx *ctx) +{ + int res; + + if (gcry_check_version(GCRYPT_VERSION) == NULL) + return GSASL_GCRYPT_ERROR; + + res = gcry_control (GCRYCTL_INIT_SECMEM, 512, 0); + if (res != GCRYERR_SUCCESS) + return GSASL_GCRYPT_ERROR; + + return GSASL_OK; +} + +void +_gsasl_cram_md5_client_done (Gsasl_ctx *ctx) +{ + return; +} + +int +_gsasl_cram_md5_client_start (Gsasl_session_ctx *cctx, + void **mech_data) +{ + Gsasl_ctx *ctx; + int *done; + + ctx = gsasl_client_ctx_get (cctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + if (gsasl_client_callback_authentication_id_get (ctx) == NULL) + return GSASL_NEED_CLIENT_AUTHENTICATION_ID_CALLBACK; + + if (gsasl_client_callback_password_get (ctx) == NULL) + return GSASL_NEED_CLIENT_PASSWORD_CALLBACK; + + done = (int*) malloc(sizeof(*done)); + if (done == NULL) + return GSASL_MALLOC_ERROR; + + *done = 0; + + *mech_data = done; + + return GSASL_OK; +} + +int +_gsasl_cram_md5_client_step (Gsasl_session_ctx *cctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len) +{ + int *step = mech_data; + Gsasl_ctx *ctx; + Gsasl_client_callback_authentication_id cb_authentication_id; + Gsasl_client_callback_password cb_password; + GCRY_MD_HD md5h; + char *hash; + int hash_len = gcry_md_get_algo_dlen (GCRY_MD_MD5); + size_t len; + char *tmp; + int i; + int res; + + if (*step > 0) + return GSASL_OK; + + if (input_len == 0) + { + *output_len = 0; + return GSASL_NEEDS_MORE; + } + + ctx = gsasl_client_ctx_get (cctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + cb_authentication_id = gsasl_client_callback_authentication_id_get (ctx); + if (cb_authentication_id == NULL) + return GSASL_NEED_CLIENT_AUTHENTICATION_ID_CALLBACK; + + cb_password = gsasl_client_callback_password_get (ctx); + if (cb_password == NULL) + return GSASL_NEED_CLIENT_PASSWORD_CALLBACK; + + md5h = gcry_md_open (GCRY_MD_MD5, GCRY_MD_FLAG_HMAC); + if (md5h == NULL) + return GSASL_GCRYPT_ERROR; + + /* XXX? password stored in callee's output buffer */ + len = *output_len; + res = cb_password (cctx, output, &len); + if (res != GSASL_OK) + return res; + tmp = gsasl_utf8_nfkc_normalize (output, len); + if (tmp == NULL) + return GSASL_UNICODE_NORMALIZATION_ERROR; + res = gcry_md_setkey (md5h, tmp, strlen(tmp)); + free(tmp); + if (res != GCRYERR_SUCCESS) + return GSASL_GCRYPT_ERROR; + + gcry_md_write (md5h, input, input_len); + + hash = gcry_md_read (md5h, GCRY_MD_MD5); + if (hash == NULL) + return GSASL_GCRYPT_ERROR; + + len = *output_len; + res = cb_authentication_id (cctx, output, &len); + if (res != GSASL_OK) + return res; + tmp = gsasl_utf8_nfkc_normalize (output, len); + if (tmp == NULL) + return GSASL_UNICODE_NORMALIZATION_ERROR; + if (strlen(tmp) + strlen(" ") + 2*hash_len >= *output_len) + { + free(tmp); + return GSASL_TOO_SMALL_BUFFER; + } + len = strlen(tmp); + memcpy(output, tmp, len); + free(tmp); + output[len++] = ' '; + + for (i = 0; i < hash_len; i++) + { + output[len + 2*i + 1] = HEXCHAR(hash[i]); + output[len + 2*i + 0] = HEXCHAR(hash[i] >> 4); + } + *output_len = len + 2*hash_len; + + gcry_md_close(md5h); + + (*step)++; + + return GSASL_NEEDS_MORE; +} + +int +_gsasl_cram_md5_client_finish (Gsasl_session_ctx *cctx, + void *mech_data) +{ + int *step = mech_data; + + free(step); + + return GSASL_OK; +} + +/* Server */ + +int +_gsasl_cram_md5_server_init (Gsasl_ctx *ctx) +{ + if (gcry_check_version(GCRYPT_VERSION) == NULL) + return GSASL_GCRYPT_ERROR; + + return GSASL_OK; +} + +void +_gsasl_cram_md5_server_done (Gsasl_ctx *ctx) +{ + return; +} + +int +_gsasl_cram_md5_server_start (Gsasl_session_ctx *sctx, + void **mech_data) +{ + Gsasl_ctx *ctx; + char *challenge; + int i; + + ctx = gsasl_server_ctx_get (sctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + if (gsasl_server_callback_cram_md5_get (ctx) == NULL && + gsasl_server_callback_retrieve_get (ctx) == NULL) + return GSASL_NEED_SERVER_CRAM_MD5_CALLBACK; + + /* XXX this is ad-hoc and uses "localhost" instead of FQDN */ + +#define START_OF_XS 1 +#define NUMBER_OF_XS 16 +#define CHALLENGE_FORMAT "<XXXXXXXXXXXXXXXX.libgsasl@localhost>" + + challenge = (char*) malloc(strlen(CHALLENGE_FORMAT) + 1); + if (challenge == NULL) + return GSASL_MALLOC_ERROR; + + strcpy(challenge, CHALLENGE_FORMAT); + + gcry_randomize (challenge + 1, NUMBER_OF_XS, GCRY_WEAK_RANDOM); + + for (i = 0; i < NUMBER_OF_XS/2; i++) + { + challenge[START_OF_XS + NUMBER_OF_XS/2 + i] = + HEXCHAR(challenge[START_OF_XS + i]); + challenge[START_OF_XS + i] = + HEXCHAR(challenge[START_OF_XS + i] >> 4); + } + + *mech_data = challenge; + + return GSASL_OK; +} + +int +_gsasl_cram_md5_server_step (Gsasl_session_ctx *sctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len) +{ + char *challenge = mech_data; + Gsasl_server_callback_cram_md5 cb_cram_md5; + Gsasl_server_callback_retrieve cb_retrieve; + int hash_len = gcry_md_get_algo_dlen (GCRY_MD_MD5); + char *username = NULL; + Gsasl_ctx *ctx; + int res; + + if (input_len == 0) + { + if (*output_len < strlen(challenge)) + return GSASL_TOO_SMALL_BUFFER; + + *output_len = strlen(challenge); + memcpy(output, challenge, *output_len); + + return GSASL_NEEDS_MORE; + } + + if (input_len <= hash_len * 2) + return GSASL_MECHANISM_PARSE_ERROR; + + if (input[input_len - hash_len * 2 - 1] != ' ') + return GSASL_MECHANISM_PARSE_ERROR; + + ctx = gsasl_server_ctx_get (sctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + cb_cram_md5 = gsasl_server_callback_cram_md5_get (ctx); + cb_retrieve = gsasl_server_callback_retrieve_get (ctx); + if (cb_cram_md5 == NULL && cb_retrieve == NULL) + return GSASL_NEED_SERVER_CRAM_MD5_CALLBACK; + + username = (char*) malloc(input_len); + if (username == NULL) + return GSASL_MALLOC_ERROR; + + memcpy(username, input, input_len - hash_len * 2); + username[input_len - hash_len * 2 - 1] = '\0'; + + if (cb_cram_md5) + { + char *response; + + response = (char*) malloc(hash_len * 2 + 1); + if (response == NULL) + { + free(username); + return GSASL_MALLOC_ERROR; + } + + memcpy(response, input + input_len - hash_len * 2, hash_len * 2); + response[hash_len * 2 + 1] = '\0'; + + res = cb_cram_md5 (sctx, username, challenge, response); + + free(response); + } + else if (cb_retrieve) + { + GCRY_MD_HD md5h; + char *hash; + size_t len; + size_t keylen; + char *key; + char *normkey; + int i; + + md5h = gcry_md_open (GCRY_MD_MD5, GCRY_MD_FLAG_HMAC); + if (md5h == NULL) + { + free(username); + return GSASL_GCRYPT_ERROR; + } + + res = cb_retrieve(sctx, username, NULL, NULL, NULL, &keylen); + if (res != GSASL_OK) + return res; + key = malloc(keylen); + if (key == NULL) + return GSASL_MALLOC_ERROR; + res = cb_retrieve(sctx, username, NULL, NULL, key, &keylen); + if (res != GSASL_OK) + { + free(username); + free(key); + return res; + } + normkey = gsasl_utf8_nfkc_normalize (key, keylen); + free(key); + if (normkey == NULL) + { + free(username); + return GSASL_UNICODE_NORMALIZATION_ERROR; + } + + res = gcry_md_setkey (md5h, normkey, strlen(normkey)); + free(normkey); + if (res != GCRYERR_SUCCESS) + { + free(username); + return GSASL_GCRYPT_ERROR; + } + + gcry_md_write (md5h, challenge, strlen(challenge)); + + hash = gcry_md_read (md5h, GCRY_MD_MD5); + if (hash == NULL) + { + free(username); + return GSASL_GCRYPT_ERROR; + } + + res = GSASL_OK; + for (i = 0; i < hash_len; i++) + if ((input[input_len - hash_len*2 + 2*i + 1] != HEXCHAR(hash[i])) || + (input[input_len - hash_len*2 + 2*i + 0] != HEXCHAR(hash[i] >> 4))) + res = GSASL_AUTHENTICATION_ERROR; + } + + free(username); + + return res; +} + +int +_gsasl_cram_md5_server_finish (Gsasl_session_ctx *sctx, + void *mech_data) +{ + char *challenge = mech_data; + + free(challenge); + + return GSASL_OK; +} + +#endif /* USE_CRAM_MD5 */ diff --git a/lib/cram-md5.h b/lib/cram-md5.h new file mode 100644 index 0000000..d60a78b --- /dev/null +++ b/lib/cram-md5.h @@ -0,0 +1,59 @@ +/* cram-md5.h header file for SASL mechanism CRAM-MD5 as defined in RFC 2195 + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _CRAM_MD5_H +#define _CRAM_MD5_H + +#include "internal.h" + +#ifdef USE_CRAM_MD5 + +#define _GSASL_CRAM_MD5_NAME "CRAM-MD5" + +extern int _gsasl_cram_md5_client_init (Gsasl_ctx *ctx); +extern void _gsasl_cram_md5_client_done (Gsasl_ctx *ctx); +extern int _gsasl_cram_md5_client_start (Gsasl_session_ctx *cctx, + void **mech_data); +extern int _gsasl_cram_md5_client_step (Gsasl_session_ctx *cctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len); +extern int _gsasl_cram_md5_client_finish (Gsasl_session_ctx *cctx, + void *mech_data); + +extern int _gsasl_cram_md5_server_init (Gsasl_ctx *ctx); +extern void _gsasl_cram_md5_server_done (Gsasl_ctx *ctx); +extern int _gsasl_cram_md5_server_start (Gsasl_session_ctx *sctx, + void **mech_data); +extern int _gsasl_cram_md5_server_step (Gsasl_session_ctx *sctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len); +extern int _gsasl_cram_md5_server_finish (Gsasl_session_ctx *sctx, + void *mech_data); + +#endif /* USE_CRAM_MD5 */ + +#endif /* _CRAM_MD5_H */ diff --git a/lib/digest-md5.c b/lib/digest-md5.c new file mode 100644 index 0000000..2e26f76 --- /dev/null +++ b/lib/digest-md5.c @@ -0,0 +1,1742 @@ +/* digest-md5.c implementation of SASL mechanism DIGEST-MD5 from RFC 2831 + * Copyright (C) 2002 Simon Josefsson + * Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc. (getsubopt) + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" + +#ifdef USE_DIGEST_MD5 + +#include <gcrypt.h> +#ifdef HAVE_MATH_H +#include <math.h> +#endif +#ifdef HAVE_LIMITS_H +#include <limits.h> +#endif +#if HAVE_INTTYPES_H +# include <inttypes.h> +#else +# if HAVE_STDINT_H +# include <stdint.h> +# endif +#endif + +#define NONCE_ENTROPY_BITS 64 +#define CNONCE_ENTROPY_BITS 64 + +#define DELIM ", " +#define REALM_PRE "realm=\"" +#define REALM_POST "\"" DELIM +#define NONCE_PRE "nonce=\"" +#define NONCE_POST "\"" DELIM +#define QOP_LIST_PRE "qop=\"" +#define QOP_LIST_POST "\"" DELIM +#define QOP_DELIM DELIM +#define QOP_AUTH "auth" +#define QOP_AUTH_INT "auth-int" +#define QOP_AUTH_CONF "auth-conf" +#define MAXBUF_PRE "maxbuf=" +#define MAXBUF_POST DELIM +#define DEFAULT_CHARSET "utf-8" +#define CHARSET "charset=" DEFAULT_CHARSET DELIM +#define DEFAULT_ALGORITHM "md5-sess" +#define ALGORITHM "algorithm=" DEFAULT_ALGORITHM DELIM +#define CIPHER_PRE "cipher=\"" +#define CIPHER_DELIM DELIM +#define CIPHER_DES "des" +#define CIPHER_3DES "3des" +#define CIPHER_RC4_40 "rc4-40" +#define CIPHER_RC4 "rc4" +#define CIPHER_RC4_56 "rc4-56" +#define CIPHER_AES "aes" +#define CIPHER_POST "\"" DELIM + +#define USERNAME_PRE "username=\"" +#define USERNAME_POST "\"" DELIM +#define CNONCE_PRE "cnonce=\"" +#define CNONCE_POST "\"" DELIM +#define NONCE_COUNT_PRE "nc=" +#define NONCE_COUNT_POST DELIM +#define QOP_PRE "qop=" +#define QOP_POST DELIM +#define RESPONSE_PRE "response=" +#define RESPONSE_POST "" DELIM +#define AUTHZID_PRE "authzid=\"" +#define AUTHZID_POST "\"" DELIM +#define DIGEST_URI_PRE "digest-uri=\"" +#define DIGEST_URI_POST "\"" DELIM + +#define RSPAUTH_PRE "rspauth=" +#define RSPAUTH_POST "" + +#define A2_PRE "AUTHENTICATE:" +#define A2_POST ":00000000000000000000000000000000" +#define COLON ":" +#define NCLEN 8 +#define MD5LEN 16 +#define MAXBUF_DEFAULT 65536 +#define RESPONSE_LENGTH 32 +#define RSPAUTH_LENGTH RESPONSE_LENGTH + +#define PRINT_OUTPUT 0 + +enum + { + /* the order must match the following struct */ + CHALLENGE_REALM = 0, + CHALLENGE_NONCE, + CHALLENGE_QOP, + CHALLENGE_STALE, + CHALLENGE_MAXBUF, + CHALLENGE_CHARSET, + CHALLENGE_ALGORITHM, + CHALLENGE_CIPHER + }; + +const char *digest_challenge_opts[] = + { + /* the order must match the previous enum */ + "realm", + "nonce", + "qop", + "stale", + "maxbuf", + "charset", + "algorithm", + "cipher", + NULL + }; + +enum + { + /* the order must match the following struct */ + RESPONSE_USERNAME = 0, + RESPONSE_REALM, + RESPONSE_NONCE, + RESPONSE_CNONCE, + RESPONSE_NC, + RESPONSE_QOP, + RESPONSE_DIGEST_URI, + RESPONSE_RESPONSE, + RESPONSE_MAXBUF, + RESPONSE_CHARSET, + RESPONSE_CIPHER, + RESPONSE_AUTHZID + }; + +const char *digest_response_opts[] = + { + /* the order must match the previous enum */ + "username", + "realm", + "nonce", + "cnonce", + "nc", + "qop", + "digest-uri", + "response", + "maxbuf", + "charset", + "cipher", + "authzid", + NULL + }; + +enum + { + /* the order must match the following struct */ + RESPONSEAUTH_RSPAUTH = 0 + }; + +const char *digest_responseauth_opts[] = + { + /* the order must match the previous enum */ + "rspauth", + NULL + }; + +enum + { + /* the order must match the following struct */ + QOP_AUTH_OPTION = 0, + QOP_AUTH_INT_OPTION, + QOP_AUTH_CONF_OPTION + }; + +const char *qop_opts[] = + { + /* the order must match the previous enum */ + QOP_AUTH, + QOP_AUTH_INT, + QOP_AUTH_CONF, + NULL + }; + +enum + { + /* the order must match the following struct */ + CIPHER_DES_OPTION = 0, + CIPHER_3DES_OPTION, + CIPHER_RC4_OPTION, + CIPHER_RC4_40_OPTION, + CIPHER_RC4_56_OPTION, + CIPHER_AES_OPTION + }; + +const char *cipher_opts[] = + { + /* the order must match the previous enum */ + CIPHER_DES, + CIPHER_3DES, + CIPHER_RC4, + CIPHER_RC4_40, + CIPHER_RC4_56, + CIPHER_AES, + NULL + }; + +/* Parse comma separate list into words. + Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc. + From the GNU C Library, under GNU LGPL version 2.1. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + Modified for Libgsasl by Simon Josefsson <simon@josefsson.org> + Copyright (C) 2002 Simon Josefsson + + Parse comma separated suboption from *OPTIONP and match against + strings in TOKENS. If found return index and set *VALUEP to + optional value introduced by an equal sign. If the suboption is + not part of TOKENS return in *VALUEP beginning of unknown + suboption. On exit *OPTIONP is set to the beginning of the next + token or at the terminating NUL character. */ +static int +_gsasl_getsubopt (optionp, tokens, valuep) + char **optionp; + char *const *tokens; + char **valuep; +{ + char *endp, *vstart; + int cnt; + int inside_quote = 0; + + if (**optionp == '\0') + return -1; + + /* Find end of next token. */ + endp = *optionp; + while (*endp != '\0' && (inside_quote || (!inside_quote && *endp != ','))) + { + if (*endp == '"') + inside_quote = !inside_quote; + endp++; + } + + /* Find start of value. */ + vstart = memchr (*optionp, '=', endp - *optionp); + if (vstart == NULL) + vstart = endp; + + /* Try to match the characters between *OPTIONP and VSTART against + one of the TOKENS. */ + for (cnt = 0; tokens[cnt] != NULL; ++cnt) + if (memcmp (*optionp, tokens[cnt], vstart - *optionp) == 0 + && tokens[cnt][vstart - *optionp] == '\0') + { + /* We found the current option in TOKENS. */ + *valuep = vstart != endp ? vstart + 1 : NULL; + + while (*valuep && (**valuep == ' ' || + **valuep == '\t' || + **valuep == '\r' || + **valuep == '\n' || + **valuep == '"')) + (*valuep)++; + + if (*endp != '\0') + *endp++ = '\0'; + *optionp = endp; + endp -= 2; + while (*endp == ' ' || + *endp == '\t' || + *endp == '\r' || + *endp == '\n' || + *endp == '"') + *endp-- = '\0'; + while (**optionp == ' ' || + **optionp == '\t' || + **optionp == '\r' || + **optionp == '\n') + (*optionp)++; + + return cnt; + } + + /* The current suboption does not match any option. */ + *valuep = *optionp; + + if (*endp != '\0') + *endp++ = '\0'; + *optionp = endp; + while (**optionp == ' ' || + **optionp == '\t' || + **optionp == '\r' || + **optionp == '\n') + (*optionp)++; + + return -1; +} + +static int +_gsasl_digest (char *output, /* must have 2*MD5LEN available bytes */ + unsigned char secret[MD5LEN], + unsigned char *nonce, + uint32_t nc, + char *cnonce, + int qop, + char *authzid, + char *digesturi, + char *a2string) /* "AUTHENTICATE:" or ":" */ +{ + char nchex[NCLEN+1]; + char a1hexhash[2*MD5LEN]; + char a2hexhash[2*MD5LEN]; + GCRY_MD_HD md5h; + unsigned char *hash; + int i; + + /* A1 */ + + md5h = gcry_md_open (GCRY_MD_MD5, 0); + if (md5h == NULL) + return GSASL_GCRYPT_ERROR; + + gcry_md_write (md5h, secret, MD5LEN); + gcry_md_write (md5h, COLON, strlen(COLON)); + gcry_md_write (md5h, nonce, strlen(nonce)); + gcry_md_write (md5h, COLON, strlen(COLON)); + gcry_md_write (md5h, cnonce, strlen(cnonce)); + if (authzid && strlen(authzid) > 0) + { + gcry_md_write (md5h, COLON, strlen(COLON)); + gcry_md_write (md5h, authzid, strlen(authzid)); + } + + hash = gcry_md_read (md5h, GCRY_MD_MD5); + if (hash == NULL) + return GSASL_GCRYPT_ERROR; + + for (i = 0; i < MD5LEN; i++) + { + a1hexhash[2*i + 1] = HEXCHAR(hash[i]); + a1hexhash[2*i + 0] = HEXCHAR(hash[i] >> 4); + } + gcry_md_close(md5h); + + /* A2 */ + + md5h = gcry_md_open (GCRY_MD_MD5, 0); + if (md5h == NULL) + return GSASL_GCRYPT_ERROR; + + gcry_md_write (md5h, a2string, strlen(a2string)); + gcry_md_write (md5h, digesturi, strlen(digesturi)); + if (qop & GSASL_QOP_AUTH_INT || qop & GSASL_QOP_AUTH_CONF) + { + gcry_md_write (md5h, A2_POST, strlen(A2_POST)); + } + + hash = gcry_md_read (md5h, GCRY_MD_MD5); + if (hash == NULL) + return GSASL_GCRYPT_ERROR; + + for (i = 0; i < MD5LEN; i++) + { + a2hexhash[2*i + 1] = HEXCHAR(hash[i]); + a2hexhash[2*i + 0] = HEXCHAR(hash[i] >> 4); + } + gcry_md_close(md5h); + + /* response_value */ + + md5h = gcry_md_open (GCRY_MD_MD5, 0); + if (md5h == NULL) + return GSASL_GCRYPT_ERROR; + + gcry_md_write (md5h, a1hexhash, 2*MD5LEN); + gcry_md_write (md5h, COLON, strlen(COLON)); + gcry_md_write (md5h, nonce, strlen(nonce)); + gcry_md_write (md5h, COLON, strlen(COLON)); + sprintf(nchex, "%0*x", NCLEN, nc); + gcry_md_write (md5h, nchex, strlen(nchex)); + gcry_md_write (md5h, COLON, strlen(COLON)); + gcry_md_write (md5h, cnonce, strlen(cnonce)); + gcry_md_write (md5h, COLON, strlen(COLON)); + if (qop & GSASL_QOP_AUTH) + gcry_md_write (md5h, QOP_AUTH, strlen(QOP_AUTH)); + else if (qop & GSASL_QOP_AUTH_INT) + gcry_md_write (md5h, QOP_AUTH_INT, strlen(QOP_AUTH_INT)); + else if (qop & GSASL_QOP_AUTH_CONF) + gcry_md_write (md5h, QOP_AUTH_CONF, strlen(QOP_AUTH_CONF)); + gcry_md_write (md5h, COLON, strlen(COLON)); + gcry_md_write (md5h, a2hexhash, 2*MD5LEN); + + hash = gcry_md_read (md5h, GCRY_MD_MD5); + if (hash == NULL) + return GSASL_GCRYPT_ERROR; + + for (i = 0; i < MD5LEN; i++) + { + output[2*i + 1] = HEXCHAR(hash[i]); + output[2*i + 0] = HEXCHAR(hash[i] >> 4); + } + gcry_md_close(md5h); + + return GSASL_OK; +} + +/* Client */ + +struct _Gsasl_digest_md5_client_state { + int step; + unsigned char secret[MD5LEN]; + unsigned char *nonce; + uint32_t nc; + unsigned char cnonce[2*CNONCE_ENTROPY_BITS/8+1]; + Gsasl_qop qop; + unsigned char *authzid; + unsigned char *digesturi; + unsigned char response[RESPONSE_LENGTH+1]; +}; +typedef struct _Gsasl_digest_md5_client_state _Gsasl_digest_md5_client_state; + +int +_gsasl_digest_md5_client_init (Gsasl_ctx *ctx) +{ + int res; + + if (gcry_check_version(GCRYPT_VERSION) == NULL) + return GSASL_GCRYPT_ERROR; + + res = gcry_control (GCRYCTL_INIT_SECMEM, 512, 0); + if (res != GCRYERR_SUCCESS) + return GSASL_GCRYPT_ERROR; + + return GSASL_OK; +} + +void +_gsasl_digest_md5_client_done (Gsasl_ctx *ctx) +{ + return; +} + +int +_gsasl_digest_md5_client_start (Gsasl_session_ctx *cctx, + void **mech_data) +{ + _Gsasl_digest_md5_client_state *state; + Gsasl_ctx *ctx; + + ctx = gsasl_client_ctx_get (cctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + if (gsasl_client_callback_authentication_id_get (ctx) == NULL) + return GSASL_NEED_CLIENT_AUTHENTICATION_ID_CALLBACK; + + if (gsasl_client_callback_password_get (ctx) == NULL) + return GSASL_NEED_CLIENT_PASSWORD_CALLBACK; + + state = (_Gsasl_digest_md5_client_state*) malloc(sizeof(*state)); + if (state == NULL) + return GSASL_MALLOC_ERROR; + + state->step = 0; + state->nonce = NULL; + state->nc = 1; + state->qop = GSASL_QOP_AUTH; + state->authzid = NULL; + state->digesturi = NULL; + + *mech_data = state; + + return GSASL_OK; +} + +int +_gsasl_digest_md5_client_step (Gsasl_session_ctx *cctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len) +{ + _Gsasl_digest_md5_client_state *state = mech_data; + Gsasl_client_callback_authorization_id cb_authorization_id; + Gsasl_client_callback_authentication_id cb_authentication_id; + Gsasl_client_callback_password cb_password; + Gsasl_client_callback_service cb_service; + Gsasl_client_callback_qop cb_qop; + Gsasl_client_callback_maxbuf cb_maxbuf; + char *subopts; + char *value; + Gsasl_ctx *ctx; + int outlen; + int res, i; + + ctx = gsasl_client_ctx_get (cctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + cb_qop = gsasl_client_callback_qop_get (ctx); + cb_authorization_id = gsasl_client_callback_authorization_id_get (ctx); + cb_maxbuf = gsasl_client_callback_maxbuf_get (ctx); + + cb_authentication_id = gsasl_client_callback_authentication_id_get (ctx); + if (cb_authentication_id == NULL) + return GSASL_NEED_CLIENT_AUTHENTICATION_ID_CALLBACK; + + cb_password = gsasl_client_callback_password_get (ctx); + if (cb_password == NULL) + return GSASL_NEED_CLIENT_PASSWORD_CALLBACK; + + cb_service = gsasl_client_callback_service_get (ctx); + if (cb_service == NULL) + return GSASL_NEED_CLIENT_SERVICE_CALLBACK; + + if (*output_len < 1) + return GSASL_TOO_SMALL_BUFFER; + + strcpy(output, ""); + outlen = 0; + +#if PRINT_OUTPUT + if (input && input_len > 0) + puts(input); +#endif + + switch (state->step) + { + case 0: + { + char **realm = NULL; + size_t nrealm = 0; + int maxbuf = MAXBUF_DEFAULT; + int cipher = 0; + + if (input_len == 0) + { + *output_len = 0; + return GSASL_NEEDS_MORE; + } + + gcry_randomize (state->cnonce, CNONCE_ENTROPY_BITS/8,GCRY_WEAK_RANDOM); + for (i = 0; i < CNONCE_ENTROPY_BITS/8; i++) + { + state->cnonce[CNONCE_ENTROPY_BITS/8 + i] = + HEXCHAR(state->cnonce[i]); + state->cnonce[i] = HEXCHAR(state->cnonce[i] >> 4); + } + state->cnonce[2*CNONCE_ENTROPY_BITS/8] = '\0'; + + subopts = input; + while (*subopts != '\0') + switch (_gsasl_getsubopt (&subopts, digest_challenge_opts, &value)) + { + case CHALLENGE_REALM: + if (nrealm == 0) + realm = (char**) malloc(sizeof(*realm)); + else + realm = realloc(realm, (nrealm + 1) * sizeof(*realm)); + if (realm == NULL) + { + res = GSASL_MALLOC_ERROR; + goto done; + } + realm[nrealm] = strdup(value); + nrealm++; + break; + + case CHALLENGE_NONCE: + if (state->nonce != NULL) + { + res = GSASL_MECHANISM_PARSE_ERROR; + goto done; + } + state->nonce = strdup(value); + break; + + case CHALLENGE_QOP: + { + char *subsubopts; + char *val; + + state->qop = 0; + subsubopts = value; + while (*subsubopts != '\0') + switch (_gsasl_getsubopt (&subsubopts, qop_opts, &val)) + { + case QOP_AUTH_OPTION: + state->qop |= GSASL_QOP_AUTH; + break; + + case QOP_AUTH_INT_OPTION: + state->qop |= GSASL_QOP_AUTH_INT; + break; + + case QOP_AUTH_CONF_OPTION: + state->qop |= GSASL_QOP_AUTH_CONF; + break; + + default: + /* Ignore unknown qop */ + break; + } + } + break; + + case CHALLENGE_STALE: + printf("XXX stale: %s\n", value); + break; + + case CHALLENGE_MAXBUF: + maxbuf = strtol(value, NULL, 10); + break; + + case CHALLENGE_CHARSET: + if (strcmp(DEFAULT_CHARSET, value) != 0) + { + res = GSASL_MECHANISM_PARSE_ERROR; + goto done; + } + break; + + case CHALLENGE_ALGORITHM: + if (strcmp(DEFAULT_ALGORITHM, value) != 0) + { + res = GSASL_MECHANISM_PARSE_ERROR; + goto done; + } + break; + + case CHALLENGE_CIPHER: + { + char *subsubopts; + char *val; + + subsubopts = value; + while (*subsubopts != '\0') + switch (_gsasl_getsubopt (&subsubopts, cipher_opts, &val)) + { + case CIPHER_DES_OPTION: + cipher |= GSASL_CIPHER_DES; + break; + + case CIPHER_3DES_OPTION: + cipher |= GSASL_CIPHER_3DES; + break; + + case CIPHER_RC4_OPTION: + cipher |= GSASL_CIPHER_RC4; + break; + + case CIPHER_RC4_40_OPTION: + cipher |= GSASL_CIPHER_RC4_40; + break; + + case CIPHER_RC4_56_OPTION: + cipher |= GSASL_CIPHER_RC4_56; + break; + + case CIPHER_AES_OPTION: + cipher |= GSASL_CIPHER_AES; + break; + + default: + /* Ignoring unknown cipher. */ + break; + } + } + break; + + default: + /* Ignoring unknown parameter. */ + break; + } + if (state->qop == 0 || cipher == 0 || state->nonce == NULL) + { + res = GSASL_MECHANISM_PARSE_ERROR; + goto done; + } + if (cb_qop) + state->qop = cb_qop (cctx, state->qop); + else + state->qop = GSASL_QOP_AUTH; + if (cb_authorization_id) + { + size_t authzidlen; + + res = cb_authorization_id (cctx, NULL, &authzidlen); + if (res != GSASL_OK) + goto done; + state->authzid = (char*) malloc(authzidlen+1); + if (state->authzid == NULL) + { + res = GSASL_MALLOC_ERROR; + goto done; + } + res = cb_authorization_id (cctx, state->authzid, &authzidlen); + if (res != GSASL_OK) + goto done; + state->authzid[authzidlen] = '\0'; + } + /* username */ + { + int usernamelen; + + res = cb_authentication_id (cctx, NULL, &usernamelen); + if (res != GSASL_OK) + goto done; + + if (outlen + + strlen(USERNAME_PRE) + + usernamelen + + strlen(USERNAME_POST) >= *output_len) + { + res = GSASL_TOO_SMALL_BUFFER; + goto done; + } + + strcat(output, USERNAME_PRE); + outlen += strlen(USERNAME_PRE); + + res = cb_authentication_id (cctx, &output[outlen], &usernamelen); + if (res != GSASL_OK) + goto done; + outlen += usernamelen; + + strcat(output, USERNAME_POST); + outlen += strlen(USERNAME_POST); + } + /* realm */ + if (nrealm > 0) + { + if (outlen + + strlen(REALM_PRE) + + strlen(realm[0]) + + strlen(REALM_POST) >= *output_len) + { + res = GSASL_TOO_SMALL_BUFFER; + goto done; + } + + strcat(output, REALM_PRE); + outlen += strlen(REALM_PRE); + + strcat(output, realm[0]); + outlen += strlen(realm[0]); + + strcat(output, REALM_POST); + outlen += strlen(REALM_POST); + } + /* nonce */ + { + if (outlen + + strlen(NONCE_PRE) + + strlen(state->nonce) + + strlen(NONCE_POST) >= *output_len) + { + res = GSASL_TOO_SMALL_BUFFER; + goto done; + } + + strcat(output, NONCE_PRE); + outlen += strlen(NONCE_PRE); + + strcat(output, state->nonce); + outlen += strlen(state->nonce); + + strcat(output, NONCE_POST); + outlen += strlen(NONCE_POST); + } + /* cnonce */ + { + if (outlen + + strlen(CNONCE_PRE) + + strlen(state->cnonce) + + strlen(CNONCE_POST) >= *output_len) + { + res = GSASL_TOO_SMALL_BUFFER; + goto done; + } + + strcat(output, CNONCE_PRE); + outlen += strlen(CNONCE_PRE); + + strcat(output, state->cnonce); + outlen += strlen(state->cnonce); + + strcat(output, CNONCE_POST); + outlen += strlen(CNONCE_POST); + } + /* nonce-count */ + { + if (outlen + + strlen(NONCE_COUNT_PRE) + + NCLEN + + strlen(NONCE_COUNT_POST) >= *output_len) + { + res = GSASL_TOO_SMALL_BUFFER; + goto done; + } + + strcat(output, NONCE_COUNT_PRE); + outlen += strlen(NONCE_COUNT_PRE); + + sprintf(output+outlen, "%0*x", NCLEN, state->nc); + outlen += NCLEN; + + strcat(output, NONCE_COUNT_POST); + outlen += strlen(NONCE_COUNT_POST); + } + /* qop */ + { + char *qopstr; + + if (state->qop & GSASL_QOP_AUTH) + qopstr = QOP_AUTH; + else if (state->qop & GSASL_QOP_AUTH_INT) + qopstr = QOP_AUTH_INT; + else if (state->qop & GSASL_QOP_AUTH_CONF) + qopstr = QOP_AUTH_CONF; + + if (outlen + + strlen(QOP_PRE) + + strlen(qopstr) + + strlen(QOP_POST) >= *output_len) + { + res = GSASL_TOO_SMALL_BUFFER; + goto done; + } + + strcat(output, QOP_PRE); + outlen += strlen(QOP_PRE); + + strcat(output, qopstr); + outlen += strlen(qopstr); + + strcat(output, QOP_POST); + outlen += strlen(QOP_POST); + } + /* digest-uri */ + { + char *service = NULL; + size_t servicelen = 0; + char *hostname = NULL; + size_t hostnamelen = 0; + char *servicename = NULL; + size_t servicenamelen = 0; + size_t len; + + res = cb_service (cctx, NULL, &servicelen, + NULL, &hostnamelen, + NULL, &servicenamelen); + if (res != GSASL_OK) + goto done; + len = servicelen + strlen("/") + hostnamelen + + (servicenamelen > 0 ? strlen("/") + servicenamelen : 0) + 1; + state->digesturi = malloc(len); + if (state->digesturi == NULL) + { + res = GSASL_MALLOC_ERROR; + goto done; + } + res = cb_service (cctx, state->digesturi, &servicelen, + state->digesturi + 1 + servicelen, &hostnamelen, + (servicenamelen > 0 ? + state->digesturi + 1 + servicelen + 1 + + hostnamelen : NULL), &servicenamelen); + if (res != GSASL_OK) + goto done; + state->digesturi[servicelen] = '/'; + state->digesturi[servicelen + 1 + hostnamelen] = '/'; + state->digesturi[len-1] = '\0'; + + if (outlen + + strlen(DIGEST_URI_PRE) + + len + + strlen(DIGEST_URI_POST) >= *output_len) + { + res = GSASL_TOO_SMALL_BUFFER; + goto done; + } + + strcat(output, DIGEST_URI_PRE); + outlen += strlen(DIGEST_URI_PRE); + + strcat(output, state->digesturi); + outlen += strlen(state->digesturi); + + strcat(output, DIGEST_URI_POST); + outlen += strlen(DIGEST_URI_POST); + } + /* response */ + { + GCRY_MD_HD md5h; + unsigned char *tmp; + char *normpassword; + size_t len; + + if (outlen + + strlen(RESPONSE_PRE) + + RESPONSE_LENGTH + + strlen(RESPONSE_POST) >= *output_len) + { + res = GSASL_TOO_SMALL_BUFFER; + goto done; + } + + strcat(output, RESPONSE_PRE); + outlen += strlen(RESPONSE_PRE); + + md5h = gcry_md_open (GCRY_MD_MD5, 0); + if (md5h == NULL) + { + res = GSASL_GCRYPT_ERROR; + goto done; + } + len = *output_len - outlen; + res = cb_authentication_id (cctx, output+outlen, &len); + if (res != GSASL_OK) + goto done; + + gcry_md_write (md5h, output+outlen, len); + gcry_md_write (md5h, COLON, strlen(COLON)); + if (nrealm > 0) + gcry_md_write (md5h, realm[0], strlen(realm[0])); + gcry_md_write (md5h, COLON, strlen(COLON)); + + len = *output_len - outlen; + /* XXX? password stored in callee's output buffer */ + res = cb_password (cctx, output+outlen, &len); + if (res != GSASL_OK) + goto done; + tmp = gsasl_utf8_nfkc_normalize (output+outlen, len); + if (tmp == NULL) + { + res = GSASL_UNICODE_NORMALIZATION_ERROR; + goto done; + } + gcry_md_write (md5h, tmp, strlen(tmp)); + free(tmp); + if (res != GCRYERR_SUCCESS) + return GSASL_GCRYPT_ERROR; + + tmp = gcry_md_read (md5h, GCRY_MD_MD5); + if (tmp == NULL) + { + res = GSASL_GCRYPT_ERROR; + goto done; + } + memcpy(state->secret, tmp, MD5LEN); + gcry_md_close(md5h); + + res = _gsasl_digest (state->response, state->secret, + state->nonce, state->nc, state->cnonce, + state->qop, state->authzid, + state->digesturi, A2_PRE); + if (res != GSASL_OK) + goto done; + state->response[RESPONSE_LENGTH] = '\0'; + memcpy(output+outlen, state->response, RESPONSE_LENGTH+1); + outlen += RESPONSE_LENGTH; + + strcat(output, RESPONSE_POST); + outlen += strlen(RESPONSE_POST); + } + if (cb_maxbuf && (maxbuf = cb_maxbuf(cctx, maxbuf)) != MAXBUF_DEFAULT) + { + if (outlen + + strlen(MAXBUF_PRE) + + /* XXX don't require -lm, how? */ + 1+floor(log10(INT_MAX)) + + strlen(MAXBUF_POST) >= *output_len) + return GSASL_TOO_SMALL_BUFFER; + + strcat(output, MAXBUF_PRE); + outlen += strlen(MAXBUF_PRE); + + sprintf(&output[outlen], "%d", maxbuf); + outlen += strlen(&output[outlen]); + + strcat(output, MAXBUF_POST); + outlen += strlen(MAXBUF_POST); + } + /* authzid */ + if (state->authzid && strlen(state->authzid) > 0) + { + if (outlen + + strlen(AUTHZID_PRE) + + strlen(state->authzid) + + strlen(AUTHZID_POST) >= *output_len) + { + res = GSASL_TOO_SMALL_BUFFER; + goto done; + } + + strcat(output, AUTHZID_PRE); + outlen += strlen(AUTHZID_PRE); + + strcat(output, state->authzid); + outlen += strlen(state->authzid); + + strcat(output, AUTHZID_POST); + outlen += strlen(AUTHZID_POST); + } + + res = GSASL_NEEDS_MORE; + done: + if (realm) + free (realm); + } + *output_len = outlen; + state->step++; + break; + + case 1: + if (input_len == 0) + { + *output_len = 0; + res = GSASL_MECHANISM_PARSE_ERROR; + break; + } + + res = GSASL_AUTHENTICATION_ERROR; + subopts = input; + while (*subopts != '\0') + switch (_gsasl_getsubopt (&subopts, digest_responseauth_opts, &value)) + { + case RESPONSEAUTH_RSPAUTH: + res = _gsasl_digest (output+outlen, state->secret, + state->nonce, state->nc, + state->cnonce, state->qop, + state->authzid, state->digesturi, COLON); + if (res != GSASL_OK) + break; + + if (memcmp(value, output + outlen, RESPONSE_LENGTH) == 0) + res = GSASL_OK; + else + res = GSASL_AUTHENTICATION_ERROR; + break; + + default: + /* Unknown suboption. */ + break; + } + *output_len = 0; + state->step++; + break; + + default: + res = GSASL_MECHANISM_CALLED_TOO_MANY_TIMES; + break; + } + +#if PRINT_OUTPUT + if (output && *output_len > 0) + puts(output); +#endif + + return res; +} + +int +_gsasl_digest_md5_client_finish (Gsasl_session_ctx *cctx, + void *mech_data) +{ + _Gsasl_digest_md5_client_state *state = mech_data; + + if (state->authzid) + free (state->authzid); + if (state->nonce) + free (state->nonce); + if (state->digesturi) + free (state->digesturi); + free(state); + + return GSASL_OK; +} + +/* Server */ + +struct _Gsasl_digest_md5_server_state { + int step; + char nonce[NONCE_ENTROPY_BITS/8]; +}; +typedef struct _Gsasl_digest_md5_server_state _Gsasl_digest_md5_server_state; + +int +_gsasl_digest_md5_server_init (Gsasl_ctx *ctx) +{ + if (gcry_check_version(GCRYPT_VERSION) == NULL) + return GSASL_GCRYPT_ERROR; + + return GSASL_OK; +} + +void +_gsasl_digest_md5_server_done (Gsasl_ctx *ctx) +{ + return; +} + +int +_gsasl_digest_md5_server_start (Gsasl_session_ctx *sctx, + void **mech_data) +{ + _Gsasl_digest_md5_server_state *state; + Gsasl_server_callback_retrieve cb_retrieve; + Gsasl_server_callback_digest_md5 cb_digest_md5; + Gsasl_ctx *ctx; + + ctx = gsasl_server_ctx_get (sctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + cb_retrieve = gsasl_server_callback_retrieve_get (ctx); + cb_digest_md5 = gsasl_server_callback_digest_md5_get (ctx); + + if (gsasl_server_callback_digest_md5_get (ctx) == NULL && + gsasl_server_callback_retrieve_get (ctx) == NULL) + return GSASL_NEED_SERVER_DIGEST_MD5_CALLBACK; + + state = (_Gsasl_digest_md5_server_state*) malloc(sizeof(*state)); + if (state == NULL) + return GSASL_MALLOC_ERROR; + + state->step = 0; + gcry_randomize (state->nonce, NONCE_ENTROPY_BITS/8, GCRY_WEAK_RANDOM); + + *mech_data = state; + + return GSASL_OK; +} + +int +_gsasl_digest_md5_server_step (Gsasl_session_ctx *sctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len) +{ + _Gsasl_digest_md5_server_state *state = mech_data; + Gsasl_server_callback_realm cb_realm; + Gsasl_server_callback_qop cb_qop; + Gsasl_server_callback_maxbuf cb_maxbuf; + Gsasl_server_callback_cipher cb_cipher; + Gsasl_server_callback_retrieve cb_retrieve; + Gsasl_server_callback_digest_md5 cb_digest_md5; + Gsasl_ctx *ctx; + int res; + int outlen; + int maxbuf; + + ctx = gsasl_server_ctx_get (sctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + cb_realm = gsasl_server_callback_realm_get (ctx); + cb_qop = gsasl_server_callback_qop_get (ctx); + cb_maxbuf = gsasl_server_callback_maxbuf_get (ctx); + cb_cipher = gsasl_server_callback_cipher_get (ctx); + cb_retrieve = gsasl_server_callback_retrieve_get (ctx); + cb_digest_md5 = gsasl_server_callback_digest_md5_get (ctx); + + if (gsasl_server_callback_digest_md5_get (ctx) == NULL && + gsasl_server_callback_retrieve_get (ctx) == NULL) + return GSASL_NEED_SERVER_DIGEST_MD5_CALLBACK; + + if (*output_len < 1) + return GSASL_TOO_SMALL_BUFFER; + + strcpy(output, ""); + outlen = 0; + +#if PRINT_OUTPUT + if (input && input_len > 0) + puts(input); +#endif + + switch (state->step) + { + case 0: + if (cb_realm) + { + int i; + size_t realmlen; + + realmlen = *output_len; + for (i = 0; cb_realm(sctx, NULL, &realmlen, i) == GSASL_OK; i++) + { + if (outlen + strlen(REALM_PRE) + + realmlen + strlen(REALM_POST) >= *output_len) + return GSASL_TOO_SMALL_BUFFER; + + strcat(output, REALM_PRE); + outlen += strlen(REALM_PRE); + + cb_realm(sctx, &output[outlen], &realmlen, i); + outlen += realmlen; + output[outlen] = '\0'; + + strcat(output, REALM_POST); + outlen += strlen(REALM_POST); + + realmlen = *output_len - outlen; + } + } + /* nonce */ + { + int i; + + if (outlen + strlen(NONCE_PRE) + + 2 * NONCE_ENTROPY_BITS/8 + strlen(NONCE_POST) >= *output_len) + return GSASL_TOO_SMALL_BUFFER; + + strcat(output, NONCE_PRE); + outlen += strlen(NONCE_PRE); + + for (i = 0; i < NONCE_ENTROPY_BITS/8; i++) + { + output[outlen + 2*i + 1] = HEXCHAR(state->nonce[i]); + output[outlen + 2*i + 0] = HEXCHAR(state->nonce[i] >> 4); + } + output[outlen + 2 * NONCE_ENTROPY_BITS/8] = '\0'; + outlen += 2 * NONCE_ENTROPY_BITS/8; + + strcat(output, NONCE_POST); + outlen += strlen(NONCE_POST); + } + /* qop */ + { + Gsasl_qop qop; + + if (outlen + + strlen(QOP_LIST_PRE) + + strlen(QOP_AUTH) + + strlen(QOP_AUTH_INT) + + strlen(QOP_AUTH_CONF) + + strlen(QOP_LIST_POST) >= *output_len) + return GSASL_TOO_SMALL_BUFFER; + + if (cb_qop) + qop = cb_qop(sctx); + else + qop = GSASL_QOP_AUTH | GSASL_QOP_AUTH_INT | GSASL_QOP_AUTH_CONF; + + strcat(output, QOP_LIST_PRE); + outlen += strlen(QOP_LIST_PRE); + + if (qop & GSASL_QOP_AUTH) + { + strcat(output, QOP_AUTH); + outlen += strlen(QOP_AUTH); + + strcat(output, QOP_DELIM); + outlen += strlen(QOP_DELIM); + } + + if (qop & GSASL_QOP_AUTH_INT) + { + strcat(output, QOP_AUTH_INT); + outlen += strlen(QOP_AUTH_INT); + + strcat(output, QOP_DELIM); + outlen += strlen(QOP_DELIM); + } + + if (qop & GSASL_QOP_AUTH_CONF) + { + strcat(output, QOP_AUTH_CONF); + outlen += strlen(QOP_AUTH_CONF); + } + + strcat(output, QOP_LIST_POST); + outlen += strlen(QOP_LIST_POST); + } + /* maxbuf */ + if (cb_maxbuf && (maxbuf = cb_maxbuf(sctx)) != MAXBUF_DEFAULT) + { + if (outlen + + strlen(MAXBUF_PRE) + + /* XXX don't require -lm, how? */ + 1+floor(log10(INT_MAX)) + + strlen(MAXBUF_POST) >= *output_len) + return GSASL_TOO_SMALL_BUFFER; + + strcat(output, MAXBUF_PRE); + outlen += strlen(MAXBUF_PRE); + + sprintf(&output[outlen], "%d", maxbuf); + outlen += strlen(&output[outlen]); + + strcat(output, MAXBUF_POST); + outlen += strlen(MAXBUF_POST); + } + /* charset */ + { + if (outlen + strlen(CHARSET) >= *output_len) + return GSASL_TOO_SMALL_BUFFER; + + strcat(output, CHARSET); + outlen += strlen(CHARSET); + } + /* algorithm */ + { + if (outlen + strlen(ALGORITHM) >= *output_len) + return GSASL_TOO_SMALL_BUFFER; + + strcat(output, ALGORITHM); + outlen += strlen(ALGORITHM); + } + /* cipher */ + { + Gsasl_cipher cipher; + + if (outlen + + strlen(CIPHER_PRE) + + strlen(CIPHER_DES) + + strlen(CIPHER_DELIM) + + strlen(CIPHER_3DES) + + strlen(CIPHER_DELIM) + + strlen(CIPHER_RC4) + + strlen(CIPHER_DELIM) + + strlen(CIPHER_RC4_40) + + strlen(CIPHER_DELIM) + + strlen(CIPHER_RC4_56) + + strlen(CIPHER_DELIM) + + strlen(CIPHER_AES) + + strlen(CIPHER_DELIM) + + strlen(CIPHER_POST) >= *output_len) + return GSASL_TOO_SMALL_BUFFER; + + if (cb_cipher) + cipher = cb_cipher(sctx); + else + cipher = GSASL_CIPHER_DES | GSASL_CIPHER_3DES | GSASL_CIPHER_RC4 | + GSASL_CIPHER_RC4_40 | GSASL_CIPHER_RC4_56 | GSASL_CIPHER_AES; + + strcat(output, CIPHER_PRE); + outlen += strlen(CIPHER_PRE); + + if (cipher & GSASL_CIPHER_DES) + { + strcat(output, CIPHER_DES); + outlen += strlen(CIPHER_DES); + + strcat(output, CIPHER_DELIM); + outlen += strlen(CIPHER_DELIM); + } + + if (cipher & GSASL_CIPHER_3DES) + { + strcat(output, CIPHER_3DES); + outlen += strlen(CIPHER_3DES); + + strcat(output, CIPHER_DELIM); + outlen += strlen(CIPHER_DELIM); + } + + if (cipher & GSASL_CIPHER_RC4) + { + strcat(output, CIPHER_RC4); + outlen += strlen(CIPHER_RC4); + + strcat(output, CIPHER_DELIM); + outlen += strlen(CIPHER_DELIM); + } + + if (cipher & GSASL_CIPHER_RC4_40) + { + strcat(output, CIPHER_RC4_40); + outlen += strlen(CIPHER_RC4_40); + + strcat(output, CIPHER_DELIM); + outlen += strlen(CIPHER_DELIM); + } + + if (cipher & GSASL_CIPHER_RC4_56) + { + strcat(output, CIPHER_RC4_56); + outlen += strlen(CIPHER_RC4_56); + + strcat(output, CIPHER_DELIM); + outlen += strlen(CIPHER_DELIM); + } + + if (cipher & GSASL_CIPHER_AES) + { + strcat(output, CIPHER_AES); + outlen += strlen(CIPHER_AES); + + strcat(output, CIPHER_DELIM); + outlen += strlen(CIPHER_DELIM); + } + + strcat(output, CIPHER_POST); + outlen += strlen(CIPHER_POST); + } + *output_len = outlen; + state->step++; + res = GSASL_NEEDS_MORE; + break; + + case 1: + { + unsigned char *nonce = NULL; + char *cnonce = NULL; + uint32_t nc = 0; + char *authzid = NULL; + char *digesturi = NULL; + const char *subopts, *value; + unsigned char *realm = NULL; + unsigned char *username = NULL; + unsigned char *response = NULL; + int maxbuf = MAXBUF_DEFAULT; + int qop = GSASL_QOP_AUTH; + int cipher = 0; + int i; + GCRY_MD_HD md5h = NULL; + unsigned char secret[MD5LEN]; + + if (input_len == 0) + { + *output_len = 0; + return GSASL_MECHANISM_PARSE_ERROR; + } + + subopts = input; + while (*subopts != '\0') + switch (_gsasl_getsubopt (&subopts, digest_response_opts, &value)) + { + case RESPONSE_USERNAME: + if (username != NULL) + { + res = GSASL_MECHANISM_PARSE_ERROR; + goto done; + } + username = strdup(value); + break; + + case RESPONSE_REALM: + if (realm != NULL) + { + res = GSASL_MECHANISM_PARSE_ERROR; + goto done; + } + realm = strdup(value); + break; + + case RESPONSE_NONCE: + if (nonce != NULL) + { + res = GSASL_MECHANISM_PARSE_ERROR; + goto done; + } + nonce = strdup(value); + res = GSASL_OK; + for (i = 0; i < MIN(strlen(value), NONCE_ENTROPY_BITS/8); i++) + if ((nonce[2*i + 1] != HEXCHAR(state->nonce[i])) || + (nonce[2*i + 0] != HEXCHAR(state->nonce[i] >> 4))) + res = GSASL_MECHANISM_PARSE_ERROR; + if (res != GSASL_OK) + goto done; + break; + + case RESPONSE_CNONCE: + if (cnonce != NULL) + { + res = GSASL_MECHANISM_PARSE_ERROR; + goto done; + } + cnonce = strdup(value); + break; + + case RESPONSE_NC: + if (nc != 0) + { + res = GSASL_MECHANISM_PARSE_ERROR; + goto done; + } + nc = strtoul(value, NULL, 16); + break; + + case RESPONSE_QOP: + if (strcmp(value, QOP_AUTH) == 0) + qop = GSASL_QOP_AUTH; + else if (strcmp(value, QOP_AUTH_INT) == 0) + qop = GSASL_QOP_AUTH_INT; + else if (strcmp(value, QOP_AUTH_CONF) == 0) + qop = GSASL_QOP_AUTH_CONF; + else + { + res = GSASL_MECHANISM_PARSE_ERROR; + goto done; + } + break; + + case RESPONSE_DIGEST_URI: + if (digesturi != NULL) + { + res = GSASL_MECHANISM_PARSE_ERROR; + goto done; + } + digesturi = strdup(value); + break; + + case RESPONSE_RESPONSE: + if (response != NULL) + { + res = GSASL_MECHANISM_PARSE_ERROR; + goto done; + } + response = strdup(value); + break; + + case RESPONSE_MAXBUF: + maxbuf = strtol(value, NULL, 10); + break; + + case RESPONSE_CHARSET: + if (strcmp(DEFAULT_CHARSET, value) != 0) + { + res = GSASL_MECHANISM_PARSE_ERROR; + goto done; + } + break; + + case RESPONSE_CIPHER: + if (cipher != 0) + { + res = GSASL_MECHANISM_PARSE_ERROR; + goto done; + } + if (strcmp(value, CIPHER_DES) == 0) + cipher = GSASL_CIPHER_DES; + else if (strcmp(value, CIPHER_3DES) == 0) + cipher = GSASL_CIPHER_3DES; + else if (strcmp(value, CIPHER_RC4) == 0) + cipher = GSASL_CIPHER_RC4; + else if (strcmp(value, CIPHER_RC4_40) == 0) + cipher = GSASL_CIPHER_RC4_40; + else if (strcmp(value, CIPHER_RC4_56) == 0) + cipher = GSASL_CIPHER_RC4_56; + else if (strcmp(value, CIPHER_AES) == 0) + cipher = GSASL_CIPHER_AES; + else + { + res = GSASL_MECHANISM_PARSE_ERROR; + goto done; + } + break; + + case RESPONSE_AUTHZID: + if (authzid != NULL) + { + res = GSASL_MECHANISM_PARSE_ERROR; + goto done; + } + authzid = strdup(value); + break; + + default: + /* Ignoring unknown parameter. */ + break; + } + + if (username == NULL || nonce == NULL || + cnonce == NULL || response == NULL || + (qop == GSASL_QOP_AUTH_CONF && cipher == 0)) + { + res = GSASL_MECHANISM_PARSE_ERROR; + goto done; + } + + if (outlen + + strlen(RSPAUTH_PRE) + + RESPONSE_LENGTH + + strlen(RSPAUTH_POST) >= *output_len) + { + res = GSASL_TOO_SMALL_BUFFER; + goto done; + } + if (cb_retrieve) + { + unsigned char *tmp; + size_t len; + size_t keylen; + char *key; + char *normkey; + + res = cb_retrieve(sctx, username, authzid, realm, NULL, &keylen); + if (res != GSASL_OK) + goto done; + key = malloc(keylen); + if (key == NULL) + { + res = GSASL_MALLOC_ERROR; + goto done; + } + res = cb_retrieve(sctx, username, authzid, realm, key, &keylen); + if (res != GSASL_OK) + { + free(key); + goto done; + } + normkey = gsasl_utf8_nfkc_normalize (key, keylen); + free(key); + if (normkey == NULL) + { + res = GSASL_UNICODE_NORMALIZATION_ERROR; + goto done; + } + + md5h = gcry_md_open (GCRY_MD_MD5, 0); + if (md5h == NULL) + { + res = GSASL_GCRYPT_ERROR; + goto done; + } + gcry_md_write (md5h, username, strlen(username)); + gcry_md_write (md5h, COLON, strlen(COLON)); + if (realm) + gcry_md_write (md5h, realm, strlen(realm)); + gcry_md_write (md5h, COLON, strlen(COLON)); + gcry_md_write (md5h, normkey, strlen(normkey)); + + tmp = gcry_md_read (md5h, GCRY_MD_MD5); + if (tmp == NULL) + { + res = GSASL_GCRYPT_ERROR; + goto done; + } + memcpy(secret, tmp, MD5LEN); + } + else /* if (cb_digest_md5) */ + { + /* XXX? secret hash stored in callee's output buffer */ + res = cb_digest_md5 (sctx, username, realm, output+outlen); + if (res != GSASL_OK) + goto done; + + memcpy(secret, output+outlen, MD5LEN); + } + + /* verify response */ + res = _gsasl_digest (output+outlen, secret, + nonce, nc, cnonce, qop, authzid, + digesturi, A2_PRE); + if (res != GSASL_OK) + goto done; + + if (memcmp(response, output + outlen, RESPONSE_LENGTH) != 0) + { + res = GSASL_AUTHENTICATION_ERROR; + goto done; + } + + output[outlen] = '\0'; + + /* XXX check more things here. digest-uri? valid qop, cipher, + nc etc. nonce, which is the most important, is checked + above. */ + + /* generate rspauth */ + + strcat(output, RSPAUTH_PRE); + outlen += strlen(RSPAUTH_PRE); + + res = _gsasl_digest (output+outlen, secret, + nonce, nc, cnonce, qop, authzid, + digesturi, COLON); + if (res != GSASL_OK) + goto done; + outlen += RSPAUTH_LENGTH; + + strcat(output, RSPAUTH_POST); + outlen += strlen(RSPAUTH_POST); + + if (md5h) + gcry_md_close(md5h); + + res = GSASL_NEEDS_MORE; + done: + if (username) + free(username); + if (authzid) + free(authzid); + if (response) + free(response); + if (digesturi) + free(digesturi); + if (nonce) + free(nonce); + if (cnonce) + free(cnonce); + if (realm) + free(realm); + } + *output_len = outlen; + state->step++; + break; + + case 2: + *output_len = 0; + state->step++; + res = GSASL_OK; + break; + + default: + res = GSASL_MECHANISM_CALLED_TOO_MANY_TIMES; + break; + } + +#if PRINT_OUTPUT + if (output && *output_len > 0) + puts(output); +#endif + + return res; +} + +int +_gsasl_digest_md5_server_finish (Gsasl_session_ctx *sctx, + void *mech_data) +{ + _Gsasl_digest_md5_server_state *state = mech_data; + + free(state); + + return GSASL_OK; +} + +#endif /* USE_DIGEST_MD5 */ diff --git a/lib/digest-md5.h b/lib/digest-md5.h new file mode 100644 index 0000000..b2ff766 --- /dev/null +++ b/lib/digest-md5.h @@ -0,0 +1,59 @@ +/* digest-md5.h header file for mechanism DIGEST-MD5 as defined in RFC 2831 + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _DIGEST_MD5_H +#define _DIGEST_MD5_H + +#include "internal.h" + +#ifdef USE_DIGEST_MD5 + +#define _GSASL_DIGEST_MD5_NAME "DIGEST-MD5" + +extern int _gsasl_digest_md5_client_init (Gsasl_ctx *ctx); +extern void _gsasl_digest_md5_client_done (Gsasl_ctx *ctx); +extern int _gsasl_digest_md5_client_start (Gsasl_session_ctx *cctx, + void **mech_data); +extern int _gsasl_digest_md5_client_step (Gsasl_session_ctx *cctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len); +extern int _gsasl_digest_md5_client_finish (Gsasl_session_ctx *cctx, + void *mech_data); + +extern int _gsasl_digest_md5_server_init (Gsasl_ctx *ctx); +extern void _gsasl_digest_md5_server_done (Gsasl_ctx *ctx); +extern int _gsasl_digest_md5_server_start (Gsasl_session_ctx *sctx, + void **mech_data); +extern int _gsasl_digest_md5_server_step (Gsasl_session_ctx *sctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len); +extern int _gsasl_digest_md5_server_finish (Gsasl_session_ctx *sctx, + void *mech_data); + +#endif /* USE_DIGEST_MD5 */ + +#endif /* _DIGEST_MD5_H */ diff --git a/lib/done.c b/lib/done.c new file mode 100644 index 0000000..71fa181 --- /dev/null +++ b/lib/done.c @@ -0,0 +1,54 @@ +/* done.c exit point for libgsasl + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" + +/** + * gsasl_done: + * @ctx: libgsasl handle. + * + * This function destroys a libgsasl handle. The handle must not be + * used with other libgsasl functions after this call. + **/ +void +gsasl_done (Gsasl_ctx *ctx) +{ + int i; + + if (ctx == NULL) + return; + + for (i = 0; i < ctx->n_client_mechs; i++) + ctx->client_mechs[i].client.done(ctx); + + for (i = 0; i < ctx->n_server_mechs; i++) + ctx->server_mechs[i].server.done(ctx); + + if (ctx->client_mechs) + free(ctx->client_mechs); + + if (ctx->server_mechs) + free(ctx->server_mechs); + + free(ctx); + + return; +} diff --git a/lib/error.c b/lib/error.c new file mode 100644 index 0000000..87ab707 --- /dev/null +++ b/lib/error.c @@ -0,0 +1,203 @@ +/* error.c error handling functionality + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" + +/** + * gsasl_strerror: + * @err: libgsasl error code + * + * Return value: Returns a pointer to a statically allocated string + * containing a description of the error with the error value + * @var{err}. This string can be used to output a diagnostic message + * to the user. + **/ +const char * +gsasl_strerror (int err) +{ + const char *p; + + switch (err) + { + case GSASL_OK: + p = _("Libgsasl success"); + break; + + case GSASL_NEEDS_MORE: + p = _("SASL mechanisms needs more data (application error)"); + break; + + case GSASL_UNKNOWN_MECHANISM: + p = _("Unknown SASL mechanism (application error)"); + break; + + case GSASL_MECHANISM_CALLED_TOO_MANY_TIMES: + p = _("SASL mechanism called too many times (application error)"); + break; + + case GSASL_TOO_SMALL_BUFFER: + p = _("SASL function need larger buffer (application error)"); + break; + + case GSASL_FOPEN_ERROR: + p = _("Could not open file in SASL library"); + break; + + case GSASL_FCLOSE_ERROR: + p = _("Could not close file in SASL library"); + break; + + case GSASL_MALLOC_ERROR: + p = _("Memory allocation error in SASL library"); + break; + + case GSASL_BASE64_ERROR: + p = _("Base 64 coding error in SASL library"); + break; + + case GSASL_GCRYPT_ERROR: + p = _("Gcrypt error in SASL library"); + break; + + case GSASL_GSSAPI_RELEASE_BUFFER_ERROR: + p = _("GSSAPI library could not deallocate memory in gss_release_buffer() in SASL library. This is a serious internal error."); + break; + + case GSASL_GSSAPI_IMPORT_NAME_ERROR: + p = _("GSSAPI library could not understand a peer name in gss_import_name() in SASL library. This may be due to incorrect user supplied data."); + break; + + case GSASL_GSSAPI_INIT_SEC_CONTEXT_ERROR: + p = _("GSSAPI error in client while negotiating security context in gss_init_sec_context() in SASL library. This is most likely due insufficient credentials or malicious interactions."); + break; + + case GSASL_GSSAPI_ACCEPT_SEC_CONTEXT_ERROR: + p = _("GSSAPI error in server while negotiating security context in gss_init_sec_context() in SASL library. This is most likely due insufficient credentials or malicious interactions."); + break; + + case GSASL_GSSAPI_UNWRAP_ERROR: + p = _("GSSAPI error while decrypting or decoding data in gss_unwrap() in SASL library. This is most likely due to data corruption."); + break; + + case GSASL_GSSAPI_WRAP_ERROR: + p = _("GSSAPI error while encrypting or encoding data in gss_wrap() in SASL library."); + break; + + case GSASL_GSSAPI_ACQUIRE_CRED_ERROR: + p = _("GSSAPI error acquiring credentials in gss_acquire_cred() in SASL library. This is most likely due to not having the proper Kerberos key available in /etc/krb5.keytab on the server."); + break; + + case GSASL_GSSAPI_DISPLAY_NAME_ERROR: + p = _("GSSAPI error creating a display name denoting the client in gss_display_name() in SASL library. This is probably because the client suplied bad data."); + break; + + case GSASL_GSSAPI_UNSUPPORTED_PROTECTION_ERROR: + p = _("Other entity requested integrity or confidentiality protection in GSSAPI mechanism but this is currently not implemented."); + break; + + case GSASL_NEED_CLIENT_ANONYMOUS_CALLBACK: + p = _("SASL mechanism needs gsasl_client_callback_anonymous() callback (application error)"); + break; + + case GSASL_NEED_CLIENT_PASSWORD_CALLBACK: + p = _("SASL mechanism needs gsasl_client_callback_password() callback (application error)"); + break; + + case GSASL_NEED_CLIENT_PASSCODE_CALLBACK: + p = _("SASL mechanism needs gsasl_client_callback_passcode() callback (application error)"); + break; + + case GSASL_NEED_CLIENT_PIN_CALLBACK: + p = _("SASL mechanism needs gsasl_client_callback_pin() callback (application error)"); + break; + + case GSASL_NEED_CLIENT_AUTHORIZATION_ID_CALLBACK: + p = _("SASL mechanism needs gsasl_client_callback_authorization_id() callback (application error)"); + break; + + case GSASL_NEED_CLIENT_AUTHENTICATION_ID_CALLBACK: + p = _("SASL mechanism needs gsasl_client_callback_authentication_id() callback (application error)"); + break; + + case GSASL_NEED_CLIENT_SERVICE_CALLBACK: + p = _("SASL mechanism needs gsasl_client_callback_service() callback (application error)"); + break; + + case GSASL_NEED_SERVER_VALIDATE_CALLBACK: + p = _("SASL mechanism needs gsasl_server_callback_validate() callback (application error)"); + break; + + case GSASL_NEED_SERVER_CRAM_MD5_CALLBACK: + p = _("SASL mechanism needs gsasl_server_callback_cram_md5() callback (application error)"); + break; + + case GSASL_NEED_SERVER_DIGEST_MD5_CALLBACK: + p = _("SASL mechanism needs gsasl_server_callback_digest_md5() callback (application error)"); + break; + + case GSASL_NEED_SERVER_ANONYMOUS_CALLBACK: + p = _("SASL mechanism needs gsasl_server_callback_anonymous() callback (application error)"); + break; + + case GSASL_NEED_SERVER_EXTERNAL_CALLBACK: + p = _("SASL mechanism needs gsasl_server_callback_external() callback (application error)"); + break; + + case GSASL_NEED_SERVER_REALM_CALLBACK: + p = _("SASL mechanism needs gsasl_server_callback_realm() callback (application error)"); + break; + + case GSASL_NEED_SERVER_SECURID_CALLBACK: + p = _("SASL mechanism needs gsasl_server_callback_securid() callback (application error)"); + break; + + case GSASL_NEED_SERVER_SERVICE_CALLBACK: + p = _("SASL mechanism needs gsasl_server_callback_service() callback (application error)"); + break; + + case GSASL_NEED_SERVER_GSSAPI_CALLBACK: + p = _("SASL mechanism needs gsasl_server_callback_gssapi() callback (application error)"); + break; + + case GSASL_MECHANISM_PARSE_ERROR: + p = _("SASL mechanism could not parse input"); + break; + + case GSASL_AUTHENTICATION_ERROR: + p = _("Error authentication user"); + break; + + case GSASL_CANNOT_GET_CTX: + p = _("Cannot get internal library handle (library error)"); + break; + + case GSASL_NO_MORE_REALMS: + p = _("No more realms available (non-fatal)"); + break; + + default: + p = _("Libgsasl unknown error"); + break; + } + + return p; + +} diff --git a/lib/external.c b/lib/external.c new file mode 100644 index 0000000..fe068a9 --- /dev/null +++ b/lib/external.c @@ -0,0 +1,150 @@ +/* external.c implementation of SASL mechanism EXTERNAL as defined in RFC2222 + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" + +#ifdef USE_EXTERNAL + +int +_gsasl_external_client_init (Gsasl_ctx *ctx) +{ + return GSASL_OK; +} + +void +_gsasl_external_client_done (Gsasl_ctx *ctx) +{ + return; +} + +int +_gsasl_external_client_start (Gsasl_session_ctx *cctx, + void **mech_data) +{ + int *step; + + step = (int*) malloc(sizeof(*step)); + if (step == NULL) + return GSASL_MALLOC_ERROR; + + *step = 0; + + *mech_data = step; + + return GSASL_OK; +} + +int +_gsasl_external_client_step (Gsasl_session_ctx *cctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len) +{ + int *step = mech_data; + + if (*step > 0) + return GSASL_OK; + + (*step)++; + + *output_len = 0; + + return GSASL_NEEDS_MORE; +} + +int +_gsasl_external_client_finish (Gsasl_session_ctx *cctx, + void *mech_data) +{ + int *step = mech_data; + + free(step); + + return GSASL_OK; +} + +/* Server */ + +int +_gsasl_external_server_init (Gsasl_ctx *ctx) +{ + return GSASL_OK; +} + +void +_gsasl_external_server_done (Gsasl_ctx *ctx) +{ + return; +} + +int +_gsasl_external_server_start (Gsasl_session_ctx *sctx, + void **mech_data) +{ + Gsasl_ctx *ctx; + + ctx = gsasl_server_ctx_get (sctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + if (gsasl_server_callback_external_get (ctx) == NULL) + return GSASL_NEED_SERVER_EXTERNAL_CALLBACK; + + return GSASL_OK; +} + +int +_gsasl_external_server_step (Gsasl_session_ctx *sctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len) +{ + Gsasl_server_callback_external cb_external; + Gsasl_ctx *ctx; + int res; + + ctx = gsasl_server_ctx_get (sctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + cb_external = gsasl_server_callback_external_get (ctx); + if (cb_external == NULL) + return GSASL_NEED_SERVER_EXTERNAL_CALLBACK; + + res = cb_external (sctx); + + *output_len = 0; + + return res; +} + +int +_gsasl_external_server_finish (Gsasl_session_ctx *sctx, + void *mech_data) +{ + return GSASL_OK; +} + +#endif /* USE_EXTERNAL */ diff --git a/lib/external.h b/lib/external.h new file mode 100644 index 0000000..c62a083 --- /dev/null +++ b/lib/external.h @@ -0,0 +1,53 @@ +/* external.h header file for SASL mechanism EXTERNAL as defined in RFC 2222 + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _EXTERNAL_H +#define _EXTERNAL_H + +#define _GSASL_EXTERNAL_NAME "EXTERNAL" + +extern int _gsasl_external_client_init (Gsasl_ctx *ctx); +extern void _gsasl_external_client_done (Gsasl_ctx *ctx); +extern int _gsasl_external_client_start (Gsasl_session_ctx *cctx, + void **mech_data); +extern int _gsasl_external_client_step (Gsasl_session_ctx *cctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len); +extern int _gsasl_external_client_finish (Gsasl_session_ctx *cctx, + void *mech_data); + +extern int _gsasl_external_server_init (Gsasl_ctx *ctx); +extern void _gsasl_external_server_done (Gsasl_ctx *ctx); +extern int _gsasl_external_server_start (Gsasl_session_ctx *sctx, + void **mech_data); +extern int _gsasl_external_server_step (Gsasl_session_ctx *sctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len); +extern int _gsasl_external_server_finish (Gsasl_session_ctx *sctx, + void *mech_data); + +#endif /* _EXTERNAL_H */ diff --git a/lib/gen-unicode-tables.pl b/lib/gen-unicode-tables.pl new file mode 100755 index 0000000..13349fc --- /dev/null +++ b/lib/gen-unicode-tables.pl @@ -0,0 +1,1169 @@ +#! /usr/bin/perl -w + +# Copyright (C) 1998, 1999 Tom Tromey +# Copyright (C) 2001 Red Hat Software + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# Contributer(s): +# Andrew Taylor <andrew.taylor@montage.ca> + +# gen-unicode-tables.pl - Generate tables for libunicode from Unicode data. +# See http://www.unicode.org/Public/UNIDATA/UnicodeCharacterDatabase.html +# Usage: gen-unicode-tables.pl [-decomp | -both] UNICODE-VERSION UnicodeData.txt LineBreak.txt SpecialCasing.txt CaseFolding.txt +# I consider the output of this program to be unrestricted. Use it as +# you will. + +# FIXME: +# * For decomp table it might make sense to use a shift count other +# than 8. We could easily compute the perfect shift count. + +use vars qw($CODE $NAME $CATEGORY $COMBINING_CLASSES $BIDI_CATEGORY $DECOMPOSITION $DECIMAL_VALUE $DIGIT_VALUE $NUMERIC_VALUE $MIRRORED $OLD_NAME $COMMENT $UPPER $LOWER $TITLE $BREAK_CODE $BREAK_CATEGORY $BREAK_NAME $CASE_CODE $CASE_LOWER $CASE_TITLE $CASE_UPPER $CASE_CONDITION); + +# Names of fields in Unicode data table. +$CODE = 0; +$NAME = 1; +$CATEGORY = 2; +$COMBINING_CLASSES = 3; +$BIDI_CATEGORY = 4; +$DECOMPOSITION = 5; +$DECIMAL_VALUE = 6; +$DIGIT_VALUE = 7; +$NUMERIC_VALUE = 8; +$MIRRORED = 9; +$OLD_NAME = 10; +$COMMENT = 11; +$UPPER = 12; +$LOWER = 13; +$TITLE = 14; + +# Names of fields in the line break table +$BREAK_CODE = 0; +$BREAK_PROPERTY = 1; + +# Names of fields in the SpecialCasing table +$CASE_CODE = 0; +$CASE_LOWER = 1; +$CASE_TITLE = 2; +$CASE_UPPER = 3; +$CASE_CONDITION = 4; + +# Names of fields in the CaseFolding table +$FOLDING_CODE = 0; +$FOLDING_STATUS = 1; +$FOLDING_MAPPING = 2; + +# Map general category code onto symbolic name. +%mappings = + ( + # Normative. + 'Lu' => "G_UNICODE_UPPERCASE_LETTER", + 'Ll' => "G_UNICODE_LOWERCASE_LETTER", + 'Lt' => "G_UNICODE_TITLECASE_LETTER", + 'Mn' => "G_UNICODE_NON_SPACING_MARK", + 'Mc' => "G_UNICODE_COMBINING_MARK", + 'Me' => "G_UNICODE_ENCLOSING_MARK", + 'Nd' => "G_UNICODE_DECIMAL_NUMBER", + 'Nl' => "G_UNICODE_LETTER_NUMBER", + 'No' => "G_UNICODE_OTHER_NUMBER", + 'Zs' => "G_UNICODE_SPACE_SEPARATOR", + 'Zl' => "G_UNICODE_LINE_SEPARATOR", + 'Zp' => "G_UNICODE_PARAGRAPH_SEPARATOR", + 'Cc' => "G_UNICODE_CONTROL", + 'Cf' => "G_UNICODE_FORMAT", + 'Cs' => "G_UNICODE_SURROGATE", + 'Co' => "G_UNICODE_PRIVATE_USE", + 'Cn' => "G_UNICODE_UNASSIGNED", + + # Informative. + 'Lm' => "G_UNICODE_MODIFIER_LETTER", + 'Lo' => "G_UNICODE_OTHER_LETTER", + 'Pc' => "G_UNICODE_CONNECT_PUNCTUATION", + 'Pd' => "G_UNICODE_DASH_PUNCTUATION", + 'Ps' => "G_UNICODE_OPEN_PUNCTUATION", + 'Pe' => "G_UNICODE_CLOSE_PUNCTUATION", + 'Pi' => "G_UNICODE_INITIAL_PUNCTUATION", + 'Pf' => "G_UNICODE_FINAL_PUNCTUATION", + 'Po' => "G_UNICODE_OTHER_PUNCTUATION", + 'Sm' => "G_UNICODE_MATH_SYMBOL", + 'Sc' => "G_UNICODE_CURRENCY_SYMBOL", + 'Sk' => "G_UNICODE_MODIFIER_SYMBOL", + 'So' => "G_UNICODE_OTHER_SYMBOL" + ); + +%break_mappings = + ( + 'BK' => "G_UNICODE_BREAK_MANDATORY", + 'CR' => "G_UNICODE_BREAK_CARRIAGE_RETURN", + 'LF' => "G_UNICODE_BREAK_LINE_FEED", + 'CM' => "G_UNICODE_BREAK_COMBINING_MARK", + 'SG' => "G_UNICODE_BREAK_SURROGATE", + 'ZW' => "G_UNICODE_BREAK_ZERO_WIDTH_SPACE", + 'IN' => "G_UNICODE_BREAK_INSEPARABLE", + 'GL' => "G_UNICODE_BREAK_NON_BREAKING_GLUE", + 'CB' => "G_UNICODE_BREAK_CONTINGENT", + 'SP' => "G_UNICODE_BREAK_SPACE", + 'BA' => "G_UNICODE_BREAK_AFTER", + 'BB' => "G_UNICODE_BREAK_BEFORE", + 'B2' => "G_UNICODE_BREAK_BEFORE_AND_AFTER", + 'HY' => "G_UNICODE_BREAK_HYPHEN", + 'NS' => "G_UNICODE_BREAK_NON_STARTER", + 'OP' => "G_UNICODE_BREAK_OPEN_PUNCTUATION", + 'CL' => "G_UNICODE_BREAK_CLOSE_PUNCTUATION", + 'QU' => "G_UNICODE_BREAK_QUOTATION", + 'EX' => "G_UNICODE_BREAK_EXCLAMATION", + 'ID' => "G_UNICODE_BREAK_IDEOGRAPHIC", + 'NU' => "G_UNICODE_BREAK_NUMERIC", + 'IS' => "G_UNICODE_BREAK_INFIX_SEPARATOR", + 'SY' => "G_UNICODE_BREAK_SYMBOL", + 'AL' => "G_UNICODE_BREAK_ALPHABETIC", + 'PR' => "G_UNICODE_BREAK_PREFIX", + 'PO' => "G_UNICODE_BREAK_POSTFIX", + 'SA' => "G_UNICODE_BREAK_COMPLEX_CONTEXT", + 'AI' => "G_UNICODE_BREAK_AMBIGUOUS", + 'XX' => "G_UNICODE_BREAK_UNKNOWN" + ); + +# Title case mappings. +%title_to_lower = (); +%title_to_upper = (); + +# Maximum length of special-case strings + +my $special_case_len = 0; +my @special_cases; + +$do_decomp = 0; +$do_props = 1; +if (@ARGV && $ARGV[0] eq '-decomp') +{ + $do_decomp = 1; + $do_props = 0; + shift @ARGV; +} +elsif (@ARGV && $ARGV[0] eq '-both') +{ + $do_decomp = 1; + shift @ARGV; +} + +if (@ARGV != 6) { + $0 =~ s@.*/@@; + die "Usage: $0 [-decomp | -both] UNICODE-VERSION UnicodeData.txt LineBreak.txt SpecialCasing.txt CaseFolding.txt CompositionExclusions.txt\n"; +} + +print "Creating decomp table\n" if ($do_decomp); +print "Creating property table\n" if ($do_props); + +print "Composition exlusions from $ARGV[5]\n"; + +open (INPUT, "< $ARGV[5]") || exit 1; + +while (<INPUT>) { + + chop; + + next if /^#/; + next if /^\s*$/; + + s/\s*#.*//; + + s/^\s*//; + s/\s*$//; + + $composition_exclusions{hex($_)} = 1; +} + +close INPUT; + +print "Unicode data from $ARGV[1]\n"; + +open (INPUT, "< $ARGV[1]") || exit 1; + +$last_code = -1; +while (<INPUT>) +{ + chop; + @fields = split (';', $_, 30); + if ($#fields != 14) + { + printf STDERR ("Entry for $fields[$CODE] has wrong number of fields (%d)\n", $#fields); + } + + $code = hex ($fields[$CODE]); + + last if ($code > 0xFFFF); # ignore characters out of the basic plane + + if ($code > $last_code + 1) + { + # Found a gap. + if ($fields[$NAME] =~ /Last>/) + { + # Fill the gap with the last character read, + # since this was a range specified in the char database + @gfields = @fields; + } + else + { + # The gap represents undefined characters. Only the type + # matters. + @gfields = ('', '', 'Cn', '0', '', '', '', '', '', '', '', + '', '', '', ''); + } + for (++$last_code; $last_code < $code; ++$last_code) + { + $gfields{$CODE} = sprintf ("%04x", $last_code); + &process_one ($last_code, @gfields); + } + } + &process_one ($code, @fields); + $last_code = $code; +} + +close INPUT; + +@gfields = ('', '', 'Cn', '0', '', '', '', '', '', '', '', + '', '', '', ''); +for (++$last_code; $last_code < 0x10000; ++$last_code) +{ + $gfields{$CODE} = sprintf ("%04x", $last_code); + &process_one ($last_code, @gfields); +} +--$last_code; # Want last to be 0xFFFF. + +print "Creating line break table\n"; + +print "Line break data from $ARGV[2]\n"; + +open (INPUT, "< $ARGV[2]") || exit 1; + +$last_code = -1; +while (<INPUT>) +{ + my ($start_code, $end_code); + + chop; + + next if /^#/; + + s/\s*#.*//; + + @fields = split (';', $_, 30); + if ($#fields != 1) + { + printf STDERR ("Entry for $fields[$CODE] has wrong number of fields (%d)\n", $#fields); + next; + } + + if ($fields[$CODE] =~ /([A-F0-9]{4})..([A-F0-9]{4})/) + { + $start_code = hex ($1); + $end_code = hex ($2); + } else { + $start_code = $end_code = hex ($fields[$CODE]); + + } + + last if ($start_code > 0xFFFF); # FIXME ignore characters out of the basic plane + + if ($start_code > $last_code + 1) + { + # The gap represents undefined characters. If assigned, + # they are AL, if not assigned, XX + for (++$last_code; $last_code < $start_code; ++$last_code) + { + if ($type[$last_code] eq 'Cn') + { + $break_props[$last_code] = 'XX'; + } + else + { + $break_props[$last_code] = 'AL'; + } + } + } + + for ($last_code = $start_code; $last_code <= $end_code; $last_code++) + { + $break_props[$last_code] = $fields[$BREAK_PROPERTY]; + } + + $last_code = $end_code; +} + +close INPUT; + +for (++$last_code; $last_code < 0x10000; ++$last_code) +{ + if ($type[$last_code] eq 'Cn') + { + $break_props[$last_code] = 'XX'; + } + else + { + $break_props[$last_code] = 'AL'; + } +} +--$last_code; # Want last to be 0xFFFF. + +print STDERR "Last code is not 0xFFFF" if ($last_code != 0xFFFF); + +print "Reading special-casing table for case conversion\n"; + +open (INPUT, "< $ARGV[3]") || exit 1; + +while (<INPUT>) +{ + my $code; + + chop; + + next if /^#/; + next if /^\s*$/; + + s/\s*#.*//; + + @fields = split ('\s*;\s*', $_, 30); + + $raw_code = $fields[$CASE_CODE]; + $code = hex ($raw_code); + + if ($#fields != 4 && $#fields != 5) + { + printf STDERR ("Entry for $raw_code has wrong number of fields (%d)\n", $#fields); + next; + } + + if (!defined $type[$code]) + { + printf STDERR "Special case for code point: $code, which has no defined type\n"; + next; + } + + if (defined $fields[5]) { + # Ignore conditional special cases - we'll handle them in code + next; + } + + if ($type[$code] eq 'Lu') + { + (hex $fields[$CASE_UPPER] == $code) || die "$raw_code is Lu and UCD_Upper($raw_code) != $raw_code"; + + &add_special_case ($code, $value[$code],$fields[$CASE_LOWER], $fields[$CASE_TITLE]); + + } elsif ($type[$code] eq 'Lt') + { + (hex $fields[$CASE_TITLE] == $code) || die "$raw_code is Lt and UCD_Title($raw_code) != $raw_code"; + + &add_special_case ($code, undef,$fields[$CASE_LOWER], $fields[$CASE_UPPER]); + } elsif ($type[$code] eq 'Ll') + { + (hex $fields[$CASE_LOWER] == $code) || die "$raw_code is Ll and UCD_Lower($raw_code) != $raw_code"; + + &add_special_case ($code, $value[$code],$fields[$CASE_UPPER], $fields[$CASE_TITLE]); + } else { + printf STDERR "Special case for non-alphabetic code point: $raw_code\n"; + next; + } +} + +close INPUT; + +open (INPUT, "< $ARGV[4]") || exit 1; + +my $casefoldlen = 0; +my @casefold; + +while (<INPUT>) +{ + my $code; + + chop; + + next if /^#/; + next if /^\s*$/; + + s/\s*#.*//; + + @fields = split ('\s*;\s*', $_, 30); + + $raw_code = $fields[$FOLDING_CODE]; + $code = hex ($raw_code); + + next if $code > 0xffff; # FIXME! + + if ($#fields != 3) + { + printf STDERR ("Entry for $raw_code has wrong number of fields (%d)\n", $#fields); + next; + } + + next if ($fields[$FOLDING_STATUS] eq 'S'); + + @values = map { hex ($_) } split /\s+/, $fields[$FOLDING_MAPPING]; + + # Check simple case + + if (@values == 1 && + !(defined $value[$code] && $value[$code] >= 0xd800 && $value[$code] < 0xdc00) && + defined $type[$code]) { + + my $lower; + if ($type[$code] eq 'Ll') + { + $lower = $code; + } elsif ($type[$code] eq 'Lt') + { + $lower = $title_to_lower{$code}; + } elsif ($type[$code] eq 'Lu') + { + $lower = $value[$code]; + } else { + $lower = $code; + } + + if ($lower == $values[0]) { + next; + } + } + + my $string = pack ("U*", @values); + if (1 + length $string > $casefoldlen) { + $casefoldlen = 1 + length $string; + } + + push @casefold, [ $code, $string ]; +} + +close INPUT; + +if ($do_props) { + &print_tables ($last_code) +} +if ($do_decomp) { + &print_decomp ($last_code); + &output_composition_table; +} + +&print_line_break ($last_code); + +exit 0; + +# Process a single character. +sub process_one +{ + my ($code, @fields) = @_; + + $type[$code] = $fields[$CATEGORY]; + if ($type[$code] eq 'Nd') + { + $value[$code] = int ($fields[$DECIMAL_VALUE]); + } + elsif ($type[$code] eq 'Ll') + { + $value[$code] = hex ($fields[$UPPER]); + } + elsif ($type[$code] eq 'Lu') + { + $value[$code] = hex ($fields[$LOWER]); + } + + if ($type[$code] eq 'Lt') + { + $title_to_lower{$code} = hex ($fields[$LOWER]); + $title_to_upper{$code} = hex ($fields[$UPPER]); + } + + $cclass[$code] = $fields[$COMBINING_CLASSES]; + + # Handle decompositions. + if ($fields[$DECOMPOSITION] ne '') + { + if ($fields[$DECOMPOSITION] =~ s/\<.*\>\s*//) { + $decompose_compat[$code] = 1; + } else { + $decompose_compat[$code] = 0; + + if (!exists $composition_exclusions{$code}) { + $compositions{$code} = $fields[$DECOMPOSITION]; + } + } + $decompositions[$code] = $fields[$DECOMPOSITION]; + } +} + +sub print_tables +{ + my ($last) = @_; + my ($outfile) = "gunichartables.h"; + + local ($bytes_out) = 0; + + print "Writing $outfile...\n"; + + open (OUT, "> $outfile"); + + print OUT "/* This file is automatically generated. DO NOT EDIT!\n"; + print OUT " Instead, edit gen-unicode-tables.pl and re-run. */\n\n"; + + print OUT "#ifndef CHARTABLES_H\n"; + print OUT "#define CHARTABLES_H\n\n"; + + print OUT "#define G_UNICODE_DATA_VERSION \"$ARGV[0]\"\n\n"; + + printf OUT "#define G_UNICODE_LAST_CHAR 0x%04x\n\n", $last; + + printf OUT "#define G_UNICODE_MAX_TABLE_INDEX 1000\n\n"; + + $table_index = 0; + printf OUT "static const char type_data[][256] = {\n"; + for ($count = 0; $count <= $last; $count += 256) + { + $row[$count / 256] = &print_row ($count, 1, \&fetch_type); + } + printf OUT "\n};\n\n"; + + print OUT "static const short type_table[256] = {\n"; + for ($count = 0; $count <= $last; $count += 256) + { + print OUT ",\n" if $count > 0; + print OUT " ", $row[$count / 256]; + $bytes_out += 2; + } + print OUT "\n};\n\n"; + + + # + # Now print attribute table. + # + + $table_index = 0; + printf OUT "static const unsigned short attr_data[][256] = {\n"; + for ($count = 0; $count <= $last; $count += 256) + { + $row[$count / 256] = &print_row ($count, 2, \&fetch_attr); + } + printf OUT "\n};\n\n"; + + print OUT "static const short attr_table[256] = {\n"; + for ($count = 0; $count <= $last; $count += 256) + { + print OUT ",\n" if $count > 0; + print OUT " ", $row[$count / 256]; + $bytes_out += 2; + } + print OUT "\n};\n\n"; + + # + # print title case table + # + + # FIXME: type. + print OUT "static const unsigned short title_table[][3] = {\n"; + my ($item); + my ($first) = 1; + foreach $item (sort keys %title_to_lower) + { + print OUT ",\n" + unless $first; + $first = 0; + printf OUT " { 0x%04x, 0x%04x, 0x%04x }", $item, $title_to_upper{$item}, $title_to_lower{$item}; + $bytes_out += 6; + } + print OUT "\n};\n\n"; + + # + # And special case conversion table -- conversions that change length + # + &output_special_case_table (\*OUT); + &output_casefold_table (\*OUT); + + print OUT "#endif /* CHARTABLES_H */\n"; + + close (OUT); + + printf STDERR "Generated %d bytes in tables\n", $bytes_out; +} + +# A fetch function for the type table. +sub fetch_type +{ + my ($index) = @_; + return $mappings{$type[$index]}; +} + +# A fetch function for the attribute table. +sub fetch_attr +{ + my ($index) = @_; + if (defined $value[$index]) + { + return sprintf ("0x%04x", $value[$index]); + } + else + { + return "0x0000"; + } +} + +sub print_row +{ + my ($start, $typsize, $fetcher) = @_; + + my ($i); + my (@values); + my ($flag) = 1; + my ($off); + + for ($off = 0; $off < 256; ++$off) + { + $values[$off] = $fetcher->($off + $start); + if ($values[$off] ne $values[0]) + { + $flag = 0; + } + } + if ($flag) + { + return $values[0] . " + G_UNICODE_MAX_TABLE_INDEX"; + } + + printf OUT ",\n" if ($table_index != 0); + printf OUT " { /* page %d, index %d */\n ", $start / 256, $table_index; + my ($column) = 4; + for ($i = $start; $i < $start + 256; ++$i) + { + print OUT ", " + if $i > $start; + my ($text) = $values[$i - $start]; + if (length ($text) + $column + 2 > 78) + { + print OUT "\n "; + $column = 4; + } + print OUT $text; + $column += length ($text) + 2; + } + print OUT "\n }"; + + $bytes_out += 256 * $typsize; + + return sprintf "%d /* page %d */", $table_index++, $start / 256; +} + +# Generate the character decomposition header. +sub print_decomp +{ + my ($last) = @_; + my ($outfile) = "gunidecomp.h"; + + local ($bytes_out) = 0; + + print "Writing $outfile...\n"; + + open (OUT, "> $outfile") || exit 1; + + print OUT "/* This file is automatically generated. DO NOT EDIT! */\n\n"; + print OUT "#ifndef DECOMP_H\n"; + print OUT "#define DECOMP_H\n\n"; + + printf OUT "#define G_UNICODE_LAST_CHAR 0x%04x\n\n", $last; + + printf OUT "#define G_UNICODE_MAX_TABLE_INDEX 1000\n\n"; + + my ($count, @row); + $table_index = 0; + printf OUT "static const unsigned char cclass_data[][256] = {\n"; + for ($count = 0; $count <= $last; $count += 256) + { + $row[$count / 256] = &print_row ($count, 1, \&fetch_cclass); + } + printf OUT "\n};\n\n"; + + print OUT "static const short combining_class_table[256] = {\n"; + for ($count = 0; $count <= $last; $count += 256) + { + print OUT ",\n" if $count > 0; + print OUT " ", $row[$count / 256]; + $bytes_out += 2; + } + print OUT "\n};\n\n"; + + print OUT "typedef struct\n{\n"; + # FIXME: type. + print OUT " unsigned short ch;\n"; + print OUT " unsigned char canon_offset;\n"; + print OUT " unsigned char compat_offset;\n"; + print OUT " unsigned short expansion_offset;\n"; + print OUT "} decomposition;\n\n"; + + print OUT "static const decomposition decomp_table[] =\n{\n"; + my ($iter); + my ($first) = 1; + my ($decomp_string) = ""; + my ($decomp_string_offset) = 0; + for ($count = 0; $count <= $last; ++$count) + { + if (defined $decompositions[$count]) + { + print OUT ",\n" + if ! $first; + $first = 0; + + my $canon_decomp; + my $compat_decomp; + + if (!$decompose_compat[$count]) { + $canon_decomp = make_decomp ($count, 0); + } + $compat_decomp = make_decomp ($count, 1); + + if (defined $canon_decomp && $compat_decomp eq $canon_decomp) { + undef $compat_decomp; + } + + my $string = ""; + my $canon_offset = 0xff; + my $compat_offset = 0xff; + + if (defined $canon_decomp) { + $canon_offset = 0; + $string .= $canon_decomp; + } + if (defined $compat_decomp) { + if (defined $canon_decomp) { + $string .= "\\x00\\x00"; + } + $compat_offset = (length $string) / 4; + $string .= $compat_decomp; + } + + if (!defined($decomp_offsets{$string})) { + $decomp_offsets{$string} = $decomp_string_offset; + $decomp_string .= "\n \"".$string."\\0\\0\" /* offset ". + $decomp_string_offset." */"; + $decomp_string_offset += ((length $string) / 4) + 2; + + $bytes_out += (length $string) / 4 + 2; # "\x20" + } + + printf OUT qq( { 0x%04x, %u, %u, %d }), + $count, $canon_offset, $compat_offset, $decomp_offsets{$string}; + $bytes_out += 6; + + } + } + print OUT "\n};\n\n"; + + printf OUT "static const guchar decomp_expansion_string[] = %s;\n\n", $decomp_string; + + print OUT "#endif /* DECOMP_H */\n"; + + printf STDERR "Generated %d bytes in decomp tables\n", $bytes_out; +} + +sub print_line_break +{ + my ($last) = @_; + my ($outfile) = "gunibreak.h"; + + local ($bytes_out) = 0; + + print "Writing $outfile...\n"; + + open (OUT, "> $outfile"); + + print OUT "/* This file is automatically generated. DO NOT EDIT!\n"; + print OUT " Instead, edit gen-unicode-tables.pl and re-run. */\n\n"; + + print OUT "#ifndef BREAKTABLES_H\n"; + print OUT "#define BREAKTABLES_H\n\n"; + + print OUT "#define G_UNICODE_DATA_VERSION \"$ARGV[0]\"\n\n"; + + printf OUT "#define G_UNICODE_LAST_CHAR 0x%04x\n\n", $last; + + printf OUT "#define G_UNICODE_MAX_TABLE_INDEX 1000\n\n"; + + $table_index = 0; + printf OUT "static const char break_property_data[][256] = {\n"; + for ($count = 0; $count <= $last; $count += 256) + { + $row[$count / 256] = &print_row ($count, 1, \&fetch_break_type); + } + printf OUT "\n};\n\n"; + + print OUT "static const short break_property_table[256] = {\n"; + for ($count = 0; $count <= $last; $count += 256) + { + print OUT ",\n" if $count > 0; + print OUT " ", $row[$count / 256]; + $bytes_out += 2; + } + print OUT "\n};\n\n"; + + print OUT "#endif /* BREAKTABLES_H */\n"; + + close (OUT); + + printf STDERR "Generated %d bytes in break tables\n", $bytes_out; +} + + +# A fetch function for the break properties table. +sub fetch_break_type +{ + my ($index) = @_; + return $break_mappings{$break_props[$index]}; +} + +# Fetcher for combining class. +sub fetch_cclass +{ + my ($i) = @_; + return $cclass[$i]; +} + +# Expand a character decomposition recursively. +sub expand_decomp +{ + my ($code, $compat) = @_; + + my ($iter, $val); + my (@result) = (); + foreach $iter (split (' ', $decompositions[$code])) + { + $val = hex ($iter); + if (defined $decompositions[$val] && + ($compat || !$decompose_compat[$val])) + { + push (@result, &expand_decomp ($val, $compat)); + } + else + { + push (@result, $val); + } + } + + return @result; +} + +sub make_decomp +{ + my ($code, $compat) = @_; + + my $result = ""; + foreach $iter (&expand_decomp ($code, $compat)) + { + $result .= sprintf "\\x%02x\\x%02x", $iter / 256, $iter & 0xff; + } + + $result; +} +# Generate special case data string from two fields +sub add_special_case +{ + my ($code, $single, $field1, $field2) = @_; + + @values = (defined $single ? $single : (), + (map { hex ($_) } split /\s+/, $field1), + 0, + (map { hex ($_) } split /\s+/, $field2)); + $result = ""; + + + for $value (@values) { + $result .= sprintf ("\\x%02x\\x%02x", $value / 256, $value & 0xff); + } + + $result .= "\\0"; + + if (2 * @values + 2 > $special_case_len) { + $special_case_len = 2 * @values + 2; + } + + push @special_cases, $result; + + # + # We encode special cases in the surrogate pair space + # + $value[$code] = 0xD800 + scalar(@special_cases) - 1; +} + +sub output_special_case_table +{ + my $out = shift; + + print $out <<EOT; + +/* Table of special cases for case conversion; each record contains + * First, the best single character mapping to lowercase if Lu, + * and to uppercase if Ll, followed by the output mapping for the two cases + * other than the case of the codepoint, in the order [Ll],[Lu],[Lt], + * separated and terminated by a double NUL. + */ +static const guchar special_case_table[][$special_case_len] = { +EOT + + for $case (@special_cases) { + print $out qq( "$case",\n); + } + + print $out <<EOT; +}; + +EOT + + print STDERR "Generated ", ($special_case_len * scalar @special_cases), " bytes in special case table\n"; +} + +sub enumerate_ordered +{ + my ($array) = @_; + + my $n = 0; + for my $code (sort { $a <=> $b } keys %$array) { + if ($array->{$code} == 1) { + delete $array->{$code}; + next; + } + $array->{$code} = $n++; + } + + return $n; +} + +sub output_composition_table +{ + print STDERR "Generating composition table\n"; + + local ($bytes_out) = 0; + + my %first; + my %second; + + # First we need to go through and remove decompositions + # starting with a non-starter, and single-character + # decompositions. At the same time, record + # the first and second character of each decomposition + + for $code (keys %compositions) { + @values = map { hex ($_) } split /\s+/, $compositions{$code}; + if ($cclass[$values[0]]) { + delete $compositions{$code}; + next; + } + if (@values == 1) { + delete $compositions{$code}; + next; + } + if (@values != 2) { + die "$code has more than two elements in its decomposition!\n"; + } + + if (exists $first{$values[0]}) { + $first{$values[0]}++; + } else { + $first{$values[0]} = 1; + } + } + + # Assign integer indicices, removing singletons + my $n_first = enumerate_ordered (\%first); + + # Now record the second character if each (non-singleton) decomposition + for $code (keys %compositions) { + @values = map { hex ($_) } split /\s+/, $compositions{$code}; + + if (exists $first{$values[0]}) { + if (exists $second{$values[1]}) { + $second{$values[1]}++; + } else { + $second{$values[1]} = 1; + } + } + } + + # Assign integer indices, removing duplicate + my $n_second = enumerate_ordered (\%second); + + # Build reverse table + + my @first_singletons; + my @second_singletons; + my %reverse; + for $code (keys %compositions) { + @values = map { hex ($_) } split /\s+/, $compositions{$code}; + + my $first = $first{$values[0]}; + my $second = $second{$values[1]}; + + if (defined $first && defined $second) { + $reverse{"$first|$second"} = $code; + } elsif (!defined $first) { + push @first_singletons, [ $values[0], $values[1], $code ]; + } else { + push @second_singletons, [ $values[1], $values[0], $code ]; + } + } + + @first_singletons = sort { $a->[0] <=> $b->[0] } @first_singletons; + @second_singletons = sort { $a->[0] <=> $b->[0] } @second_singletons; + + my %vals; + + open OUT, ">gunicomp.h" or die "Cannot open gunicomp.h: $!\n"; + + # Assign values in lookup table for all code points involved + + my $total = 1; + my $last = 0; + printf OUT "#define COMPOSE_FIRST_START %d\n", $total; + for $code (keys %first) { + $vals{$code} = $first{$code} + $total; + $last = $code if $code > $last; + } + $total += $n_first; + $i = 0; + printf OUT "#define COMPOSE_FIRST_SINGLE_START %d\n", $total; + for $record (@first_singletons) { + my $code = $record->[0]; + $vals{$code} = $i++ + $total; + $last = $code if $code > $last; + } + $total += @first_singletons; + printf OUT "#define COMPOSE_SECOND_START %d\n", $total; + for $code (keys %second) { + $vals{$code} = $second{$code} + $total; + $last = $code if $code > $last; + } + $total += $n_second; + $i = 0; + printf OUT "#define COMPOSE_SECOND_SINGLE_START %d\n\n", $total; + for $record (@second_singletons) { + my $code = $record->[0]; + $vals{$code} = $i++ + $total; + $last = $code if $code > $last; + } + + # Output lookup table + + my @row; + $table_index = 0; + printf OUT "static const gushort compose_data[][256] = {\n"; + for (my $count = 0; $count <= $last; $count += 256) + { + $row[$count / 256] = &print_row ($count, 2, sub { exists $vals{$_[0]} ? $vals{$_[0]} : 0; }); + } + printf OUT "\n};\n\n"; + + print OUT "static const short compose_table[256] = {\n"; + for (my $count = 0; $count <= $last; $count += 256) + { + print OUT ",\n" if $count > 0; + print OUT " ", $row[$count / 256]; + $bytes_out += 4; + } + print OUT "\n};\n\n"; + + # Output first singletons + + print OUT "static const gushort compose_first_single[][2] = {\n"; + $i = 0; + for $record (@first_singletons) { + print OUT ",\n" if $i++ > 0; + printf OUT " { %#06x, %#06x }", $record->[1], $record->[2]; + } + print OUT "\n};\n"; + + $bytes_out += @first_singletons * 4; + + # Output second singletons + + print OUT "static const gushort compose_second_single[][2] = {\n"; + $i = 0; + for $record (@second_singletons) { + print OUT ",\n" if $i++ > 0; + printf OUT " { %#06x, %#06x }", $record->[1], $record->[2]; + } + print OUT "\n};\n"; + + $bytes_out += @second_singletons * 4; + + # Output array of composition pairs + + print OUT <<EOT; +static const gushort compose_array[$n_first][$n_second] = { +EOT + + for (my $i = 0; $i < $n_first; $i++) { + print OUT ",\n" if $i; + print OUT " { "; + for (my $j = 0; $j < $n_second; $j++) { + print OUT ", " if $j; + if (exists $reverse{"$i|$j"}) { + printf OUT "%#06x", $reverse{"$i|$j"}; + } else { + print OUT " 0"; + } + } + print OUT " }"; + } + print OUT "\n"; + + print OUT <<EOT; +}; +EOT + + $bytes_out += $n_first * $n_second * 2; + + printf STDERR "Generated %d bytes in compose tables\n", $bytes_out; +} + +sub output_casefold_table +{ + my $out = shift; + + print $out <<EOT; + +/* Table of casefolding cases that can't be derived by lowercasing + */ +static const struct { + guint16 ch; + gchar data[$casefoldlen]; +} casefold_table[] = { +EOT + + @casefold = sort { $a->[0] <=> $b->[0] } @casefold; + + for $case (@casefold) { + $code = $case->[0]; + $string = $case->[1]; + print $out sprintf(qq({ %#04x, "$string" },\n), $code); + + } + + print $out <<EOT; +}; + +EOT + + my $recordlen = (2+$casefoldlen+1) & ~1; + printf "Generated %d bytes for casefold table\n", $recordlen * @casefold; +} + + + diff --git a/lib/gettext.h b/lib/gettext.h new file mode 100644 index 0000000..8b262f4 --- /dev/null +++ b/lib/gettext.h @@ -0,0 +1,69 @@ +/* Convenience header for conditional use of GNU <libintl.h>. + Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _LIBGETTEXT_H +#define _LIBGETTEXT_H 1 + +/* NLS can be disabled through the configure --disable-nls option. */ +#if ENABLE_NLS + +/* Get declarations of GNU message catalog functions. */ +# include <libintl.h> + +#else + +/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which + chokes if dcgettext is defined as a macro. So include it now, to make + later inclusions of <locale.h> a NOP. We don't include <libintl.h> + as well because people using "gettext.h" will not include <libintl.h>, + and also including <libintl.h> would fail on SunOS 4, whereas <locale.h> + is OK. */ +#if defined(__sun) +# include <locale.h> +#endif + +/* Disabled NLS. + The casts to 'const char *' serve the purpose of producing warnings + for invalid uses of the value returned from these functions. + On pre-ANSI systems without 'const', the config.h file is supposed to + contain "#define const". */ +# define gettext(Msgid) ((const char *) (Msgid)) +# define dgettext(Domainname, Msgid) ((const char *) (Msgid)) +# define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid)) +# define ngettext(Msgid1, Msgid2, N) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define dngettext(Domainname, Msgid1, Msgid2, N) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define textdomain(Domainname) ((const char *) (Domainname)) +# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) +# define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset)) + +#endif + +/* A pseudo function call that serves as a marker for the automated + extraction of messages, but does not call gettext(). The run-time + translation is done at a different place in the code. + The argument, String, should be a literal string. Concatenated strings + and other string expressions won't work. + The macro's expansion is not parenthesized, so that it is suitable as + initializer for static 'char[]' or 'const char[]' variables. */ +#define gettext_noop(String) String + +#endif /* _LIBGETTEXT_H */ diff --git a/lib/gsasl.h.in b/lib/gsasl.h.in new file mode 100644 index 0000000..b15d505 --- /dev/null +++ b/lib/gsasl.h.in @@ -0,0 +1,380 @@ +/* gsasl.h header file for libgsasl -*- c -*- + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _GSASL_H +#define _GSASL_H + +#include <stdio.h> + +#ifdef __cplusplus +extern "C" { +#if 0 /* keep Emacsens's auto-indent happy */ +} +#endif +#endif + +#define GSASL_VERSION "@PACKAGE_VERSION@" + +/* Quoting RFC 2222: + SASL mechanisms are named by strings, from 1 to 20 characters in + length, consisting of upper-case letters, digits, hyphens, and/or + underscores. SASL mechanism names must be registered with the IANA. */ +enum { + GSASL_MIN_MECHANISM_SIZE = 1, + GSASL_MAX_MECHANISM_SIZE = 20 +}; +extern const char *GSASL_VALID_MECHANISM_CHARACTERS; + +/* Error codes */ +enum { + GSASL_OK = 0, + GSASL_NEEDS_MORE, + GSASL_UNKNOWN_MECHANISM, + GSASL_MECHANISM_CALLED_TOO_MANY_TIMES, + GSASL_TOO_SMALL_BUFFER, + GSASL_FOPEN_ERROR, + GSASL_FCLOSE_ERROR, + GSASL_MALLOC_ERROR, + GSASL_BASE64_ERROR, + GSASL_GCRYPT_ERROR, + GSASL_GSSAPI_RELEASE_BUFFER_ERROR, + GSASL_GSSAPI_IMPORT_NAME_ERROR, + GSASL_GSSAPI_INIT_SEC_CONTEXT_ERROR, + GSASL_GSSAPI_ACCEPT_SEC_CONTEXT_ERROR, + GSASL_GSSAPI_UNWRAP_ERROR, + GSASL_GSSAPI_WRAP_ERROR, + GSASL_GSSAPI_ACQUIRE_CRED_ERROR, + GSASL_GSSAPI_DISPLAY_NAME_ERROR, + GSASL_GSSAPI_UNSUPPORTED_PROTECTION_ERROR, + GSASL_NEED_CLIENT_ANONYMOUS_CALLBACK, + GSASL_NEED_CLIENT_PASSWORD_CALLBACK, + GSASL_NEED_CLIENT_PASSCODE_CALLBACK, + GSASL_NEED_CLIENT_PIN_CALLBACK, + GSASL_NEED_CLIENT_AUTHORIZATION_ID_CALLBACK, + GSASL_NEED_CLIENT_AUTHENTICATION_ID_CALLBACK, + GSASL_NEED_CLIENT_SERVICE_CALLBACK, + GSASL_NEED_SERVER_VALIDATE_CALLBACK, + GSASL_NEED_SERVER_CRAM_MD5_CALLBACK, + GSASL_NEED_SERVER_DIGEST_MD5_CALLBACK, + GSASL_NEED_SERVER_EXTERNAL_CALLBACK, + GSASL_NEED_SERVER_ANONYMOUS_CALLBACK, + GSASL_NEED_SERVER_REALM_CALLBACK, + GSASL_NEED_SERVER_SECURID_CALLBACK, + GSASL_NEED_SERVER_SERVICE_CALLBACK, + GSASL_NEED_SERVER_GSSAPI_CALLBACK, + GSASL_SECURID_SERVER_NEED_ADDITIONAL_PASSCODE, + GSASL_SECURID_SERVER_NEED_NEW_PIN, + GSASL_UNICODE_NORMALIZATION_ERROR, + GSASL_MECHANISM_PARSE_ERROR, + GSASL_AUTHENTICATION_ERROR, + GSASL_CANNOT_GET_CTX, + GSASL_NO_MORE_REALMS +}; + +/* Quality of Protection types, used by DIGEST-MD5 */ +enum Gsasl_qop { + GSASL_QOP_AUTH = 1, + GSASL_QOP_AUTH_INT = 2, + GSASL_QOP_AUTH_CONF = 4 +}; +typedef enum Gsasl_qop Gsasl_qop; + +/* Cipher types, used by DIGEST-MD5 */ +enum Gsasl_cipher { + GSASL_CIPHER_DES = 1, + GSASL_CIPHER_3DES = 2, + GSASL_CIPHER_RC4 = 4, + GSASL_CIPHER_RC4_40 = 8, + GSASL_CIPHER_RC4_56 = 16, + GSASL_CIPHER_AES = 32 +}; +typedef enum Gsasl_cipher Gsasl_cipher; + +/* Library handles */ +typedef struct Gsasl_ctx Gsasl_ctx; +typedef struct Gsasl_session_ctx Gsasl_session_ctx; + +/* Library entry and exit points: version.c, init.c, done.c */ +extern int gsasl_init (Gsasl_ctx **ctx); +extern void gsasl_done (Gsasl_ctx *ctx); +extern const char *gsasl_check_version (const char *req_version); + +/* Callback handling */ +extern void gsasl_application_data_set (Gsasl_ctx *ctx, + void *application_data); +extern void *gsasl_application_data_get (Gsasl_ctx *ctx); + +/* Mechanism handling: listmech.c, supportp.c, suggest.c */ +extern int gsasl_client_listmech (Gsasl_ctx *ctx, char *out, size_t *outlen); +extern int gsasl_client_support_p (Gsasl_ctx *ctx, const char *name); +extern const char *gsasl_client_suggest_mechanism (Gsasl_ctx *ctx, + const char *mechlist); + +extern int gsasl_server_listmech (Gsasl_ctx *ctx, char *out, size_t *outlen); +extern int gsasl_server_support_p (Gsasl_ctx *ctx, const char *name); +extern const char *gsasl_server_suggest_mechanism (Gsasl_ctx *ctx, + const char *mechlist); + +/* Authentication functions: xstart.c, xstep.c, xfinish.c */ +extern int gsasl_client_start (Gsasl_ctx *ctx, const char *mech, + Gsasl_session_ctx **cctx); +extern int gsasl_client_step (Gsasl_session_ctx *xctx, + const char *input, size_t input_len, + char *output, size_t *output_len); +extern int gsasl_client_step_base64 (Gsasl_session_ctx *xctx, + const char *b64input, + char *b64output, + size_t b64output_len); +extern void gsasl_client_finish (Gsasl_session_ctx *xctx); +extern int gsasl_server_start (Gsasl_ctx *ctx, const char *mech, + Gsasl_session_ctx **sctx); +extern int gsasl_server_step (Gsasl_session_ctx *xctx, + const char *input, size_t input_len, + char *output, size_t *output_len); +extern int gsasl_server_step_base64 (Gsasl_session_ctx *xctx, + const char *b64input, + char *b64output, + size_t b64output_len); +extern void gsasl_server_finish (Gsasl_session_ctx *xctx); + +/* Error handling: error.c */ +extern const char *gsasl_strerror (int err); + +/* Utilities: base64.c, hexdump.c, md5pwd.c */ +extern int gsasl_base64_encode (unsigned char const *src, + size_t srclength, + char *target, + size_t targsize); +extern int gsasl_base64_decode (char const *src, + unsigned char *target, + size_t targsize); +extern void gsasl_hexdump (FILE *fh, const char *buffer, size_t len); +extern int gsasl_md5pwd_get_password (const char *filename, + const char *username, + char *key, + size_t *keylen); +extern char *gsasl_utf8_nfkc_normalize (const char *str, + int len); + +/* Callback prototypes */ +typedef int (*Gsasl_client_callback_anonymous) (Gsasl_session_ctx *ctx, + char *out, + size_t *outlen); +typedef int (*Gsasl_client_callback_authentication_id) (Gsasl_session_ctx *ctx, + char *out, + size_t *outlen); +typedef int (*Gsasl_client_callback_authorization_id) (Gsasl_session_ctx *ctx, + char *out, + size_t *outlen); +typedef int (*Gsasl_client_callback_password) (Gsasl_session_ctx *ctx, + char *out, + size_t *outlen); +typedef int (*Gsasl_client_callback_passcode) (Gsasl_session_ctx *ctx, + char *out, + size_t *outlen); +typedef int (*Gsasl_client_callback_pin) (Gsasl_session_ctx *ctx, + char *suggestion, + char *out, + size_t *outlen); +typedef int (*Gsasl_client_callback_service) (Gsasl_session_ctx *ctx, + char *service, + size_t *servicelen, + char *hostname, + size_t *hostnamelen, + char *servicename, + size_t *servicenamelen); +typedef Gsasl_qop (*Gsasl_client_callback_qop) (Gsasl_session_ctx *ctx, + Gsasl_qop serverqops); +typedef int (*Gsasl_client_callback_maxbuf) (Gsasl_session_ctx *ctx, + int servermaxbuf); +typedef int (*Gsasl_server_callback_retrieve) (Gsasl_session_ctx *ctx, + char *authentication_id, + char *authorization_id, + char *realm, + char *key, + size_t *keylen); +typedef int (*Gsasl_server_callback_validate) (Gsasl_session_ctx *ctx, + char *authorization_id, + char *authentication_id, + char *password); +typedef int (*Gsasl_server_callback_gssapi) (Gsasl_session_ctx *ctx, + char *clientname, + char *authentication_id); +typedef int (*Gsasl_server_callback_securid) (Gsasl_session_ctx *ctx, + char *authentication_id, + char *authorization_id, + char *passcode, + char *pin, + char *suggestpin, + size_t *suggestpinlen); +typedef int (*Gsasl_server_callback_cram_md5) (Gsasl_session_ctx *ctx, + char *username, + char *challenge, + char *response); +typedef int (*Gsasl_server_callback_digest_md5) (Gsasl_session_ctx *ctx, + unsigned char *username, + unsigned char *realm, + unsigned char *secrethash); +typedef int (*Gsasl_server_callback_service) (Gsasl_session_ctx *ctx, + char *service, + size_t *servicelen, + char *hostname, + size_t *hostnamelen); +typedef int (*Gsasl_server_callback_external) (Gsasl_session_ctx *ctx); +typedef int (*Gsasl_server_callback_anonymous) (Gsasl_session_ctx *ctx, + const char *token); +typedef int (*Gsasl_server_callback_realm) (Gsasl_session_ctx *ctx, + char *out, + size_t *outlen, + size_t nth); +typedef Gsasl_qop (*Gsasl_server_callback_qop) (Gsasl_session_ctx *ctx); +typedef int (*Gsasl_server_callback_maxbuf) (Gsasl_session_ctx *ctx); +typedef Gsasl_cipher (*Gsasl_server_callback_cipher) (Gsasl_session_ctx *ctx); + +/* Client callbacks */ +extern Gsasl_ctx *gsasl_client_ctx_get (Gsasl_session_ctx *cctx); + +extern void gsasl_client_application_data_set (Gsasl_session_ctx *xctx, + void *application_data); +extern void *gsasl_client_application_data_get (Gsasl_session_ctx *ctx); + +extern void gsasl_client_callback_authorization_id_set (Gsasl_ctx *ctx, + Gsasl_client_callback_authorization_id cb); +extern Gsasl_client_callback_authorization_id + gsasl_client_callback_authorization_id_get (Gsasl_ctx *ctx); + +extern void gsasl_client_callback_authentication_id_set (Gsasl_ctx *ctx, + Gsasl_client_callback_authentication_id cb); +extern Gsasl_client_callback_authentication_id + gsasl_client_callback_authentication_id_get (Gsasl_ctx *ctx); + +extern void gsasl_client_callback_anonymous_set (Gsasl_ctx *ctx, + Gsasl_client_callback_anonymous cb); +extern Gsasl_client_callback_anonymous + gsasl_client_callback_anonymous_get (Gsasl_ctx *ctx); + +extern void gsasl_client_callback_password_set (Gsasl_ctx *ctx, + Gsasl_client_callback_password cb); +extern Gsasl_client_callback_password + gsasl_client_callback_password_get (Gsasl_ctx *ctx); + +extern void gsasl_client_callback_passcode_set (Gsasl_ctx *ctx, + Gsasl_client_callback_passcode cb); +extern Gsasl_client_callback_passcode + gsasl_client_callback_passcode_get (Gsasl_ctx *ctx); + +extern void gsasl_client_callback_pin_set (Gsasl_ctx *ctx, + Gsasl_client_callback_pin cb); +extern Gsasl_client_callback_pin + gsasl_client_callback_pin_get (Gsasl_ctx *ctx); + +extern void gsasl_client_callback_service_set (Gsasl_ctx *ctx, + Gsasl_client_callback_service cb); +extern Gsasl_client_callback_service + gsasl_client_callback_service_get (Gsasl_ctx *ctx); + +extern void gsasl_client_callback_qop_set (Gsasl_ctx *ctx, + Gsasl_client_callback_qop cb); +extern Gsasl_client_callback_qop + gsasl_client_callback_qop_get (Gsasl_ctx *ctx); + +extern void gsasl_client_callback_maxbuf_set (Gsasl_ctx *ctx, + Gsasl_client_callback_maxbuf cb); +extern Gsasl_client_callback_maxbuf + gsasl_client_callback_maxbuf_get (Gsasl_ctx *ctx); + +/* Server callbacks */ +extern Gsasl_ctx *gsasl_server_ctx_get (Gsasl_session_ctx *sctx); + +extern void gsasl_server_application_data_set (Gsasl_session_ctx *xctx, + void *application_data); +extern void *gsasl_server_application_data_get (Gsasl_session_ctx *ctx); + +extern void gsasl_server_callback_validate_set (Gsasl_ctx *ctx, + Gsasl_server_callback_validate cb); +extern Gsasl_server_callback_validate + gsasl_server_callback_validate_get (Gsasl_ctx *ctx); + +extern void gsasl_server_callback_retrieve_set (Gsasl_ctx *ctx, + Gsasl_server_callback_retrieve cb); +extern Gsasl_server_callback_retrieve + gsasl_server_callback_retrieve_get (Gsasl_ctx *ctx); + +extern void gsasl_server_callback_cram_md5_set (Gsasl_ctx *ctx, + Gsasl_server_callback_cram_md5 cb); +extern Gsasl_server_callback_cram_md5 + gsasl_server_callback_cram_md5_get (Gsasl_ctx *ctx); + +extern void gsasl_server_callback_digest_md5_set (Gsasl_ctx *ctx, + Gsasl_server_callback_digest_md5 cb); +extern Gsasl_server_callback_digest_md5 + gsasl_server_callback_digest_md5_get (Gsasl_ctx *ctx); + +extern void gsasl_server_callback_external_set (Gsasl_ctx *ctx, + Gsasl_server_callback_external cb); +extern Gsasl_server_callback_external + gsasl_server_callback_external_get (Gsasl_ctx *ctx); + +extern void gsasl_server_callback_anonymous_set (Gsasl_ctx *ctx, + Gsasl_server_callback_anonymous cb); +extern Gsasl_server_callback_anonymous + gsasl_server_callback_anonymous_get (Gsasl_ctx *ctx); + +extern void gsasl_server_callback_realm_set (Gsasl_ctx *ctx, + Gsasl_server_callback_realm cb); +extern Gsasl_server_callback_realm + gsasl_server_callback_realm_get (Gsasl_ctx *ctx); + +extern void gsasl_server_callback_qop_set (Gsasl_ctx *ctx, + Gsasl_server_callback_qop cb); +extern Gsasl_server_callback_qop + gsasl_server_callback_qop_get (Gsasl_ctx *ctx); + +extern void gsasl_server_callback_maxbuf_set (Gsasl_ctx *ctx, + Gsasl_server_callback_maxbuf cb); +extern Gsasl_server_callback_maxbuf + gsasl_server_callback_maxbuf_get (Gsasl_ctx *ctx); + +extern void gsasl_server_callback_cipher_set (Gsasl_ctx *ctx, + Gsasl_server_callback_cipher cb); +extern Gsasl_server_callback_cipher + gsasl_server_callback_cipher_get (Gsasl_ctx *ctx); + +extern void gsasl_server_callback_securid_set (Gsasl_ctx *ctx, + Gsasl_server_callback_securid cb); +extern Gsasl_server_callback_securid + gsasl_server_callback_securid_get (Gsasl_ctx *ctx); + +extern void gsasl_server_callback_gssapi_set (Gsasl_ctx *ctx, + Gsasl_server_callback_gssapi cb); +extern Gsasl_server_callback_gssapi + gsasl_server_callback_gssapi_get (Gsasl_ctx *ctx); + +extern void gsasl_server_callback_service_set (Gsasl_ctx *ctx, + Gsasl_server_callback_service cb); +extern Gsasl_server_callback_service + gsasl_server_callback_service_get (Gsasl_ctx *ctx); + +#ifdef __cplusplus +} +#endif + +#endif /* _GSASL_H */ diff --git a/lib/gssapi.c b/lib/gssapi.c new file mode 100644 index 0000000..40ba632 --- /dev/null +++ b/lib/gssapi.c @@ -0,0 +1,582 @@ +/* gssapi.c implementation of SASL mechanism GSSAPI from RFC 2222 + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" + +#ifdef USE_GSSAPI + +#ifdef HAVE_GSSAPI_H +#include <gssapi.h> +#endif +#ifdef HAVE_GSSAPI_GSSAPI_H +#include <gssapi/gssapi.h> +#endif +#ifdef HAVE_GSSAPI_GSSAPI_GENERIC_H +#include <gssapi/gssapi_generic.h> +#endif +#ifndef HAVE_GSS_C_NT_HOSTBASED_SERVICE +#define GSS_C_NT_HOSTBASED_SERVICE gss_nt_service_name +#endif + +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif + +#define GSSAPI_AUTH_NONE 1 +#define GSSAPI_AUTH_INTEGRITY 2 +#define GSSAPI_AUTH_PRIVACY 4 + +/* Client */ + +struct _Gsasl_gssapi_client_state { + int step; + gss_name_t service; + gss_ctx_id_t context; +}; +typedef struct _Gsasl_gssapi_client_state _Gsasl_gssapi_client_state; + +int +_gsasl_gssapi_client_init (Gsasl_ctx *ctx) +{ + return GSASL_OK; +} + +void +_gsasl_gssapi_client_done (Gsasl_ctx *ctx) +{ + return; +} + +int +_gsasl_gssapi_client_start (Gsasl_session_ctx *cctx, + void **mech_data) +{ + _Gsasl_gssapi_client_state *state; + Gsasl_ctx *ctx; + + ctx = gsasl_client_ctx_get (cctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + if (gsasl_client_callback_authentication_id_get (ctx) == NULL) + return GSASL_NEED_CLIENT_AUTHENTICATION_ID_CALLBACK; + + if (gsasl_client_callback_service_get (ctx) == NULL) + return GSASL_NEED_CLIENT_SERVICE_CALLBACK; + + state = (_Gsasl_gssapi_client_state*) malloc(sizeof(*state)); + if (state == NULL) + return GSASL_MALLOC_ERROR; + + state->context = GSS_C_NO_CONTEXT; + state->service = NULL; + state->step = 0; + + *mech_data = state; + + return GSASL_OK; +} + +int +_gsasl_gssapi_client_step (Gsasl_session_ctx *cctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len) +{ + _Gsasl_gssapi_client_state *state = mech_data; + Gsasl_client_callback_authentication_id cb_authentication_id; + Gsasl_client_callback_service cb_service; + Gsasl_ctx *ctx; + gss_buffer_desc bufdesc, bufdesc2; + gss_buffer_t buf = GSS_C_NO_BUFFER; + OM_uint32 maj_stat, min_stat; + gss_qop_t qop_state; + int conf_state; + int res; + + ctx = gsasl_client_ctx_get (cctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + cb_authentication_id = gsasl_client_callback_authentication_id_get (ctx); + if (cb_authentication_id == NULL) + return GSASL_NEED_CLIENT_AUTHENTICATION_ID_CALLBACK; + + cb_service = gsasl_client_callback_service_get (ctx); + if (cb_service == NULL) + return GSASL_NEED_CLIENT_SERVICE_CALLBACK; + + if (state->service == NULL) + { + size_t servicelen = 0; + size_t hostnamelen = 0; + + res = cb_service (cctx, NULL, &servicelen, + NULL, &hostnamelen, + NULL, NULL); + if (res != GSASL_OK) + return res; + + bufdesc.length = servicelen + strlen("@") + hostnamelen + 1; + bufdesc.value = malloc(bufdesc.length); + if (bufdesc.value == NULL) + return GSASL_MALLOC_ERROR; + + res = cb_service (cctx, (char*)bufdesc.value, &servicelen, + (char*)bufdesc.value + 1 + servicelen, &hostnamelen, + NULL, NULL); + if (res != GSASL_OK) + { + free(bufdesc.value); + return res; + } + ((char*)bufdesc.value)[servicelen] = '@'; + ((char*)bufdesc.value)[bufdesc.length-1] = '\0'; + + maj_stat = gss_import_name(&min_stat, &bufdesc, + GSS_C_NT_HOSTBASED_SERVICE, &state->service); + free(bufdesc.value); + if (maj_stat != GSS_S_COMPLETE) + { + free(state); + return GSASL_GSSAPI_IMPORT_NAME_ERROR; + } + } + + switch (state->step) + { + case 1: + bufdesc.length = input_len; + bufdesc.value = input; + buf = &bufdesc; + /* fall through */ + + case 0: + bufdesc2.length = 0; + bufdesc2.value = NULL; + maj_stat = gss_init_sec_context(&min_stat, + GSS_C_NO_CREDENTIAL, + &state->context, + state->service, + GSS_C_NO_OID, + GSS_C_MUTUAL_FLAG | + GSS_C_REPLAY_FLAG | + GSS_C_SEQUENCE_FLAG, + 0, + GSS_C_NO_CHANNEL_BINDINGS, + buf, + NULL, + &bufdesc2, + NULL, + NULL); + if (maj_stat != GSS_S_COMPLETE && maj_stat != GSS_S_CONTINUE_NEEDED) + return GSASL_GSSAPI_INIT_SEC_CONTEXT_ERROR; + + if (*output_len < bufdesc2.length) + { + maj_stat = gss_release_buffer(&min_stat, &bufdesc2); + return GSASL_TOO_SMALL_BUFFER; + } + + *output_len = bufdesc2.length; + memcpy(output, bufdesc2.value, bufdesc2.length); + + if (maj_stat == GSS_S_COMPLETE) + state->step = 2; + else + state->step = 1; + + maj_stat = gss_release_buffer(&min_stat, &bufdesc2); + if (maj_stat != GSS_S_COMPLETE) + return GSASL_GSSAPI_RELEASE_BUFFER_ERROR; + + res = GSASL_NEEDS_MORE; + break; + + case 2: + if (*output_len <= 4) + return GSASL_TOO_SMALL_BUFFER; + + /* The client passes this token to GSS_Unwrap and interprets the + first octet of resulting cleartext as a bit-mask specifying + the security layers supported by the server and the second + through fourth octets as the maximum size output_message to + send to the server. The client then constructs data, with + the first octet containing the bit-mask specifying the + selected security layer, the second through fourth octets + containing in network byte order the maximum size + output_message the client is able to receive, and the + remaining octets containing the authorization identity. The + client passes the data to GSS_Wrap with conf_flag set to + FALSE, and responds with the generated output_message. The + client can then consider the server authenticated. */ + + bufdesc.length = input_len; + bufdesc.value = input; + maj_stat = gss_unwrap(&min_stat, state->context, &bufdesc, + &bufdesc2, &conf_state, &qop_state); + if (maj_stat != GSS_S_COMPLETE) + return GSASL_GSSAPI_UNWRAP_ERROR; + + memcpy(output, bufdesc2.value, 4); + maj_stat = gss_release_buffer(&min_stat, &bufdesc2); + if (maj_stat != GSS_S_COMPLETE) + return GSASL_GSSAPI_RELEASE_BUFFER_ERROR; + + if ((output[0] & GSSAPI_AUTH_NONE) == 0) + /* Integrity or privacy unsupported. */ + return GSASL_GSSAPI_UNSUPPORTED_PROTECTION_ERROR; + + output[0] = GSSAPI_AUTH_NONE; + bufdesc.length = *output_len - 4; + cb_authentication_id (cctx, output+4, &bufdesc.length); + bufdesc.length += 4; + bufdesc.value = output; + maj_stat = gss_wrap(&min_stat, state->context, 0, GSS_C_QOP_DEFAULT, + &bufdesc, &conf_state, &bufdesc2); + if (maj_stat != GSS_S_COMPLETE) + return GSASL_GSSAPI_WRAP_ERROR; + memcpy(output, bufdesc2.value, bufdesc2.length); + *output_len = bufdesc2.length; + + maj_stat = gss_release_buffer(&min_stat, &bufdesc2); + if (maj_stat != GSS_S_COMPLETE) + return GSASL_GSSAPI_RELEASE_BUFFER_ERROR; + + state->step++; + res = GSASL_NEEDS_MORE; + break; + + default: + res = GSASL_OK; + break; + } + + return res; +} + +int +_gsasl_gssapi_client_finish (Gsasl_session_ctx *cctx, + void *mech_data) +{ + _Gsasl_gssapi_client_state *state = mech_data; + OM_uint32 maj_stat, min_stat; + + maj_stat = gss_release_name(&min_stat, &state->service); + if (state->context != GSS_C_NO_CONTEXT) + maj_stat = gss_delete_sec_context(&min_stat, state->context, + GSS_C_NO_BUFFER); + + free(state); + + return GSASL_OK; +} + +/* Server */ + +struct _Gsasl_gssapi_server_state { + int step; + gss_name_t client; + gss_cred_id_t cred; + gss_ctx_id_t context; +}; +typedef struct _Gsasl_gssapi_server_state _Gsasl_gssapi_server_state; + +int +_gsasl_gssapi_server_init (Gsasl_ctx *ctx) +{ + return GSASL_OK; +} + +void +_gsasl_gssapi_server_done (Gsasl_ctx *ctx) +{ + return; +} + +int +_gsasl_gssapi_server_start (Gsasl_session_ctx *sctx, + void **mech_data) +{ + _Gsasl_gssapi_server_state *state; + Gsasl_server_callback_service cb_service; + Gsasl_ctx *ctx; + OM_uint32 maj_stat, min_stat; + gss_name_t server; + gss_buffer_desc bufdesc; + size_t servicelen = 0; + size_t hostnamelen = 0; + int res; + + ctx = gsasl_server_ctx_get (sctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + cb_service = gsasl_server_callback_service_get (ctx); + if (cb_service == NULL) + return GSASL_NEED_SERVER_SERVICE_CALLBACK; + + if (gsasl_server_callback_gssapi_get (ctx) == NULL) + return GSASL_NEED_SERVER_GSSAPI_CALLBACK; + + res = cb_service (sctx, NULL, &servicelen, + NULL, &hostnamelen); + if (res != GSASL_OK) + return res; + + bufdesc.length = servicelen + strlen("@") + hostnamelen + 1; + bufdesc.value = malloc(bufdesc.length); + if (bufdesc.value == NULL) + return GSASL_MALLOC_ERROR; + + res = cb_service (sctx, bufdesc.value, &servicelen, + (char*)bufdesc.value + 1 + servicelen, &hostnamelen); + if (res != GSASL_OK) + { + free(bufdesc.value); + return res; + } + ((char*)bufdesc.value)[servicelen] = '@'; + ((char*)bufdesc.value)[bufdesc.length-1] = '\0'; + + state = (_Gsasl_gssapi_server_state*) malloc(sizeof(*state)); + if (state == NULL) + { + free(bufdesc.value); + return GSASL_MALLOC_ERROR; + } + + maj_stat = gss_import_name(&min_stat, &bufdesc, GSS_C_NT_HOSTBASED_SERVICE, + &server); + free(bufdesc.value); + if (maj_stat != GSS_S_COMPLETE) + { + free(state); + return GSASL_GSSAPI_IMPORT_NAME_ERROR; + } + + maj_stat = gss_acquire_cred (&min_stat, server, 0, + GSS_C_NULL_OID_SET, GSS_C_ACCEPT, + &state->cred, NULL, NULL); + gss_release_name(&min_stat, &server); + + if (maj_stat != GSS_S_COMPLETE) + { + free(state); + return GSASL_GSSAPI_ACQUIRE_CRED_ERROR; + } + + state->step = 0; + state->context = GSS_C_NO_CONTEXT; + state->client = NULL; + *mech_data = state; + + return GSASL_OK; +} + +int +_gsasl_gssapi_server_step (Gsasl_session_ctx *sctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len) +{ + _Gsasl_gssapi_server_state *state = mech_data; + Gsasl_server_callback_gssapi cb_gssapi; + gss_buffer_desc bufdesc1, bufdesc2; + OM_uint32 maj_stat, min_stat; + gss_buffer_desc client_name; + gss_OID mech_type; + Gsasl_ctx *ctx; + char *username; + int res; + + ctx = gsasl_server_ctx_get (sctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + cb_gssapi = gsasl_server_callback_gssapi_get (ctx); + if (cb_gssapi == NULL) + return GSASL_NEED_SERVER_GSSAPI_CALLBACK; + + switch (state->step) + { + case 0: + if (input_len == 0) + { + *output_len = 0; + return GSASL_NEEDS_MORE; + } + state->step++; + /* fall through */ + + case 1: + bufdesc1.value = input; + bufdesc1.length = input_len; + maj_stat = gss_accept_sec_context (&min_stat, + &state->context, + state->cred, + &bufdesc1, + GSS_C_NO_CHANNEL_BINDINGS, + &state->client, + &mech_type, + &bufdesc2, + NULL, + NULL, + NULL); + if (maj_stat != GSS_S_COMPLETE && maj_stat != GSS_S_CONTINUE_NEEDED) + { + return GSASL_GSSAPI_ACCEPT_SEC_CONTEXT_ERROR; + } + + if (*output_len < bufdesc2.length) + { + maj_stat = gss_release_buffer (&min_stat, &bufdesc2); + return GSASL_TOO_SMALL_BUFFER; + } + + if (maj_stat == GSS_S_COMPLETE) + state->step++; + + memcpy(output, bufdesc2.value, bufdesc2.length); + *output_len = bufdesc2.length; + + maj_stat = gss_release_buffer (&min_stat, &bufdesc2); + if (maj_stat != GSS_S_COMPLETE) + return GSASL_GSSAPI_RELEASE_BUFFER_ERROR; + + res = GSASL_NEEDS_MORE; + break; + + case 2: + if (*output_len < 4) + return GSASL_TOO_SMALL_BUFFER; + + memset(output, 0xFF, 4); + output[0] = GSSAPI_AUTH_NONE; + bufdesc1.length = 4; + bufdesc1.value = output; + maj_stat = gss_wrap (&min_stat, state->context, 0, GSS_C_QOP_DEFAULT, + &bufdesc1, NULL, &bufdesc2); + if (maj_stat != GSS_S_COMPLETE) + return GSASL_GSSAPI_WRAP_ERROR; + + if (*output_len < bufdesc2.length) + { + maj_stat = gss_release_buffer (&min_stat, &bufdesc2); + return GSASL_TOO_SMALL_BUFFER; + } + memcpy(output, bufdesc2.value, bufdesc2.length); + *output_len = bufdesc2.length; + + maj_stat = gss_release_buffer (&min_stat, &bufdesc2); + if (maj_stat != GSS_S_COMPLETE) + return GSASL_GSSAPI_RELEASE_BUFFER_ERROR; + + state->step++; + res = GSASL_NEEDS_MORE; + break; + + case 3: + bufdesc1.value = input; + bufdesc1.length = input_len; + maj_stat = gss_unwrap (&min_stat, state->context, &bufdesc1, + &bufdesc2, NULL, NULL); + if (maj_stat != GSS_S_COMPLETE) + return GSASL_GSSAPI_UNWRAP_ERROR; + + /* The client passes this token to GSS_Unwrap and interprets the + first octet of resulting cleartext as a bit-mask specifying + the security layers supported by the server and the second + through fourth octets as the maximum size output_message to + send to the server. The client then constructs data, with + the first octet containing the bit-mask specifying the + selected security layer, the second through fourth octets + containing in network byte order the maximum size + output_message the client is able to receive, and the + remaining octets containing the authorization identity. The + client passes the data to GSS_Wrap with conf_flag set to + FALSE, and responds with the generated output_message. The + client can then consider the server authenticated. */ + + if ((((char*)bufdesc2.value)[0] & GSSAPI_AUTH_NONE) == 0) + { + /* Integrity or privacy unsupported */ + maj_stat = gss_release_buffer (&min_stat, &bufdesc2); + return GSASL_GSSAPI_UNSUPPORTED_PROTECTION_ERROR; + } + + username = malloc(bufdesc2.length - 4 + 1); + if (username == NULL) + { + gss_release_buffer (&min_stat, &bufdesc2); + return GSASL_MALLOC_ERROR; + } + + memcpy(username, (char*)bufdesc2.value + 4, bufdesc2.length - 4); + username[bufdesc2.length - 4] = '\0'; + maj_stat = gss_release_buffer (&min_stat, &bufdesc2); + if (maj_stat != GSS_S_COMPLETE) + return GSASL_GSSAPI_RELEASE_BUFFER_ERROR; + + maj_stat = gss_display_name(&min_stat, state->client, + &client_name, &mech_type); + if (maj_stat != GSS_S_COMPLETE) + { + free (username); + return GSASL_GSSAPI_DISPLAY_NAME_ERROR; + } + + res = cb_gssapi(sctx, client_name.value, username); + free(username); + + state->step++; + break; + + default: + res = GSASL_MECHANISM_CALLED_TOO_MANY_TIMES; + break; + } + + return res; +} + +int +_gsasl_gssapi_server_finish (Gsasl_session_ctx *sctx, + void *mech_data) +{ + _Gsasl_gssapi_server_state *state = mech_data; + OM_uint32 min_stat; + + if (state->context != GSS_C_NO_CONTEXT) + gss_delete_sec_context (&min_stat, &state->context, GSS_C_NO_BUFFER); + + if (state->cred != GSS_C_NO_CREDENTIAL) + gss_release_cred(&min_stat, state->cred); + + free(state); + + return GSASL_OK; +} +#endif /* USE_GSSAPI */ diff --git a/lib/gunibreak.h b/lib/gunibreak.h new file mode 100644 index 0000000..3600dc1 --- /dev/null +++ b/lib/gunibreak.h @@ -0,0 +1,6640 @@ +/* This file is automatically generated. DO NOT EDIT! + Instead, edit gen-unicode-tables.pl and re-run. */ + +#ifndef BREAKTABLES_H +#define BREAKTABLES_H + +#define G_UNICODE_DATA_VERSION "3.2" + +#define G_UNICODE_LAST_CHAR 0xffff + +#define G_UNICODE_MAX_TABLE_INDEX 1000 + +static const char break_property_data[][256] = { + { /* page 0, index 0 */ + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_LINE_FEED, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_MANDATORY, G_UNICODE_BREAK_CARRIAGE_RETURN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_SPACE, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_HYPHEN, + G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_SYMBOL, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_INFIX_SEPARATOR, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_BEFORE, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 1, index 1 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 2, index 2 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 3, index 3 */ + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 4, index 4 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 5, index 5 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_INFIX_SEPARATOR, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN + }, + { /* page 6, index 6 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 7, index 7 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 9, index 8 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 10, index 9 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 11, index 10 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 12, index 11 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 13, index 12 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 14, index 13 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 15, index 14 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 16, index 15 */ + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 17, index 16 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 18, index 17 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 19, index 18 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 20, index 19 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 22, index 20 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN + }, + { /* page 23, index 21 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 24, index 22 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 30, index 23 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 31, index 24 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 32, index 25 */ + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_NON_BREAKING_GLUE, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_ZERO_WIDTH_SPACE, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_BEFORE_AND_AFTER, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_INSEPARABLE, + G_UNICODE_BREAK_INSEPARABLE, G_UNICODE_BREAK_INSEPARABLE, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_MANDATORY, + G_UNICODE_BREAK_MANDATORY, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN + }, + { /* page 33, index 26 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 34, index 27 */ + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 35, index 28 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 36, index 29 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 37, index 30 */ + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 38, index 31 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 39, index 32 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 41, index 33 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 46, index 34 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 47, index 35 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 48, index 36 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC + }, + { /* page 49, index 37 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER + }, + { /* page 50, index 38 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 51, index 39 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 77, index 40 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 159, index 41 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 164, index 42 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 215, index 43 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 250, index 44 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 251, index 45 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 253, index 46 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 254, index 47 */ + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NON_BREAKING_GLUE + }, + { /* page 255, index 48 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_CONTINGENT, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + } +}; + +static const short break_property_table[256] = { + 0 /* page 0 */, + 1 /* page 1 */, + 2 /* page 2 */, + 3 /* page 3 */, + 4 /* page 4 */, + 5 /* page 5 */, + 6 /* page 6 */, + 7 /* page 7 */, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + 8 /* page 9 */, + 9 /* page 10 */, + 10 /* page 11 */, + 11 /* page 12 */, + 12 /* page 13 */, + 13 /* page 14 */, + 14 /* page 15 */, + 15 /* page 16 */, + 16 /* page 17 */, + 17 /* page 18 */, + 18 /* page 19 */, + 19 /* page 20 */, + G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, + 20 /* page 22 */, + 21 /* page 23 */, + 22 /* page 24 */, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + 23 /* page 30 */, + 24 /* page 31 */, + 25 /* page 32 */, + 26 /* page 33 */, + 27 /* page 34 */, + 28 /* page 35 */, + 29 /* page 36 */, + 30 /* page 37 */, + 31 /* page 38 */, + 32 /* page 39 */, + G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, + 33 /* page 41 */, + G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + 34 /* page 46 */, + 35 /* page 47 */, + 36 /* page 48 */, + 37 /* page 49 */, + 38 /* page 50 */, + 39 /* page 51 */, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + 40 /* page 77 */, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + 41 /* page 159 */, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + 42 /* page 164 */, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + 43 /* page 215 */, + G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + 44 /* page 250 */, + 45 /* page 251 */, + G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, + 46 /* page 253 */, + 47 /* page 254 */, + 48 /* page 255 */ +}; + +#endif /* BREAKTABLES_H */ diff --git a/lib/gunicomp.h b/lib/gunicomp.h new file mode 100644 index 0000000..3669d58 --- /dev/null +++ b/lib/gunicomp.h @@ -0,0 +1,656 @@ +#define COMPOSE_FIRST_START 1 +#define COMPOSE_FIRST_SINGLE_START 147 +#define COMPOSE_SECOND_START 357 +#define COMPOSE_SECOND_SINGLE_START 388 + +static const gushort compose_data[][256] = { + { /* page 0, index 0 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 148, 149, 0, 0, 1, 2, 3, 4, 5, + 150, 6, 7, 8, 151, 9, 10, 11, 12, 13, 14, 0, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 152, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 0, 39, 40, 41, 42, 43, 44, 45, 46, 47, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 153, 154, + 50, 155, 0, 0, 51, 0, 0, 0, 0, 156, 0, 0, 0, 0, 52, 53, 157, 0, 158, 0, + 0, 0, 54, 0, 0, 0, 0, 0, 55, 0, 159, 160, 56, 161, 0, 0, 57, 0, 0, 0, 0, + 162, 0, 0, 0, 0, 58, 59, 163, 0, 164, 0, 0, 0, 60, 0, 0, 0 + }, + { /* page 1, index 1 */ + 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 165, 166, 0, + 0, 0, 0, 167, 168, 0, 0, 0, 0, 0, 0, 169, 170, 171, 172, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, + 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 70, 0, 0, 0, 0, 0, 0, 174, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 175, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0 + }, + { /* page 2, index 2 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, 178, 179, 180, 0, 0, 0, 0, + 181, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 3, index 3 */ + 357, 358, 359, 360, 361, 0, 362, 363, 364, 365, 366, 367, 368, 0, 0, 369, + 0, 370, 0, 371, 372, 0, 0, 0, 0, 0, 0, 373, 0, 0, 0, 0, 0, 0, 0, 374, + 375, 376, 377, 378, 379, 0, 0, 0, 0, 380, 381, 0, 382, 383, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 384, 0, 0, 385, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, + 72, 0, 73, 0, 74, 0, 0, 0, 0, 0, 75, 0, 184, 0, 0, 0, 76, 0, 0, 0, 77, 0, + 0, 185, 0, 186, 0, 0, 78, 0, 0, 0, 79, 0, 80, 0, 81, 0, 0, 0, 0, 0, 82, + 0, 83, 0, 0, 0, 84, 0, 0, 0, 85, 86, 87, 0, 0, 187, 0, 0, 0, 88, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 4, index 4 */ + 0, 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 189, 0, 90, + 91, 190, 92, 0, 191, 0, 0, 0, 192, 0, 0, 0, 0, 93, 0, 0, 0, 193, 0, 0, 0, + 194, 0, 195, 0, 0, 94, 0, 0, 196, 0, 95, 96, 197, 97, 0, 198, 0, 0, 0, + 199, 0, 0, 0, 0, 98, 0, 0, 0, 200, 0, 0, 0, 201, 0, 202, 0, 0, 0, 0, 0, + 0, 0, 0, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 207, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 208, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 6, index 5 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 210, 0, 211, 0, 0, 0, 0, 0, 0, 0, 0, 388, 389, 390, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 213, 0, + 0, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 9, index 6 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 0, 0, 0, 0, + 216, 0, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 391, + 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 11, index 7 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 393, 0, 0, 0, 0, 0, 0, 0, 0, + 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 394, 395, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 396, 0, 0, 0, 0, 0, 0, 0, 102, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 12, index 8 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, + 0, 0, 398, 0, 0, 0, 103, 0, 0, 0, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, + 400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 13, index 9 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 401, 0, 0, 0, 0, 0, 0, 0, 104, + 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 403, 0, 0, 0, 0, 404, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 105, 0, 0, 224, 0, 0, 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 16, index 10 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 30, index 11 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 226, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 229, 0, 0, + 0, 0, 0, 0, 230, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 107, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 233, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 235, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 31, index 12 */ + 108, 109, 236, 237, 238, 239, 240, 241, 110, 111, 242, 243, 244, 245, + 246, 247, 112, 113, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 116, + 117, 248, 249, 250, 251, 252, 253, 118, 119, 254, 255, 256, 257, 258, + 259, 120, 121, 0, 0, 0, 0, 0, 0, 122, 123, 0, 0, 0, 0, 0, 0, 124, 125, 0, + 0, 0, 0, 0, 0, 126, 127, 0, 0, 0, 0, 0, 0, 128, 129, 0, 0, 0, 0, 0, 0, 0, + 130, 0, 0, 0, 0, 0, 0, 131, 132, 260, 261, 262, 263, 264, 265, 133, 134, + 266, 267, 268, 269, 270, 271, 272, 0, 0, 0, 273, 0, 0, 0, 0, 0, 0, 0, + 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 135, 0, 0, 0, + 0, 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 277, 0, 0, 0, 0, 0, 0, 0, 136, 0 + }, + { /* page 33, index 13 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 278, 0, 279, 0, 280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 0, 282, 0, + 283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 34, index 14 */ + 0, 0, 0, 284, 0, 0, 0, 0, 285, 0, 0, 286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, 288, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289, 0, 0, 0, 0, 0, 0, 290, + 0, 291, 0, 0, 292, 0, 0, 0, 0, 293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 294, 0, 0, 295, 296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 297, 298, 0, 0, 299, 300, 0, 0, 301, 302, 303, 304, 0, 0, 0, 0, + 305, 306, 0, 0, 307, 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 310, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 311, 0, 0, 0, 0, 0, 312, 313, 0, 314, + 0, 0, 0, 0, 0, 0, 315, 316, 317, 318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 48, index 15 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 319, 0, + 0, 0, 0, 320, 0, 321, 0, 322, 0, 323, 0, 324, 0, 325, 0, 326, 0, 327, 0, + 328, 0, 329, 0, 330, 0, 331, 0, 0, 332, 0, 333, 0, 334, 0, 0, 0, 0, 0, 0, + 137, 0, 0, 138, 0, 0, 139, 0, 0, 140, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, 387, + 0, 0, 335, 0, 0, 0, 0, 0, 0, 0, 0, 336, 0, 0, 0, 0, 337, 0, 338, 0, 339, + 0, 340, 0, 341, 0, 342, 0, 343, 0, 344, 0, 345, 0, 346, 0, 347, 0, 348, + 0, 0, 349, 0, 350, 0, 351, 0, 0, 0, 0, 0, 0, 142, 0, 0, 143, 0, 0, 144, + 0, 0, 145, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 352, 353, 354, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 356, 0, 0 + } +}; + +static const short compose_table[256] = { + 0 /* page 0 */, + 1 /* page 1 */, + 2 /* page 2 */, + 3 /* page 3 */, + 4 /* page 4 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 5 /* page 6 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 6 /* page 9 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 7 /* page 11 */, + 8 /* page 12 */, + 9 /* page 13 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 10 /* page 16 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 11 /* page 30 */, + 12 /* page 31 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 13 /* page 33 */, + 14 /* page 34 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 15 /* page 48 */ +}; + +static const gushort compose_first_single[][2] = { + { 0x0338, 0x226e }, + { 0x0338, 0x2260 }, + { 0x0338, 0x226f }, + { 0x0307, 0x1e1e }, + { 0x0302, 0x0134 }, + { 0x0307, 0x1e1f }, + { 0x0304, 0x01de }, + { 0x0301, 0x01fa }, + { 0x0301, 0x1e08 }, + { 0x0301, 0x1e2e }, + { 0x0304, 0x022a }, + { 0x0301, 0x01fe }, + { 0x0304, 0x01df }, + { 0x0301, 0x01fb }, + { 0x0301, 0x1e09 }, + { 0x0301, 0x1e2f }, + { 0x0304, 0x022b }, + { 0x0301, 0x01ff }, + { 0x0307, 0x1e64 }, + { 0x0307, 0x1e65 }, + { 0x0307, 0x1e66 }, + { 0x0307, 0x1e67 }, + { 0x0301, 0x1e78 }, + { 0x0301, 0x1e79 }, + { 0x0308, 0x1e7a }, + { 0x0308, 0x1e7b }, + { 0x0307, 0x1e9b }, + { 0x030c, 0x01ee }, + { 0x0304, 0x01ec }, + { 0x0304, 0x01ed }, + { 0x0304, 0x01e0 }, + { 0x0304, 0x01e1 }, + { 0x0306, 0x1e1c }, + { 0x0306, 0x1e1d }, + { 0x0304, 0x0230 }, + { 0x0304, 0x0231 }, + { 0x030c, 0x01ef }, + { 0x0314, 0x1fec }, + { 0x0345, 0x1fb4 }, + { 0x0345, 0x1fc4 }, + { 0x0345, 0x1ff4 }, + { 0x0308, 0x0407 }, + { 0x0301, 0x0403 }, + { 0x0308, 0x04de }, + { 0x0301, 0x040c }, + { 0x0308, 0x04e6 }, + { 0x0308, 0x04f4 }, + { 0x0308, 0x04f8 }, + { 0x0308, 0x04ec }, + { 0x0301, 0x0453 }, + { 0x0308, 0x04df }, + { 0x0301, 0x045c }, + { 0x0308, 0x04e7 }, + { 0x0308, 0x04f5 }, + { 0x0308, 0x04f9 }, + { 0x0308, 0x04ed }, + { 0x0308, 0x0457 }, + { 0x030f, 0x0476 }, + { 0x030f, 0x0477 }, + { 0x0308, 0x04da }, + { 0x0308, 0x04db }, + { 0x0308, 0x04ea }, + { 0x0308, 0x04eb }, + { 0x0654, 0x0624 }, + { 0x0654, 0x0626 }, + { 0x0654, 0x06c2 }, + { 0x0654, 0x06d3 }, + { 0x0654, 0x06c0 }, + { 0x093c, 0x0929 }, + { 0x093c, 0x0931 }, + { 0x093c, 0x0934 }, + { 0x0bd7, 0x0b94 }, + { 0x0bbe, 0x0bcb }, + { 0x0c56, 0x0c48 }, + { 0x0cd5, 0x0cc0 }, + { 0x0cd5, 0x0ccb }, + { 0x0d3e, 0x0d4b }, + { 0x0dca, 0x0ddd }, + { 0x102e, 0x1026 }, + { 0x0304, 0x1e38 }, + { 0x0304, 0x1e39 }, + { 0x0304, 0x1e5c }, + { 0x0304, 0x1e5d }, + { 0x0307, 0x1e68 }, + { 0x0307, 0x1e69 }, + { 0x0302, 0x1ec6 }, + { 0x0302, 0x1ec7 }, + { 0x0302, 0x1ed8 }, + { 0x0302, 0x1ed9 }, + { 0x0345, 0x1f82 }, + { 0x0345, 0x1f83 }, + { 0x0345, 0x1f84 }, + { 0x0345, 0x1f85 }, + { 0x0345, 0x1f86 }, + { 0x0345, 0x1f87 }, + { 0x0345, 0x1f8a }, + { 0x0345, 0x1f8b }, + { 0x0345, 0x1f8c }, + { 0x0345, 0x1f8d }, + { 0x0345, 0x1f8e }, + { 0x0345, 0x1f8f }, + { 0x0345, 0x1f92 }, + { 0x0345, 0x1f93 }, + { 0x0345, 0x1f94 }, + { 0x0345, 0x1f95 }, + { 0x0345, 0x1f96 }, + { 0x0345, 0x1f97 }, + { 0x0345, 0x1f9a }, + { 0x0345, 0x1f9b }, + { 0x0345, 0x1f9c }, + { 0x0345, 0x1f9d }, + { 0x0345, 0x1f9e }, + { 0x0345, 0x1f9f }, + { 0x0345, 0x1fa2 }, + { 0x0345, 0x1fa3 }, + { 0x0345, 0x1fa4 }, + { 0x0345, 0x1fa5 }, + { 0x0345, 0x1fa6 }, + { 0x0345, 0x1fa7 }, + { 0x0345, 0x1faa }, + { 0x0345, 0x1fab }, + { 0x0345, 0x1fac }, + { 0x0345, 0x1fad }, + { 0x0345, 0x1fae }, + { 0x0345, 0x1faf }, + { 0x0345, 0x1fb2 }, + { 0x0345, 0x1fc2 }, + { 0x0345, 0x1ff2 }, + { 0x0345, 0x1fb7 }, + { 0x0345, 0x1fc7 }, + { 0x0345, 0x1ff7 }, + { 0x0338, 0x219a }, + { 0x0338, 0x219b }, + { 0x0338, 0x21ae }, + { 0x0338, 0x21cd }, + { 0x0338, 0x21cf }, + { 0x0338, 0x21ce }, + { 0x0338, 0x2204 }, + { 0x0338, 0x2209 }, + { 0x0338, 0x220c }, + { 0x0338, 0x2224 }, + { 0x0338, 0x2226 }, + { 0x0338, 0x2241 }, + { 0x0338, 0x2244 }, + { 0x0338, 0x2247 }, + { 0x0338, 0x2249 }, + { 0x0338, 0x226d }, + { 0x0338, 0x2262 }, + { 0x0338, 0x2270 }, + { 0x0338, 0x2271 }, + { 0x0338, 0x2274 }, + { 0x0338, 0x2275 }, + { 0x0338, 0x2278 }, + { 0x0338, 0x2279 }, + { 0x0338, 0x2280 }, + { 0x0338, 0x2281 }, + { 0x0338, 0x22e0 }, + { 0x0338, 0x22e1 }, + { 0x0338, 0x2284 }, + { 0x0338, 0x2285 }, + { 0x0338, 0x2288 }, + { 0x0338, 0x2289 }, + { 0x0338, 0x22e2 }, + { 0x0338, 0x22e3 }, + { 0x0338, 0x22ac }, + { 0x0338, 0x22ad }, + { 0x0338, 0x22ae }, + { 0x0338, 0x22af }, + { 0x0338, 0x22ea }, + { 0x0338, 0x22eb }, + { 0x0338, 0x22ec }, + { 0x0338, 0x22ed }, + { 0x3099, 0x3094 }, + { 0x3099, 0x304c }, + { 0x3099, 0x304e }, + { 0x3099, 0x3050 }, + { 0x3099, 0x3052 }, + { 0x3099, 0x3054 }, + { 0x3099, 0x3056 }, + { 0x3099, 0x3058 }, + { 0x3099, 0x305a }, + { 0x3099, 0x305c }, + { 0x3099, 0x305e }, + { 0x3099, 0x3060 }, + { 0x3099, 0x3062 }, + { 0x3099, 0x3065 }, + { 0x3099, 0x3067 }, + { 0x3099, 0x3069 }, + { 0x3099, 0x309e }, + { 0x3099, 0x30f4 }, + { 0x3099, 0x30ac }, + { 0x3099, 0x30ae }, + { 0x3099, 0x30b0 }, + { 0x3099, 0x30b2 }, + { 0x3099, 0x30b4 }, + { 0x3099, 0x30b6 }, + { 0x3099, 0x30b8 }, + { 0x3099, 0x30ba }, + { 0x3099, 0x30bc }, + { 0x3099, 0x30be }, + { 0x3099, 0x30c0 }, + { 0x3099, 0x30c2 }, + { 0x3099, 0x30c5 }, + { 0x3099, 0x30c7 }, + { 0x3099, 0x30c9 }, + { 0x3099, 0x30f7 }, + { 0x3099, 0x30f8 }, + { 0x3099, 0x30f9 }, + { 0x3099, 0x30fa }, + { 0x3099, 0x30fe } +}; +static const gushort compose_second_single[][2] = { + { 0x0627, 0x0622 }, + { 0x0627, 0x0623 }, + { 0x0627, 0x0625 }, + { 0x09c7, 0x09cb }, + { 0x09c7, 0x09cc }, + { 0x0b47, 0x0b4b }, + { 0x0b47, 0x0b48 }, + { 0x0b47, 0x0b4c }, + { 0x0bc6, 0x0bca }, + { 0x0bc6, 0x0bcc }, + { 0x0cc6, 0x0cca }, + { 0x0cc6, 0x0cc7 }, + { 0x0cc6, 0x0cc8 }, + { 0x0d46, 0x0d4a }, + { 0x0d46, 0x0d4c }, + { 0x0dd9, 0x0dda }, + { 0x0dd9, 0x0ddc }, + { 0x0dd9, 0x0dde } +}; +static const gushort compose_array[146][31] = { + { 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x0100, 0x0102, 0x0226, 0x00c4, 0x1ea2, 0x00c5, 0, 0x01cd, 0x0200, 0x0202, 0, 0, 0, 0x1ea0, 0, 0x1e00, 0, 0, 0x0104, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e04, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e06, 0, 0, 0, 0 }, + { 0, 0x0106, 0x0108, 0, 0, 0, 0x010a, 0, 0, 0, 0, 0x010c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00c7, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e0a, 0, 0, 0, 0, 0x010e, 0, 0, 0, 0, 0, 0x1e0c, 0, 0, 0, 0x1e10, 0, 0x1e12, 0, 0, 0x1e0e, 0, 0, 0, 0 }, + { 0x00c8, 0x00c9, 0x00ca, 0x1ebc, 0x0112, 0x0114, 0x0116, 0x00cb, 0x1eba, 0, 0, 0x011a, 0x0204, 0x0206, 0, 0, 0, 0x1eb8, 0, 0, 0, 0x0228, 0x0118, 0x1e18, 0, 0x1e1a, 0, 0, 0, 0, 0 }, + { 0, 0x01f4, 0x011c, 0, 0x1e20, 0x011e, 0x0120, 0, 0, 0, 0, 0x01e6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0122, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0x0124, 0, 0, 0, 0x1e22, 0x1e26, 0, 0, 0, 0x021e, 0, 0, 0, 0, 0, 0x1e24, 0, 0, 0, 0x1e28, 0, 0, 0x1e2a, 0, 0, 0, 0, 0, 0 }, + { 0x00cc, 0x00cd, 0x00ce, 0x0128, 0x012a, 0x012c, 0x0130, 0x00cf, 0x1ec8, 0, 0, 0x01cf, 0x0208, 0x020a, 0, 0, 0, 0x1eca, 0, 0, 0, 0, 0x012e, 0, 0, 0x1e2c, 0, 0, 0, 0, 0 }, + { 0, 0x1e30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01e8, 0, 0, 0, 0, 0, 0x1e32, 0, 0, 0, 0x0136, 0, 0, 0, 0, 0x1e34, 0, 0, 0, 0 }, + { 0, 0x0139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x013d, 0, 0, 0, 0, 0, 0x1e36, 0, 0, 0, 0x013b, 0, 0x1e3c, 0, 0, 0x1e3a, 0, 0, 0, 0 }, + { 0, 0x1e3e, 0, 0, 0, 0, 0x1e40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x01f8, 0x0143, 0, 0x00d1, 0, 0, 0x1e44, 0, 0, 0, 0, 0x0147, 0, 0, 0, 0, 0, 0x1e46, 0, 0, 0, 0x0145, 0, 0x1e4a, 0, 0, 0x1e48, 0, 0, 0, 0 }, + { 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x014c, 0x014e, 0x022e, 0x00d6, 0x1ece, 0, 0x0150, 0x01d1, 0x020c, 0x020e, 0, 0, 0x01a0, 0x1ecc, 0, 0, 0, 0, 0x01ea, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x1e54, 0, 0, 0, 0, 0x1e56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x0154, 0, 0, 0, 0, 0x1e58, 0, 0, 0, 0, 0x0158, 0x0210, 0x0212, 0, 0, 0, 0x1e5a, 0, 0, 0, 0x0156, 0, 0, 0, 0, 0x1e5e, 0, 0, 0, 0 }, + { 0, 0x015a, 0x015c, 0, 0, 0, 0x1e60, 0, 0, 0, 0, 0x0160, 0, 0, 0, 0, 0, 0x1e62, 0, 0, 0x0218, 0x015e, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e6a, 0, 0, 0, 0, 0x0164, 0, 0, 0, 0, 0, 0x1e6c, 0, 0, 0x021a, 0x0162, 0, 0x1e70, 0, 0, 0x1e6e, 0, 0, 0, 0 }, + { 0x00d9, 0x00da, 0x00db, 0x0168, 0x016a, 0x016c, 0, 0x00dc, 0x1ee6, 0x016e, 0x0170, 0x01d3, 0x0214, 0x0216, 0, 0, 0x01af, 0x1ee4, 0x1e72, 0, 0, 0, 0x0172, 0x1e76, 0, 0x1e74, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0x1e7c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e7e, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1e80, 0x1e82, 0x0174, 0, 0, 0, 0x1e86, 0x1e84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e8a, 0x1e8c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ef2, 0x00dd, 0x0176, 0x1ef8, 0x0232, 0, 0x1e8e, 0x0178, 0x1ef6, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ef4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x0179, 0x1e90, 0, 0, 0, 0x017b, 0, 0, 0, 0, 0x017d, 0, 0, 0, 0, 0, 0x1e92, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e94, 0, 0, 0, 0 }, + { 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x0101, 0x0103, 0x0227, 0x00e4, 0x1ea3, 0x00e5, 0, 0x01ce, 0x0201, 0x0203, 0, 0, 0, 0x1ea1, 0, 0x1e01, 0, 0, 0x0105, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e03, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e05, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e07, 0, 0, 0, 0 }, + { 0, 0x0107, 0x0109, 0, 0, 0, 0x010b, 0, 0, 0, 0, 0x010d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00e7, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e0b, 0, 0, 0, 0, 0x010f, 0, 0, 0, 0, 0, 0x1e0d, 0, 0, 0, 0x1e11, 0, 0x1e13, 0, 0, 0x1e0f, 0, 0, 0, 0 }, + { 0x00e8, 0x00e9, 0x00ea, 0x1ebd, 0x0113, 0x0115, 0x0117, 0x00eb, 0x1ebb, 0, 0, 0x011b, 0x0205, 0x0207, 0, 0, 0, 0x1eb9, 0, 0, 0, 0x0229, 0x0119, 0x1e19, 0, 0x1e1b, 0, 0, 0, 0, 0 }, + { 0, 0x01f5, 0x011d, 0, 0x1e21, 0x011f, 0x0121, 0, 0, 0, 0, 0x01e7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0123, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0x0125, 0, 0, 0, 0x1e23, 0x1e27, 0, 0, 0, 0x021f, 0, 0, 0, 0, 0, 0x1e25, 0, 0, 0, 0x1e29, 0, 0, 0x1e2b, 0, 0x1e96, 0, 0, 0, 0 }, + { 0x00ec, 0x00ed, 0x00ee, 0x0129, 0x012b, 0x012d, 0, 0x00ef, 0x1ec9, 0, 0, 0x01d0, 0x0209, 0x020b, 0, 0, 0, 0x1ecb, 0, 0, 0, 0, 0x012f, 0, 0, 0x1e2d, 0, 0, 0, 0, 0 }, + { 0, 0, 0x0135, 0, 0, 0, 0, 0, 0, 0, 0, 0x01f0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x1e31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01e9, 0, 0, 0, 0, 0, 0x1e33, 0, 0, 0, 0x0137, 0, 0, 0, 0, 0x1e35, 0, 0, 0, 0 }, + { 0, 0x013a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x013e, 0, 0, 0, 0, 0, 0x1e37, 0, 0, 0, 0x013c, 0, 0x1e3d, 0, 0, 0x1e3b, 0, 0, 0, 0 }, + { 0, 0x1e3f, 0, 0, 0, 0, 0x1e41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x01f9, 0x0144, 0, 0x00f1, 0, 0, 0x1e45, 0, 0, 0, 0, 0x0148, 0, 0, 0, 0, 0, 0x1e47, 0, 0, 0, 0x0146, 0, 0x1e4b, 0, 0, 0x1e49, 0, 0, 0, 0 }, + { 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x014d, 0x014f, 0x022f, 0x00f6, 0x1ecf, 0, 0x0151, 0x01d2, 0x020d, 0x020f, 0, 0, 0x01a1, 0x1ecd, 0, 0, 0, 0, 0x01eb, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x1e55, 0, 0, 0, 0, 0x1e57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x0155, 0, 0, 0, 0, 0x1e59, 0, 0, 0, 0, 0x0159, 0x0211, 0x0213, 0, 0, 0, 0x1e5b, 0, 0, 0, 0x0157, 0, 0, 0, 0, 0x1e5f, 0, 0, 0, 0 }, + { 0, 0x015b, 0x015d, 0, 0, 0, 0x1e61, 0, 0, 0, 0, 0x0161, 0, 0, 0, 0, 0, 0x1e63, 0, 0, 0x0219, 0x015f, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e6b, 0x1e97, 0, 0, 0, 0x0165, 0, 0, 0, 0, 0, 0x1e6d, 0, 0, 0x021b, 0x0163, 0, 0x1e71, 0, 0, 0x1e6f, 0, 0, 0, 0 }, + { 0x00f9, 0x00fa, 0x00fb, 0x0169, 0x016b, 0x016d, 0, 0x00fc, 0x1ee7, 0x016f, 0x0171, 0x01d4, 0x0215, 0x0217, 0, 0, 0x01b0, 0x1ee5, 0x1e73, 0, 0, 0, 0x0173, 0x1e77, 0, 0x1e75, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0x1e7d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e7f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1e81, 0x1e83, 0x0175, 0, 0, 0, 0x1e87, 0x1e85, 0, 0x1e98, 0, 0, 0, 0, 0, 0, 0, 0x1e89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e8b, 0x1e8d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ef3, 0x00fd, 0x0177, 0x1ef9, 0x0233, 0, 0x1e8f, 0x00ff, 0x1ef7, 0x1e99, 0, 0, 0, 0, 0, 0, 0, 0x1ef5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x017a, 0x1e91, 0, 0, 0, 0x017c, 0, 0, 0, 0, 0x017e, 0, 0, 0, 0, 0, 0x1e93, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e95, 0, 0, 0, 0 }, + { 0x1fed, 0x0385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fc1, 0, 0, 0 }, + { 0x1ea6, 0x1ea4, 0, 0x1eaa, 0, 0, 0, 0, 0x1ea8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x01fc, 0, 0, 0x01e2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ec0, 0x1ebe, 0, 0x1ec4, 0, 0, 0, 0, 0x1ec2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ed2, 0x1ed0, 0, 0x1ed6, 0, 0, 0, 0, 0x1ed4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x1e4c, 0, 0, 0x022c, 0, 0, 0x1e4e, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x01db, 0x01d7, 0, 0, 0x01d5, 0, 0, 0, 0, 0, 0, 0x01d9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ea7, 0x1ea5, 0, 0x1eab, 0, 0, 0, 0, 0x1ea9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x01fd, 0, 0, 0x01e3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ec1, 0x1ebf, 0, 0x1ec5, 0, 0, 0, 0, 0x1ec3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ed3, 0x1ed1, 0, 0x1ed7, 0, 0, 0, 0, 0x1ed5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x1e4d, 0, 0, 0x022d, 0, 0, 0x1e4f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x01dc, 0x01d8, 0, 0, 0x01d6, 0, 0, 0, 0, 0, 0, 0x01da, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1eb0, 0x1eae, 0, 0x1eb4, 0, 0, 0, 0, 0x1eb2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1eb1, 0x1eaf, 0, 0x1eb5, 0, 0, 0, 0, 0x1eb3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1e14, 0x1e16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1e15, 0x1e17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1e50, 0x1e52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1e51, 0x1e53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1edc, 0x1eda, 0, 0x1ee0, 0, 0, 0, 0, 0x1ede, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ee2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1edd, 0x1edb, 0, 0x1ee1, 0, 0, 0, 0, 0x1edf, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ee3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1eea, 0x1ee8, 0, 0x1eee, 0, 0, 0, 0, 0x1eec, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ef0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1eeb, 0x1ee9, 0, 0x1eef, 0, 0, 0, 0, 0x1eed, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ef1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1fba, 0x0386, 0, 0, 0x1fb9, 0x1fb8, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f08, 0x1f09, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fbc, 0, 0 }, + { 0x1fc8, 0x0388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f18, 0x1f19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1fca, 0x0389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f28, 0x1f29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fcc, 0, 0 }, + { 0x1fda, 0x038a, 0, 0, 0x1fd9, 0x1fd8, 0, 0x03aa, 0, 0, 0, 0, 0, 0, 0x1f38, 0x1f39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ff8, 0x038c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f48, 0x1f49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1fea, 0x038e, 0, 0, 0x1fe9, 0x1fe8, 0, 0x03ab, 0, 0, 0, 0, 0, 0, 0, 0x1f59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ffa, 0x038f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f68, 0x1f69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ffc, 0, 0 }, + { 0x1f70, 0x03ac, 0, 0, 0x1fb1, 0x1fb0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f00, 0x1f01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fb6, 0x1fb3, 0, 0 }, + { 0x1f72, 0x03ad, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f10, 0x1f11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f74, 0x03ae, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f20, 0x1f21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fc6, 0x1fc3, 0, 0 }, + { 0x1f76, 0x03af, 0, 0, 0x1fd1, 0x1fd0, 0, 0x03ca, 0, 0, 0, 0, 0, 0, 0x1f30, 0x1f31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fd6, 0, 0, 0 }, + { 0x1f78, 0x03cc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f40, 0x1f41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fe4, 0x1fe5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f7a, 0x03cd, 0, 0, 0x1fe1, 0x1fe0, 0, 0x03cb, 0, 0, 0, 0, 0, 0, 0x1f50, 0x1f51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fe6, 0, 0, 0 }, + { 0x1f7c, 0x03ce, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f60, 0x1f61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ff6, 0x1ff3, 0, 0 }, + { 0x1fd2, 0x0390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fd7, 0, 0, 0 }, + { 0x1fe2, 0x03b0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fe7, 0, 0, 0 }, + { 0, 0x03d3, 0, 0, 0, 0, 0, 0x03d4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0x04d0, 0, 0x04d2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x0400, 0, 0, 0, 0, 0x04d6, 0, 0x0401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0x04c1, 0, 0x04dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x040d, 0, 0, 0, 0x04e2, 0x0419, 0, 0x04e4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0x04ee, 0x040e, 0, 0x04f0, 0, 0, 0x04f2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0x04d1, 0, 0x04d3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x0450, 0, 0, 0, 0, 0x04d7, 0, 0x0451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0x04c2, 0, 0x04dd, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x045d, 0, 0, 0, 0x04e3, 0x0439, 0, 0x04e5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0x04ef, 0x045e, 0, 0x04f1, 0, 0, 0x04f3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0x1eac, 0, 0, 0x1eb6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0x1ead, 0, 0, 0x1eb7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f02, 0x1f04, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f06, 0x1f80, 0, 0 }, + { 0x1f03, 0x1f05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f07, 0x1f81, 0, 0 }, + { 0x1f0a, 0x1f0c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f0e, 0x1f88, 0, 0 }, + { 0x1f0b, 0x1f0d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f0f, 0x1f89, 0, 0 }, + { 0x1f12, 0x1f14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f13, 0x1f15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f1a, 0x1f1c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f1b, 0x1f1d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f22, 0x1f24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f26, 0x1f90, 0, 0 }, + { 0x1f23, 0x1f25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f27, 0x1f91, 0, 0 }, + { 0x1f2a, 0x1f2c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f2e, 0x1f98, 0, 0 }, + { 0x1f2b, 0x1f2d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f2f, 0x1f99, 0, 0 }, + { 0x1f32, 0x1f34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f36, 0, 0, 0 }, + { 0x1f33, 0x1f35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f37, 0, 0, 0 }, + { 0x1f3a, 0x1f3c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f3e, 0, 0, 0 }, + { 0x1f3b, 0x1f3d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f3f, 0, 0, 0 }, + { 0x1f42, 0x1f44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f43, 0x1f45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f4a, 0x1f4c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f4b, 0x1f4d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f52, 0x1f54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f56, 0, 0, 0 }, + { 0x1f53, 0x1f55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f57, 0, 0, 0 }, + { 0x1f5b, 0x1f5d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f5f, 0, 0, 0 }, + { 0x1f62, 0x1f64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f66, 0x1fa0, 0, 0 }, + { 0x1f63, 0x1f65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f67, 0x1fa1, 0, 0 }, + { 0x1f6a, 0x1f6c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f6e, 0x1fa8, 0, 0 }, + { 0x1f6b, 0x1f6d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f6f, 0x1fa9, 0, 0 }, + { 0x1fcd, 0x1fce, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fcf, 0, 0, 0 }, + { 0x1fdd, 0x1fde, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fdf, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3070, 0x3071 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3073, 0x3074 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3076, 0x3077 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3079, 0x307a }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x307c, 0x307d }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d0, 0x30d1 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d3, 0x30d4 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d6, 0x30d7 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d9, 0x30da }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30dc, 0x30dd } +}; diff --git a/lib/gunidecomp.h b/lib/gunidecomp.h new file mode 100644 index 0000000..efa8041 --- /dev/null +++ b/lib/gunidecomp.h @@ -0,0 +1,6972 @@ +/* This file is automatically generated. DO NOT EDIT! */ + +#ifndef DECOMP_H +#define DECOMP_H + +#define G_UNICODE_LAST_CHAR 0xffff + +#define G_UNICODE_MAX_TABLE_INDEX 1000 + +static const unsigned char cclass_data[][256] = { + { /* page 3, index 0 */ + 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 232, 220, 220, 220, 220, 232, 216, + 220, 220, 220, 220, 220, 202, 202, 220, 220, 220, 220, 202, 202, 220, + 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 1, 1, 1, 1, 1, 220, + 220, 220, 220, 230, 230, 230, 230, 230, 230, 230, 230, 240, 230, 220, + 220, 220, 230, 230, 230, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 234, 234, 233, 230, 230, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 + }, + { /* page 4, index 1 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 5, index 2 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 220, 230, 230, 230, 230, 220, 230, 230, 230, 222, 220, 230, 230, 230, + 230, 230, 230, 0, 220, 220, 220, 220, 220, 230, 230, 220, 230, 230, 222, + 228, 230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 20, 21, 22, 0, 23, + 0, 24, 25, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 6, index 3 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 230, 230, 220, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 230, 230, 230, 230, 230, 230, 230, 0, 0, 230, 230, 230, 230, 220, + 230, 0, 0, 230, 230, 0, 220, 230, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 7, index 4 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 220, 230, 230, 220, 230, 230, 220, 220, 220, 230, 220, 220, 230, + 220, 230, 230, 230, 220, 230, 220, 230, 220, 230, 220, 230, 230, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 9, index 5 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 230, 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 10, index 6 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 11, index 7 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 12, index 8 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 84, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 13, index 9 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 14, index 10 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 103, 103, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 118, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 122, 122, 122, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 15, index 11 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 220, 0, 220, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, + 132, 0, 0, 0, 0, 0, 130, 130, 130, 130, 0, 0, 130, 0, 230, 230, 9, 0, + 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 + }, + { /* page 16, index 12 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 23, index 13 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 24, index 14 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 32, index 15 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 1, 1, 230, 230, + 230, 230, 1, 1, 1, 230, 230, 0, 0, 0, 0, 230, 0, 0, 0, 1, 1, 230, 220, + 230, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 48, index 16 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 228, 232, 222, + 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 251, index 17 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 254, index 18 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + } +}; + +static const short combining_class_table[256] = { + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 /* page 3 */, + 1 /* page 4 */, + 2 /* page 5 */, + 3 /* page 6 */, + 4 /* page 7 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 5 /* page 9 */, + 6 /* page 10 */, + 7 /* page 11 */, + 8 /* page 12 */, + 9 /* page 13 */, + 10 /* page 14 */, + 11 /* page 15 */, + 12 /* page 16 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 13 /* page 23 */, + 14 /* page 24 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 15 /* page 32 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 16 /* page 48 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 17 /* page 251 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 18 /* page 254 */, + 0 + G_UNICODE_MAX_TABLE_INDEX +}; + +typedef struct +{ + unsigned short ch; + unsigned char canon_offset; + unsigned char compat_offset; + unsigned short expansion_offset; +} decomposition; + +static const decomposition decomp_table[] = +{ + { 0x00a0, 255, 0, 0 }, + { 0x00a8, 255, 0, 4 }, + { 0x00aa, 255, 0, 10 }, + { 0x00af, 255, 0, 14 }, + { 0x00b2, 255, 0, 20 }, + { 0x00b3, 255, 0, 24 }, + { 0x00b4, 255, 0, 28 }, + { 0x00b5, 255, 0, 34 }, + { 0x00b8, 255, 0, 38 }, + { 0x00b9, 255, 0, 44 }, + { 0x00ba, 255, 0, 48 }, + { 0x00bc, 255, 0, 52 }, + { 0x00bd, 255, 0, 60 }, + { 0x00be, 255, 0, 68 }, + { 0x00c0, 0, 255, 76 }, + { 0x00c1, 0, 255, 82 }, + { 0x00c2, 0, 255, 88 }, + { 0x00c3, 0, 255, 94 }, + { 0x00c4, 0, 255, 100 }, + { 0x00c5, 0, 255, 106 }, + { 0x00c7, 0, 255, 112 }, + { 0x00c8, 0, 255, 118 }, + { 0x00c9, 0, 255, 124 }, + { 0x00ca, 0, 255, 130 }, + { 0x00cb, 0, 255, 136 }, + { 0x00cc, 0, 255, 142 }, + { 0x00cd, 0, 255, 148 }, + { 0x00ce, 0, 255, 154 }, + { 0x00cf, 0, 255, 160 }, + { 0x00d1, 0, 255, 166 }, + { 0x00d2, 0, 255, 172 }, + { 0x00d3, 0, 255, 178 }, + { 0x00d4, 0, 255, 184 }, + { 0x00d5, 0, 255, 190 }, + { 0x00d6, 0, 255, 196 }, + { 0x00d9, 0, 255, 202 }, + { 0x00da, 0, 255, 208 }, + { 0x00db, 0, 255, 214 }, + { 0x00dc, 0, 255, 220 }, + { 0x00dd, 0, 255, 226 }, + { 0x00e0, 0, 255, 232 }, + { 0x00e1, 0, 255, 238 }, + { 0x00e2, 0, 255, 244 }, + { 0x00e3, 0, 255, 250 }, + { 0x00e4, 0, 255, 256 }, + { 0x00e5, 0, 255, 262 }, + { 0x00e7, 0, 255, 268 }, + { 0x00e8, 0, 255, 274 }, + { 0x00e9, 0, 255, 280 }, + { 0x00ea, 0, 255, 286 }, + { 0x00eb, 0, 255, 292 }, + { 0x00ec, 0, 255, 298 }, + { 0x00ed, 0, 255, 304 }, + { 0x00ee, 0, 255, 310 }, + { 0x00ef, 0, 255, 316 }, + { 0x00f1, 0, 255, 322 }, + { 0x00f2, 0, 255, 328 }, + { 0x00f3, 0, 255, 334 }, + { 0x00f4, 0, 255, 340 }, + { 0x00f5, 0, 255, 346 }, + { 0x00f6, 0, 255, 352 }, + { 0x00f9, 0, 255, 358 }, + { 0x00fa, 0, 255, 364 }, + { 0x00fb, 0, 255, 370 }, + { 0x00fc, 0, 255, 376 }, + { 0x00fd, 0, 255, 382 }, + { 0x00ff, 0, 255, 388 }, + { 0x0100, 0, 255, 394 }, + { 0x0101, 0, 255, 400 }, + { 0x0102, 0, 255, 406 }, + { 0x0103, 0, 255, 412 }, + { 0x0104, 0, 255, 418 }, + { 0x0105, 0, 255, 424 }, + { 0x0106, 0, 255, 430 }, + { 0x0107, 0, 255, 436 }, + { 0x0108, 0, 255, 442 }, + { 0x0109, 0, 255, 448 }, + { 0x010a, 0, 255, 454 }, + { 0x010b, 0, 255, 460 }, + { 0x010c, 0, 255, 466 }, + { 0x010d, 0, 255, 472 }, + { 0x010e, 0, 255, 478 }, + { 0x010f, 0, 255, 484 }, + { 0x0112, 0, 255, 490 }, + { 0x0113, 0, 255, 496 }, + { 0x0114, 0, 255, 502 }, + { 0x0115, 0, 255, 508 }, + { 0x0116, 0, 255, 514 }, + { 0x0117, 0, 255, 520 }, + { 0x0118, 0, 255, 526 }, + { 0x0119, 0, 255, 532 }, + { 0x011a, 0, 255, 538 }, + { 0x011b, 0, 255, 544 }, + { 0x011c, 0, 255, 550 }, + { 0x011d, 0, 255, 556 }, + { 0x011e, 0, 255, 562 }, + { 0x011f, 0, 255, 568 }, + { 0x0120, 0, 255, 574 }, + { 0x0121, 0, 255, 580 }, + { 0x0122, 0, 255, 586 }, + { 0x0123, 0, 255, 592 }, + { 0x0124, 0, 255, 598 }, + { 0x0125, 0, 255, 604 }, + { 0x0128, 0, 255, 610 }, + { 0x0129, 0, 255, 616 }, + { 0x012a, 0, 255, 622 }, + { 0x012b, 0, 255, 628 }, + { 0x012c, 0, 255, 634 }, + { 0x012d, 0, 255, 640 }, + { 0x012e, 0, 255, 646 }, + { 0x012f, 0, 255, 652 }, + { 0x0130, 0, 255, 658 }, + { 0x0132, 255, 0, 664 }, + { 0x0133, 255, 0, 670 }, + { 0x0134, 0, 255, 676 }, + { 0x0135, 0, 255, 682 }, + { 0x0136, 0, 255, 688 }, + { 0x0137, 0, 255, 694 }, + { 0x0139, 0, 255, 700 }, + { 0x013a, 0, 255, 706 }, + { 0x013b, 0, 255, 712 }, + { 0x013c, 0, 255, 718 }, + { 0x013d, 0, 255, 724 }, + { 0x013e, 0, 255, 730 }, + { 0x013f, 255, 0, 736 }, + { 0x0140, 255, 0, 742 }, + { 0x0143, 0, 255, 748 }, + { 0x0144, 0, 255, 754 }, + { 0x0145, 0, 255, 760 }, + { 0x0146, 0, 255, 766 }, + { 0x0147, 0, 255, 772 }, + { 0x0148, 0, 255, 778 }, + { 0x0149, 255, 0, 784 }, + { 0x014c, 0, 255, 790 }, + { 0x014d, 0, 255, 796 }, + { 0x014e, 0, 255, 802 }, + { 0x014f, 0, 255, 808 }, + { 0x0150, 0, 255, 814 }, + { 0x0151, 0, 255, 820 }, + { 0x0154, 0, 255, 826 }, + { 0x0155, 0, 255, 832 }, + { 0x0156, 0, 255, 838 }, + { 0x0157, 0, 255, 844 }, + { 0x0158, 0, 255, 850 }, + { 0x0159, 0, 255, 856 }, + { 0x015a, 0, 255, 862 }, + { 0x015b, 0, 255, 868 }, + { 0x015c, 0, 255, 874 }, + { 0x015d, 0, 255, 880 }, + { 0x015e, 0, 255, 886 }, + { 0x015f, 0, 255, 892 }, + { 0x0160, 0, 255, 898 }, + { 0x0161, 0, 255, 904 }, + { 0x0162, 0, 255, 910 }, + { 0x0163, 0, 255, 916 }, + { 0x0164, 0, 255, 922 }, + { 0x0165, 0, 255, 928 }, + { 0x0168, 0, 255, 934 }, + { 0x0169, 0, 255, 940 }, + { 0x016a, 0, 255, 946 }, + { 0x016b, 0, 255, 952 }, + { 0x016c, 0, 255, 958 }, + { 0x016d, 0, 255, 964 }, + { 0x016e, 0, 255, 970 }, + { 0x016f, 0, 255, 976 }, + { 0x0170, 0, 255, 982 }, + { 0x0171, 0, 255, 988 }, + { 0x0172, 0, 255, 994 }, + { 0x0173, 0, 255, 1000 }, + { 0x0174, 0, 255, 1006 }, + { 0x0175, 0, 255, 1012 }, + { 0x0176, 0, 255, 1018 }, + { 0x0177, 0, 255, 1024 }, + { 0x0178, 0, 255, 1030 }, + { 0x0179, 0, 255, 1036 }, + { 0x017a, 0, 255, 1042 }, + { 0x017b, 0, 255, 1048 }, + { 0x017c, 0, 255, 1054 }, + { 0x017d, 0, 255, 1060 }, + { 0x017e, 0, 255, 1066 }, + { 0x017f, 255, 0, 1072 }, + { 0x01a0, 0, 255, 1076 }, + { 0x01a1, 0, 255, 1082 }, + { 0x01af, 0, 255, 1088 }, + { 0x01b0, 0, 255, 1094 }, + { 0x01c4, 255, 0, 1100 }, + { 0x01c5, 255, 0, 1108 }, + { 0x01c6, 255, 0, 1116 }, + { 0x01c7, 255, 0, 1124 }, + { 0x01c8, 255, 0, 1130 }, + { 0x01c9, 255, 0, 1136 }, + { 0x01ca, 255, 0, 1142 }, + { 0x01cb, 255, 0, 1148 }, + { 0x01cc, 255, 0, 1154 }, + { 0x01cd, 0, 255, 1160 }, + { 0x01ce, 0, 255, 1166 }, + { 0x01cf, 0, 255, 1172 }, + { 0x01d0, 0, 255, 1178 }, + { 0x01d1, 0, 255, 1184 }, + { 0x01d2, 0, 255, 1190 }, + { 0x01d3, 0, 255, 1196 }, + { 0x01d4, 0, 255, 1202 }, + { 0x01d5, 0, 255, 1208 }, + { 0x01d6, 0, 255, 1216 }, + { 0x01d7, 0, 255, 1224 }, + { 0x01d8, 0, 255, 1232 }, + { 0x01d9, 0, 255, 1240 }, + { 0x01da, 0, 255, 1248 }, + { 0x01db, 0, 255, 1256 }, + { 0x01dc, 0, 255, 1264 }, + { 0x01de, 0, 255, 1272 }, + { 0x01df, 0, 255, 1280 }, + { 0x01e0, 0, 255, 1288 }, + { 0x01e1, 0, 255, 1296 }, + { 0x01e2, 0, 255, 1304 }, + { 0x01e3, 0, 255, 1310 }, + { 0x01e6, 0, 255, 1316 }, + { 0x01e7, 0, 255, 1322 }, + { 0x01e8, 0, 255, 1328 }, + { 0x01e9, 0, 255, 1334 }, + { 0x01ea, 0, 255, 1340 }, + { 0x01eb, 0, 255, 1346 }, + { 0x01ec, 0, 255, 1352 }, + { 0x01ed, 0, 255, 1360 }, + { 0x01ee, 0, 255, 1368 }, + { 0x01ef, 0, 255, 1374 }, + { 0x01f0, 0, 255, 1380 }, + { 0x01f1, 255, 0, 1386 }, + { 0x01f2, 255, 0, 1392 }, + { 0x01f3, 255, 0, 1398 }, + { 0x01f4, 0, 255, 1404 }, + { 0x01f5, 0, 255, 1410 }, + { 0x01f8, 0, 255, 1416 }, + { 0x01f9, 0, 255, 1422 }, + { 0x01fa, 0, 255, 1428 }, + { 0x01fb, 0, 255, 1436 }, + { 0x01fc, 0, 255, 1444 }, + { 0x01fd, 0, 255, 1450 }, + { 0x01fe, 0, 255, 1456 }, + { 0x01ff, 0, 255, 1462 }, + { 0x0200, 0, 255, 1468 }, + { 0x0201, 0, 255, 1474 }, + { 0x0202, 0, 255, 1480 }, + { 0x0203, 0, 255, 1486 }, + { 0x0204, 0, 255, 1492 }, + { 0x0205, 0, 255, 1498 }, + { 0x0206, 0, 255, 1504 }, + { 0x0207, 0, 255, 1510 }, + { 0x0208, 0, 255, 1516 }, + { 0x0209, 0, 255, 1522 }, + { 0x020a, 0, 255, 1528 }, + { 0x020b, 0, 255, 1534 }, + { 0x020c, 0, 255, 1540 }, + { 0x020d, 0, 255, 1546 }, + { 0x020e, 0, 255, 1552 }, + { 0x020f, 0, 255, 1558 }, + { 0x0210, 0, 255, 1564 }, + { 0x0211, 0, 255, 1570 }, + { 0x0212, 0, 255, 1576 }, + { 0x0213, 0, 255, 1582 }, + { 0x0214, 0, 255, 1588 }, + { 0x0215, 0, 255, 1594 }, + { 0x0216, 0, 255, 1600 }, + { 0x0217, 0, 255, 1606 }, + { 0x0218, 0, 255, 1612 }, + { 0x0219, 0, 255, 1618 }, + { 0x021a, 0, 255, 1624 }, + { 0x021b, 0, 255, 1630 }, + { 0x021e, 0, 255, 1636 }, + { 0x021f, 0, 255, 1642 }, + { 0x0226, 0, 255, 1648 }, + { 0x0227, 0, 255, 1654 }, + { 0x0228, 0, 255, 1660 }, + { 0x0229, 0, 255, 1666 }, + { 0x022a, 0, 255, 1672 }, + { 0x022b, 0, 255, 1680 }, + { 0x022c, 0, 255, 1688 }, + { 0x022d, 0, 255, 1696 }, + { 0x022e, 0, 255, 1704 }, + { 0x022f, 0, 255, 1710 }, + { 0x0230, 0, 255, 1716 }, + { 0x0231, 0, 255, 1724 }, + { 0x0232, 0, 255, 1732 }, + { 0x0233, 0, 255, 1738 }, + { 0x02b0, 255, 0, 1744 }, + { 0x02b1, 255, 0, 1748 }, + { 0x02b2, 255, 0, 1752 }, + { 0x02b3, 255, 0, 1756 }, + { 0x02b4, 255, 0, 1760 }, + { 0x02b5, 255, 0, 1764 }, + { 0x02b6, 255, 0, 1768 }, + { 0x02b7, 255, 0, 1772 }, + { 0x02b8, 255, 0, 1776 }, + { 0x02d8, 255, 0, 1780 }, + { 0x02d9, 255, 0, 1786 }, + { 0x02da, 255, 0, 1792 }, + { 0x02db, 255, 0, 1798 }, + { 0x02dc, 255, 0, 1804 }, + { 0x02dd, 255, 0, 1810 }, + { 0x02e0, 255, 0, 1816 }, + { 0x02e1, 255, 0, 1820 }, + { 0x02e2, 255, 0, 1072 }, + { 0x02e3, 255, 0, 1824 }, + { 0x02e4, 255, 0, 1828 }, + { 0x0340, 0, 255, 1832 }, + { 0x0341, 0, 255, 1836 }, + { 0x0343, 0, 255, 1840 }, + { 0x0344, 0, 255, 1844 }, + { 0x0374, 0, 255, 1850 }, + { 0x037a, 255, 0, 1854 }, + { 0x037e, 0, 255, 1860 }, + { 0x0384, 255, 0, 28 }, + { 0x0385, 0, 6, 1864 }, + { 0x0386, 0, 255, 1878 }, + { 0x0387, 0, 255, 1884 }, + { 0x0388, 0, 255, 1888 }, + { 0x0389, 0, 255, 1894 }, + { 0x038a, 0, 255, 1900 }, + { 0x038c, 0, 255, 1906 }, + { 0x038e, 0, 255, 1912 }, + { 0x038f, 0, 255, 1918 }, + { 0x0390, 0, 255, 1924 }, + { 0x03aa, 0, 255, 1932 }, + { 0x03ab, 0, 255, 1938 }, + { 0x03ac, 0, 255, 1944 }, + { 0x03ad, 0, 255, 1950 }, + { 0x03ae, 0, 255, 1956 }, + { 0x03af, 0, 255, 1962 }, + { 0x03b0, 0, 255, 1968 }, + { 0x03ca, 0, 255, 1976 }, + { 0x03cb, 0, 255, 1982 }, + { 0x03cc, 0, 255, 1988 }, + { 0x03cd, 0, 255, 1994 }, + { 0x03ce, 0, 255, 2000 }, + { 0x03d0, 255, 0, 2006 }, + { 0x03d1, 255, 0, 2010 }, + { 0x03d2, 255, 0, 2014 }, + { 0x03d3, 0, 6, 2018 }, + { 0x03d4, 0, 6, 2030 }, + { 0x03d5, 255, 0, 2042 }, + { 0x03d6, 255, 0, 2046 }, + { 0x03f0, 255, 0, 2050 }, + { 0x03f1, 255, 0, 2054 }, + { 0x03f2, 255, 0, 2058 }, + { 0x03f4, 255, 0, 2062 }, + { 0x03f5, 255, 0, 2066 }, + { 0x0400, 0, 255, 2070 }, + { 0x0401, 0, 255, 2076 }, + { 0x0403, 0, 255, 2082 }, + { 0x0407, 0, 255, 2088 }, + { 0x040c, 0, 255, 2094 }, + { 0x040d, 0, 255, 2100 }, + { 0x040e, 0, 255, 2106 }, + { 0x0419, 0, 255, 2112 }, + { 0x0439, 0, 255, 2118 }, + { 0x0450, 0, 255, 2124 }, + { 0x0451, 0, 255, 2130 }, + { 0x0453, 0, 255, 2136 }, + { 0x0457, 0, 255, 2142 }, + { 0x045c, 0, 255, 2148 }, + { 0x045d, 0, 255, 2154 }, + { 0x045e, 0, 255, 2160 }, + { 0x0476, 0, 255, 2166 }, + { 0x0477, 0, 255, 2172 }, + { 0x04c1, 0, 255, 2178 }, + { 0x04c2, 0, 255, 2184 }, + { 0x04d0, 0, 255, 2190 }, + { 0x04d1, 0, 255, 2196 }, + { 0x04d2, 0, 255, 2202 }, + { 0x04d3, 0, 255, 2208 }, + { 0x04d6, 0, 255, 2214 }, + { 0x04d7, 0, 255, 2220 }, + { 0x04da, 0, 255, 2226 }, + { 0x04db, 0, 255, 2232 }, + { 0x04dc, 0, 255, 2238 }, + { 0x04dd, 0, 255, 2244 }, + { 0x04de, 0, 255, 2250 }, + { 0x04df, 0, 255, 2256 }, + { 0x04e2, 0, 255, 2262 }, + { 0x04e3, 0, 255, 2268 }, + { 0x04e4, 0, 255, 2274 }, + { 0x04e5, 0, 255, 2280 }, + { 0x04e6, 0, 255, 2286 }, + { 0x04e7, 0, 255, 2292 }, + { 0x04ea, 0, 255, 2298 }, + { 0x04eb, 0, 255, 2304 }, + { 0x04ec, 0, 255, 2310 }, + { 0x04ed, 0, 255, 2316 }, + { 0x04ee, 0, 255, 2322 }, + { 0x04ef, 0, 255, 2328 }, + { 0x04f0, 0, 255, 2334 }, + { 0x04f1, 0, 255, 2340 }, + { 0x04f2, 0, 255, 2346 }, + { 0x04f3, 0, 255, 2352 }, + { 0x04f4, 0, 255, 2358 }, + { 0x04f5, 0, 255, 2364 }, + { 0x04f8, 0, 255, 2370 }, + { 0x04f9, 0, 255, 2376 }, + { 0x0587, 255, 0, 2382 }, + { 0x0622, 0, 255, 2388 }, + { 0x0623, 0, 255, 2394 }, + { 0x0624, 0, 255, 2400 }, + { 0x0625, 0, 255, 2406 }, + { 0x0626, 0, 255, 2412 }, + { 0x0675, 255, 0, 2418 }, + { 0x0676, 255, 0, 2424 }, + { 0x0677, 255, 0, 2430 }, + { 0x0678, 255, 0, 2436 }, + { 0x06c0, 0, 255, 2442 }, + { 0x06c2, 0, 255, 2448 }, + { 0x06d3, 0, 255, 2454 }, + { 0x0929, 0, 255, 2460 }, + { 0x0931, 0, 255, 2466 }, + { 0x0934, 0, 255, 2472 }, + { 0x0958, 0, 255, 2478 }, + { 0x0959, 0, 255, 2484 }, + { 0x095a, 0, 255, 2490 }, + { 0x095b, 0, 255, 2496 }, + { 0x095c, 0, 255, 2502 }, + { 0x095d, 0, 255, 2508 }, + { 0x095e, 0, 255, 2514 }, + { 0x095f, 0, 255, 2520 }, + { 0x09cb, 0, 255, 2526 }, + { 0x09cc, 0, 255, 2532 }, + { 0x09dc, 0, 255, 2538 }, + { 0x09dd, 0, 255, 2544 }, + { 0x09df, 0, 255, 2550 }, + { 0x0a33, 0, 255, 2556 }, + { 0x0a36, 0, 255, 2562 }, + { 0x0a59, 0, 255, 2568 }, + { 0x0a5a, 0, 255, 2574 }, + { 0x0a5b, 0, 255, 2580 }, + { 0x0a5e, 0, 255, 2586 }, + { 0x0b48, 0, 255, 2592 }, + { 0x0b4b, 0, 255, 2598 }, + { 0x0b4c, 0, 255, 2604 }, + { 0x0b5c, 0, 255, 2610 }, + { 0x0b5d, 0, 255, 2616 }, + { 0x0b94, 0, 255, 2622 }, + { 0x0bca, 0, 255, 2628 }, + { 0x0bcb, 0, 255, 2634 }, + { 0x0bcc, 0, 255, 2640 }, + { 0x0c48, 0, 255, 2646 }, + { 0x0cc0, 0, 255, 2652 }, + { 0x0cc7, 0, 255, 2658 }, + { 0x0cc8, 0, 255, 2664 }, + { 0x0cca, 0, 255, 2670 }, + { 0x0ccb, 0, 255, 2676 }, + { 0x0d4a, 0, 255, 2684 }, + { 0x0d4b, 0, 255, 2690 }, + { 0x0d4c, 0, 255, 2696 }, + { 0x0dda, 0, 255, 2702 }, + { 0x0ddc, 0, 255, 2708 }, + { 0x0ddd, 0, 255, 2714 }, + { 0x0dde, 0, 255, 2722 }, + { 0x0e33, 255, 0, 2728 }, + { 0x0eb3, 255, 0, 2734 }, + { 0x0edc, 255, 0, 2740 }, + { 0x0edd, 255, 0, 2746 }, + { 0x0f0c, 255, 0, 2752 }, + { 0x0f43, 0, 255, 2756 }, + { 0x0f4d, 0, 255, 2762 }, + { 0x0f52, 0, 255, 2768 }, + { 0x0f57, 0, 255, 2774 }, + { 0x0f5c, 0, 255, 2780 }, + { 0x0f69, 0, 255, 2786 }, + { 0x0f73, 0, 255, 2792 }, + { 0x0f75, 0, 255, 2798 }, + { 0x0f76, 0, 255, 2804 }, + { 0x0f77, 255, 0, 2810 }, + { 0x0f78, 0, 255, 2818 }, + { 0x0f79, 255, 0, 2824 }, + { 0x0f81, 0, 255, 2832 }, + { 0x0f93, 0, 255, 2838 }, + { 0x0f9d, 0, 255, 2844 }, + { 0x0fa2, 0, 255, 2850 }, + { 0x0fa7, 0, 255, 2856 }, + { 0x0fac, 0, 255, 2862 }, + { 0x0fb9, 0, 255, 2868 }, + { 0x1026, 0, 255, 2874 }, + { 0x1e00, 0, 255, 2880 }, + { 0x1e01, 0, 255, 2886 }, + { 0x1e02, 0, 255, 2892 }, + { 0x1e03, 0, 255, 2898 }, + { 0x1e04, 0, 255, 2904 }, + { 0x1e05, 0, 255, 2910 }, + { 0x1e06, 0, 255, 2916 }, + { 0x1e07, 0, 255, 2922 }, + { 0x1e08, 0, 255, 2928 }, + { 0x1e09, 0, 255, 2936 }, + { 0x1e0a, 0, 255, 2944 }, + { 0x1e0b, 0, 255, 2950 }, + { 0x1e0c, 0, 255, 2956 }, + { 0x1e0d, 0, 255, 2962 }, + { 0x1e0e, 0, 255, 2968 }, + { 0x1e0f, 0, 255, 2974 }, + { 0x1e10, 0, 255, 2980 }, + { 0x1e11, 0, 255, 2986 }, + { 0x1e12, 0, 255, 2992 }, + { 0x1e13, 0, 255, 2998 }, + { 0x1e14, 0, 255, 3004 }, + { 0x1e15, 0, 255, 3012 }, + { 0x1e16, 0, 255, 3020 }, + { 0x1e17, 0, 255, 3028 }, + { 0x1e18, 0, 255, 3036 }, + { 0x1e19, 0, 255, 3042 }, + { 0x1e1a, 0, 255, 3048 }, + { 0x1e1b, 0, 255, 3054 }, + { 0x1e1c, 0, 255, 3060 }, + { 0x1e1d, 0, 255, 3068 }, + { 0x1e1e, 0, 255, 3076 }, + { 0x1e1f, 0, 255, 3082 }, + { 0x1e20, 0, 255, 3088 }, + { 0x1e21, 0, 255, 3094 }, + { 0x1e22, 0, 255, 3100 }, + { 0x1e23, 0, 255, 3106 }, + { 0x1e24, 0, 255, 3112 }, + { 0x1e25, 0, 255, 3118 }, + { 0x1e26, 0, 255, 3124 }, + { 0x1e27, 0, 255, 3130 }, + { 0x1e28, 0, 255, 3136 }, + { 0x1e29, 0, 255, 3142 }, + { 0x1e2a, 0, 255, 3148 }, + { 0x1e2b, 0, 255, 3154 }, + { 0x1e2c, 0, 255, 3160 }, + { 0x1e2d, 0, 255, 3166 }, + { 0x1e2e, 0, 255, 3172 }, + { 0x1e2f, 0, 255, 3180 }, + { 0x1e30, 0, 255, 3188 }, + { 0x1e31, 0, 255, 3194 }, + { 0x1e32, 0, 255, 3200 }, + { 0x1e33, 0, 255, 3206 }, + { 0x1e34, 0, 255, 3212 }, + { 0x1e35, 0, 255, 3218 }, + { 0x1e36, 0, 255, 3224 }, + { 0x1e37, 0, 255, 3230 }, + { 0x1e38, 0, 255, 3236 }, + { 0x1e39, 0, 255, 3244 }, + { 0x1e3a, 0, 255, 3252 }, + { 0x1e3b, 0, 255, 3258 }, + { 0x1e3c, 0, 255, 3264 }, + { 0x1e3d, 0, 255, 3270 }, + { 0x1e3e, 0, 255, 3276 }, + { 0x1e3f, 0, 255, 3282 }, + { 0x1e40, 0, 255, 3288 }, + { 0x1e41, 0, 255, 3294 }, + { 0x1e42, 0, 255, 3300 }, + { 0x1e43, 0, 255, 3306 }, + { 0x1e44, 0, 255, 3312 }, + { 0x1e45, 0, 255, 3318 }, + { 0x1e46, 0, 255, 3324 }, + { 0x1e47, 0, 255, 3330 }, + { 0x1e48, 0, 255, 3336 }, + { 0x1e49, 0, 255, 3342 }, + { 0x1e4a, 0, 255, 3348 }, + { 0x1e4b, 0, 255, 3354 }, + { 0x1e4c, 0, 255, 3360 }, + { 0x1e4d, 0, 255, 3368 }, + { 0x1e4e, 0, 255, 3376 }, + { 0x1e4f, 0, 255, 3384 }, + { 0x1e50, 0, 255, 3392 }, + { 0x1e51, 0, 255, 3400 }, + { 0x1e52, 0, 255, 3408 }, + { 0x1e53, 0, 255, 3416 }, + { 0x1e54, 0, 255, 3424 }, + { 0x1e55, 0, 255, 3430 }, + { 0x1e56, 0, 255, 3436 }, + { 0x1e57, 0, 255, 3442 }, + { 0x1e58, 0, 255, 3448 }, + { 0x1e59, 0, 255, 3454 }, + { 0x1e5a, 0, 255, 3460 }, + { 0x1e5b, 0, 255, 3466 }, + { 0x1e5c, 0, 255, 3472 }, + { 0x1e5d, 0, 255, 3480 }, + { 0x1e5e, 0, 255, 3488 }, + { 0x1e5f, 0, 255, 3494 }, + { 0x1e60, 0, 255, 3500 }, + { 0x1e61, 0, 255, 3506 }, + { 0x1e62, 0, 255, 3512 }, + { 0x1e63, 0, 255, 3518 }, + { 0x1e64, 0, 255, 3524 }, + { 0x1e65, 0, 255, 3532 }, + { 0x1e66, 0, 255, 3540 }, + { 0x1e67, 0, 255, 3548 }, + { 0x1e68, 0, 255, 3556 }, + { 0x1e69, 0, 255, 3564 }, + { 0x1e6a, 0, 255, 3572 }, + { 0x1e6b, 0, 255, 3578 }, + { 0x1e6c, 0, 255, 3584 }, + { 0x1e6d, 0, 255, 3590 }, + { 0x1e6e, 0, 255, 3596 }, + { 0x1e6f, 0, 255, 3602 }, + { 0x1e70, 0, 255, 3608 }, + { 0x1e71, 0, 255, 3614 }, + { 0x1e72, 0, 255, 3620 }, + { 0x1e73, 0, 255, 3626 }, + { 0x1e74, 0, 255, 3632 }, + { 0x1e75, 0, 255, 3638 }, + { 0x1e76, 0, 255, 3644 }, + { 0x1e77, 0, 255, 3650 }, + { 0x1e78, 0, 255, 3656 }, + { 0x1e79, 0, 255, 3664 }, + { 0x1e7a, 0, 255, 3672 }, + { 0x1e7b, 0, 255, 3680 }, + { 0x1e7c, 0, 255, 3688 }, + { 0x1e7d, 0, 255, 3694 }, + { 0x1e7e, 0, 255, 3700 }, + { 0x1e7f, 0, 255, 3706 }, + { 0x1e80, 0, 255, 3712 }, + { 0x1e81, 0, 255, 3718 }, + { 0x1e82, 0, 255, 3724 }, + { 0x1e83, 0, 255, 3730 }, + { 0x1e84, 0, 255, 3736 }, + { 0x1e85, 0, 255, 3742 }, + { 0x1e86, 0, 255, 3748 }, + { 0x1e87, 0, 255, 3754 }, + { 0x1e88, 0, 255, 3760 }, + { 0x1e89, 0, 255, 3766 }, + { 0x1e8a, 0, 255, 3772 }, + { 0x1e8b, 0, 255, 3778 }, + { 0x1e8c, 0, 255, 3784 }, + { 0x1e8d, 0, 255, 3790 }, + { 0x1e8e, 0, 255, 3796 }, + { 0x1e8f, 0, 255, 3802 }, + { 0x1e90, 0, 255, 3808 }, + { 0x1e91, 0, 255, 3814 }, + { 0x1e92, 0, 255, 3820 }, + { 0x1e93, 0, 255, 3826 }, + { 0x1e94, 0, 255, 3832 }, + { 0x1e95, 0, 255, 3838 }, + { 0x1e96, 0, 255, 3844 }, + { 0x1e97, 0, 255, 3850 }, + { 0x1e98, 0, 255, 3856 }, + { 0x1e99, 0, 255, 3862 }, + { 0x1e9a, 255, 0, 3868 }, + { 0x1e9b, 0, 6, 3874 }, + { 0x1ea0, 0, 255, 3886 }, + { 0x1ea1, 0, 255, 3892 }, + { 0x1ea2, 0, 255, 3898 }, + { 0x1ea3, 0, 255, 3904 }, + { 0x1ea4, 0, 255, 3910 }, + { 0x1ea5, 0, 255, 3918 }, + { 0x1ea6, 0, 255, 3926 }, + { 0x1ea7, 0, 255, 3934 }, + { 0x1ea8, 0, 255, 3942 }, + { 0x1ea9, 0, 255, 3950 }, + { 0x1eaa, 0, 255, 3958 }, + { 0x1eab, 0, 255, 3966 }, + { 0x1eac, 0, 255, 3974 }, + { 0x1ead, 0, 255, 3982 }, + { 0x1eae, 0, 255, 3990 }, + { 0x1eaf, 0, 255, 3998 }, + { 0x1eb0, 0, 255, 4006 }, + { 0x1eb1, 0, 255, 4014 }, + { 0x1eb2, 0, 255, 4022 }, + { 0x1eb3, 0, 255, 4030 }, + { 0x1eb4, 0, 255, 4038 }, + { 0x1eb5, 0, 255, 4046 }, + { 0x1eb6, 0, 255, 4054 }, + { 0x1eb7, 0, 255, 4062 }, + { 0x1eb8, 0, 255, 4070 }, + { 0x1eb9, 0, 255, 4076 }, + { 0x1eba, 0, 255, 4082 }, + { 0x1ebb, 0, 255, 4088 }, + { 0x1ebc, 0, 255, 4094 }, + { 0x1ebd, 0, 255, 4100 }, + { 0x1ebe, 0, 255, 4106 }, + { 0x1ebf, 0, 255, 4114 }, + { 0x1ec0, 0, 255, 4122 }, + { 0x1ec1, 0, 255, 4130 }, + { 0x1ec2, 0, 255, 4138 }, + { 0x1ec3, 0, 255, 4146 }, + { 0x1ec4, 0, 255, 4154 }, + { 0x1ec5, 0, 255, 4162 }, + { 0x1ec6, 0, 255, 4170 }, + { 0x1ec7, 0, 255, 4178 }, + { 0x1ec8, 0, 255, 4186 }, + { 0x1ec9, 0, 255, 4192 }, + { 0x1eca, 0, 255, 4198 }, + { 0x1ecb, 0, 255, 4204 }, + { 0x1ecc, 0, 255, 4210 }, + { 0x1ecd, 0, 255, 4216 }, + { 0x1ece, 0, 255, 4222 }, + { 0x1ecf, 0, 255, 4228 }, + { 0x1ed0, 0, 255, 4234 }, + { 0x1ed1, 0, 255, 4242 }, + { 0x1ed2, 0, 255, 4250 }, + { 0x1ed3, 0, 255, 4258 }, + { 0x1ed4, 0, 255, 4266 }, + { 0x1ed5, 0, 255, 4274 }, + { 0x1ed6, 0, 255, 4282 }, + { 0x1ed7, 0, 255, 4290 }, + { 0x1ed8, 0, 255, 4298 }, + { 0x1ed9, 0, 255, 4306 }, + { 0x1eda, 0, 255, 4314 }, + { 0x1edb, 0, 255, 4322 }, + { 0x1edc, 0, 255, 4330 }, + { 0x1edd, 0, 255, 4338 }, + { 0x1ede, 0, 255, 4346 }, + { 0x1edf, 0, 255, 4354 }, + { 0x1ee0, 0, 255, 4362 }, + { 0x1ee1, 0, 255, 4370 }, + { 0x1ee2, 0, 255, 4378 }, + { 0x1ee3, 0, 255, 4386 }, + { 0x1ee4, 0, 255, 4394 }, + { 0x1ee5, 0, 255, 4400 }, + { 0x1ee6, 0, 255, 4406 }, + { 0x1ee7, 0, 255, 4412 }, + { 0x1ee8, 0, 255, 4418 }, + { 0x1ee9, 0, 255, 4426 }, + { 0x1eea, 0, 255, 4434 }, + { 0x1eeb, 0, 255, 4442 }, + { 0x1eec, 0, 255, 4450 }, + { 0x1eed, 0, 255, 4458 }, + { 0x1eee, 0, 255, 4466 }, + { 0x1eef, 0, 255, 4474 }, + { 0x1ef0, 0, 255, 4482 }, + { 0x1ef1, 0, 255, 4490 }, + { 0x1ef2, 0, 255, 4498 }, + { 0x1ef3, 0, 255, 4504 }, + { 0x1ef4, 0, 255, 4510 }, + { 0x1ef5, 0, 255, 4516 }, + { 0x1ef6, 0, 255, 4522 }, + { 0x1ef7, 0, 255, 4528 }, + { 0x1ef8, 0, 255, 4534 }, + { 0x1ef9, 0, 255, 4540 }, + { 0x1f00, 0, 255, 4546 }, + { 0x1f01, 0, 255, 4552 }, + { 0x1f02, 0, 255, 4558 }, + { 0x1f03, 0, 255, 4566 }, + { 0x1f04, 0, 255, 4574 }, + { 0x1f05, 0, 255, 4582 }, + { 0x1f06, 0, 255, 4590 }, + { 0x1f07, 0, 255, 4598 }, + { 0x1f08, 0, 255, 4606 }, + { 0x1f09, 0, 255, 4612 }, + { 0x1f0a, 0, 255, 4618 }, + { 0x1f0b, 0, 255, 4626 }, + { 0x1f0c, 0, 255, 4634 }, + { 0x1f0d, 0, 255, 4642 }, + { 0x1f0e, 0, 255, 4650 }, + { 0x1f0f, 0, 255, 4658 }, + { 0x1f10, 0, 255, 4666 }, + { 0x1f11, 0, 255, 4672 }, + { 0x1f12, 0, 255, 4678 }, + { 0x1f13, 0, 255, 4686 }, + { 0x1f14, 0, 255, 4694 }, + { 0x1f15, 0, 255, 4702 }, + { 0x1f18, 0, 255, 4710 }, + { 0x1f19, 0, 255, 4716 }, + { 0x1f1a, 0, 255, 4722 }, + { 0x1f1b, 0, 255, 4730 }, + { 0x1f1c, 0, 255, 4738 }, + { 0x1f1d, 0, 255, 4746 }, + { 0x1f20, 0, 255, 4754 }, + { 0x1f21, 0, 255, 4760 }, + { 0x1f22, 0, 255, 4766 }, + { 0x1f23, 0, 255, 4774 }, + { 0x1f24, 0, 255, 4782 }, + { 0x1f25, 0, 255, 4790 }, + { 0x1f26, 0, 255, 4798 }, + { 0x1f27, 0, 255, 4806 }, + { 0x1f28, 0, 255, 4814 }, + { 0x1f29, 0, 255, 4820 }, + { 0x1f2a, 0, 255, 4826 }, + { 0x1f2b, 0, 255, 4834 }, + { 0x1f2c, 0, 255, 4842 }, + { 0x1f2d, 0, 255, 4850 }, + { 0x1f2e, 0, 255, 4858 }, + { 0x1f2f, 0, 255, 4866 }, + { 0x1f30, 0, 255, 4874 }, + { 0x1f31, 0, 255, 4880 }, + { 0x1f32, 0, 255, 4886 }, + { 0x1f33, 0, 255, 4894 }, + { 0x1f34, 0, 255, 4902 }, + { 0x1f35, 0, 255, 4910 }, + { 0x1f36, 0, 255, 4918 }, + { 0x1f37, 0, 255, 4926 }, + { 0x1f38, 0, 255, 4934 }, + { 0x1f39, 0, 255, 4940 }, + { 0x1f3a, 0, 255, 4946 }, + { 0x1f3b, 0, 255, 4954 }, + { 0x1f3c, 0, 255, 4962 }, + { 0x1f3d, 0, 255, 4970 }, + { 0x1f3e, 0, 255, 4978 }, + { 0x1f3f, 0, 255, 4986 }, + { 0x1f40, 0, 255, 4994 }, + { 0x1f41, 0, 255, 5000 }, + { 0x1f42, 0, 255, 5006 }, + { 0x1f43, 0, 255, 5014 }, + { 0x1f44, 0, 255, 5022 }, + { 0x1f45, 0, 255, 5030 }, + { 0x1f48, 0, 255, 5038 }, + { 0x1f49, 0, 255, 5044 }, + { 0x1f4a, 0, 255, 5050 }, + { 0x1f4b, 0, 255, 5058 }, + { 0x1f4c, 0, 255, 5066 }, + { 0x1f4d, 0, 255, 5074 }, + { 0x1f50, 0, 255, 5082 }, + { 0x1f51, 0, 255, 5088 }, + { 0x1f52, 0, 255, 5094 }, + { 0x1f53, 0, 255, 5102 }, + { 0x1f54, 0, 255, 5110 }, + { 0x1f55, 0, 255, 5118 }, + { 0x1f56, 0, 255, 5126 }, + { 0x1f57, 0, 255, 5134 }, + { 0x1f59, 0, 255, 5142 }, + { 0x1f5b, 0, 255, 5148 }, + { 0x1f5d, 0, 255, 5156 }, + { 0x1f5f, 0, 255, 5164 }, + { 0x1f60, 0, 255, 5172 }, + { 0x1f61, 0, 255, 5178 }, + { 0x1f62, 0, 255, 5184 }, + { 0x1f63, 0, 255, 5192 }, + { 0x1f64, 0, 255, 5200 }, + { 0x1f65, 0, 255, 5208 }, + { 0x1f66, 0, 255, 5216 }, + { 0x1f67, 0, 255, 5224 }, + { 0x1f68, 0, 255, 5232 }, + { 0x1f69, 0, 255, 5238 }, + { 0x1f6a, 0, 255, 5244 }, + { 0x1f6b, 0, 255, 5252 }, + { 0x1f6c, 0, 255, 5260 }, + { 0x1f6d, 0, 255, 5268 }, + { 0x1f6e, 0, 255, 5276 }, + { 0x1f6f, 0, 255, 5284 }, + { 0x1f70, 0, 255, 5292 }, + { 0x1f71, 0, 255, 1944 }, + { 0x1f72, 0, 255, 5298 }, + { 0x1f73, 0, 255, 1950 }, + { 0x1f74, 0, 255, 5304 }, + { 0x1f75, 0, 255, 1956 }, + { 0x1f76, 0, 255, 5310 }, + { 0x1f77, 0, 255, 1962 }, + { 0x1f78, 0, 255, 5316 }, + { 0x1f79, 0, 255, 1988 }, + { 0x1f7a, 0, 255, 5322 }, + { 0x1f7b, 0, 255, 1994 }, + { 0x1f7c, 0, 255, 5328 }, + { 0x1f7d, 0, 255, 2000 }, + { 0x1f80, 0, 255, 5334 }, + { 0x1f81, 0, 255, 5342 }, + { 0x1f82, 0, 255, 5350 }, + { 0x1f83, 0, 255, 5360 }, + { 0x1f84, 0, 255, 5370 }, + { 0x1f85, 0, 255, 5380 }, + { 0x1f86, 0, 255, 5390 }, + { 0x1f87, 0, 255, 5400 }, + { 0x1f88, 0, 255, 5410 }, + { 0x1f89, 0, 255, 5418 }, + { 0x1f8a, 0, 255, 5426 }, + { 0x1f8b, 0, 255, 5436 }, + { 0x1f8c, 0, 255, 5446 }, + { 0x1f8d, 0, 255, 5456 }, + { 0x1f8e, 0, 255, 5466 }, + { 0x1f8f, 0, 255, 5476 }, + { 0x1f90, 0, 255, 5486 }, + { 0x1f91, 0, 255, 5494 }, + { 0x1f92, 0, 255, 5502 }, + { 0x1f93, 0, 255, 5512 }, + { 0x1f94, 0, 255, 5522 }, + { 0x1f95, 0, 255, 5532 }, + { 0x1f96, 0, 255, 5542 }, + { 0x1f97, 0, 255, 5552 }, + { 0x1f98, 0, 255, 5562 }, + { 0x1f99, 0, 255, 5570 }, + { 0x1f9a, 0, 255, 5578 }, + { 0x1f9b, 0, 255, 5588 }, + { 0x1f9c, 0, 255, 5598 }, + { 0x1f9d, 0, 255, 5608 }, + { 0x1f9e, 0, 255, 5618 }, + { 0x1f9f, 0, 255, 5628 }, + { 0x1fa0, 0, 255, 5638 }, + { 0x1fa1, 0, 255, 5646 }, + { 0x1fa2, 0, 255, 5654 }, + { 0x1fa3, 0, 255, 5664 }, + { 0x1fa4, 0, 255, 5674 }, + { 0x1fa5, 0, 255, 5684 }, + { 0x1fa6, 0, 255, 5694 }, + { 0x1fa7, 0, 255, 5704 }, + { 0x1fa8, 0, 255, 5714 }, + { 0x1fa9, 0, 255, 5722 }, + { 0x1faa, 0, 255, 5730 }, + { 0x1fab, 0, 255, 5740 }, + { 0x1fac, 0, 255, 5750 }, + { 0x1fad, 0, 255, 5760 }, + { 0x1fae, 0, 255, 5770 }, + { 0x1faf, 0, 255, 5780 }, + { 0x1fb0, 0, 255, 5790 }, + { 0x1fb1, 0, 255, 5796 }, + { 0x1fb2, 0, 255, 5802 }, + { 0x1fb3, 0, 255, 5810 }, + { 0x1fb4, 0, 255, 5816 }, + { 0x1fb6, 0, 255, 5824 }, + { 0x1fb7, 0, 255, 5830 }, + { 0x1fb8, 0, 255, 5838 }, + { 0x1fb9, 0, 255, 5844 }, + { 0x1fba, 0, 255, 5850 }, + { 0x1fbb, 0, 255, 1878 }, + { 0x1fbc, 0, 255, 5856 }, + { 0x1fbd, 255, 0, 5862 }, + { 0x1fbe, 0, 255, 5868 }, + { 0x1fbf, 255, 0, 5862 }, + { 0x1fc0, 255, 0, 5872 }, + { 0x1fc1, 0, 6, 5878 }, + { 0x1fc2, 0, 255, 5892 }, + { 0x1fc3, 0, 255, 5900 }, + { 0x1fc4, 0, 255, 5906 }, + { 0x1fc6, 0, 255, 5914 }, + { 0x1fc7, 0, 255, 5920 }, + { 0x1fc8, 0, 255, 5928 }, + { 0x1fc9, 0, 255, 1888 }, + { 0x1fca, 0, 255, 5934 }, + { 0x1fcb, 0, 255, 1894 }, + { 0x1fcc, 0, 255, 5940 }, + { 0x1fcd, 0, 6, 5946 }, + { 0x1fce, 0, 6, 5960 }, + { 0x1fcf, 0, 6, 5974 }, + { 0x1fd0, 0, 255, 5988 }, + { 0x1fd1, 0, 255, 5994 }, + { 0x1fd2, 0, 255, 6000 }, + { 0x1fd3, 0, 255, 1924 }, + { 0x1fd6, 0, 255, 6008 }, + { 0x1fd7, 0, 255, 6014 }, + { 0x1fd8, 0, 255, 6022 }, + { 0x1fd9, 0, 255, 6028 }, + { 0x1fda, 0, 255, 6034 }, + { 0x1fdb, 0, 255, 1900 }, + { 0x1fdd, 0, 6, 6040 }, + { 0x1fde, 0, 6, 6054 }, + { 0x1fdf, 0, 6, 6068 }, + { 0x1fe0, 0, 255, 6082 }, + { 0x1fe1, 0, 255, 6088 }, + { 0x1fe2, 0, 255, 6094 }, + { 0x1fe3, 0, 255, 1968 }, + { 0x1fe4, 0, 255, 6102 }, + { 0x1fe5, 0, 255, 6108 }, + { 0x1fe6, 0, 255, 6114 }, + { 0x1fe7, 0, 255, 6120 }, + { 0x1fe8, 0, 255, 6128 }, + { 0x1fe9, 0, 255, 6134 }, + { 0x1fea, 0, 255, 6140 }, + { 0x1feb, 0, 255, 1912 }, + { 0x1fec, 0, 255, 6146 }, + { 0x1fed, 0, 6, 6152 }, + { 0x1fee, 0, 6, 1864 }, + { 0x1fef, 0, 255, 6166 }, + { 0x1ff2, 0, 255, 6170 }, + { 0x1ff3, 0, 255, 6178 }, + { 0x1ff4, 0, 255, 6184 }, + { 0x1ff6, 0, 255, 6192 }, + { 0x1ff7, 0, 255, 6198 }, + { 0x1ff8, 0, 255, 6206 }, + { 0x1ff9, 0, 255, 1906 }, + { 0x1ffa, 0, 255, 6212 }, + { 0x1ffb, 0, 255, 1918 }, + { 0x1ffc, 0, 255, 6218 }, + { 0x1ffd, 0, 4, 6224 }, + { 0x1ffe, 255, 0, 6234 }, + { 0x2000, 0, 4, 6240 }, + { 0x2001, 0, 4, 6248 }, + { 0x2002, 255, 0, 0 }, + { 0x2003, 255, 0, 0 }, + { 0x2004, 255, 0, 0 }, + { 0x2005, 255, 0, 0 }, + { 0x2006, 255, 0, 0 }, + { 0x2007, 255, 0, 0 }, + { 0x2008, 255, 0, 0 }, + { 0x2009, 255, 0, 0 }, + { 0x200a, 255, 0, 0 }, + { 0x2011, 255, 0, 6256 }, + { 0x2017, 255, 0, 6260 }, + { 0x2024, 255, 0, 6266 }, + { 0x2025, 255, 0, 6270 }, + { 0x2026, 255, 0, 6276 }, + { 0x202f, 255, 0, 0 }, + { 0x2033, 255, 0, 6284 }, + { 0x2034, 255, 0, 6290 }, + { 0x2036, 255, 0, 6298 }, + { 0x2037, 255, 0, 6304 }, + { 0x203c, 255, 0, 6312 }, + { 0x203e, 255, 0, 6318 }, + { 0x2047, 255, 0, 6324 }, + { 0x2048, 255, 0, 6330 }, + { 0x2049, 255, 0, 6336 }, + { 0x2057, 255, 0, 6342 }, + { 0x205f, 255, 0, 0 }, + { 0x2070, 255, 0, 6352 }, + { 0x2071, 255, 0, 6356 }, + { 0x2074, 255, 0, 6360 }, + { 0x2075, 255, 0, 6364 }, + { 0x2076, 255, 0, 6368 }, + { 0x2077, 255, 0, 6372 }, + { 0x2078, 255, 0, 6376 }, + { 0x2079, 255, 0, 6380 }, + { 0x207a, 255, 0, 6384 }, + { 0x207b, 255, 0, 6388 }, + { 0x207c, 255, 0, 6392 }, + { 0x207d, 255, 0, 6396 }, + { 0x207e, 255, 0, 6400 }, + { 0x207f, 255, 0, 6404 }, + { 0x2080, 255, 0, 6352 }, + { 0x2081, 255, 0, 44 }, + { 0x2082, 255, 0, 20 }, + { 0x2083, 255, 0, 24 }, + { 0x2084, 255, 0, 6360 }, + { 0x2085, 255, 0, 6364 }, + { 0x2086, 255, 0, 6368 }, + { 0x2087, 255, 0, 6372 }, + { 0x2088, 255, 0, 6376 }, + { 0x2089, 255, 0, 6380 }, + { 0x208a, 255, 0, 6384 }, + { 0x208b, 255, 0, 6388 }, + { 0x208c, 255, 0, 6392 }, + { 0x208d, 255, 0, 6396 }, + { 0x208e, 255, 0, 6400 }, + { 0x20a8, 255, 0, 6408 }, + { 0x2100, 255, 0, 6414 }, + { 0x2101, 255, 0, 6422 }, + { 0x2102, 255, 0, 6430 }, + { 0x2103, 255, 0, 6434 }, + { 0x2105, 255, 0, 6440 }, + { 0x2106, 255, 0, 6448 }, + { 0x2107, 255, 0, 6456 }, + { 0x2109, 255, 0, 6460 }, + { 0x210a, 255, 0, 6466 }, + { 0x210b, 255, 0, 6470 }, + { 0x210c, 255, 0, 6470 }, + { 0x210d, 255, 0, 6470 }, + { 0x210e, 255, 0, 1744 }, + { 0x210f, 255, 0, 6474 }, + { 0x2110, 255, 0, 6478 }, + { 0x2111, 255, 0, 6478 }, + { 0x2112, 255, 0, 6482 }, + { 0x2113, 255, 0, 1820 }, + { 0x2115, 255, 0, 6486 }, + { 0x2116, 255, 0, 6490 }, + { 0x2119, 255, 0, 6496 }, + { 0x211a, 255, 0, 6500 }, + { 0x211b, 255, 0, 6504 }, + { 0x211c, 255, 0, 6504 }, + { 0x211d, 255, 0, 6504 }, + { 0x2120, 255, 0, 6508 }, + { 0x2121, 255, 0, 6514 }, + { 0x2122, 255, 0, 6522 }, + { 0x2124, 255, 0, 6528 }, + { 0x2126, 0, 255, 6532 }, + { 0x2128, 255, 0, 6528 }, + { 0x212a, 0, 255, 6536 }, + { 0x212b, 0, 255, 106 }, + { 0x212c, 255, 0, 6540 }, + { 0x212d, 255, 0, 6430 }, + { 0x212f, 255, 0, 6544 }, + { 0x2130, 255, 0, 6548 }, + { 0x2131, 255, 0, 6552 }, + { 0x2133, 255, 0, 6556 }, + { 0x2134, 255, 0, 48 }, + { 0x2135, 255, 0, 6560 }, + { 0x2136, 255, 0, 6564 }, + { 0x2137, 255, 0, 6568 }, + { 0x2138, 255, 0, 6572 }, + { 0x2139, 255, 0, 6356 }, + { 0x213d, 255, 0, 6576 }, + { 0x213e, 255, 0, 6580 }, + { 0x213f, 255, 0, 6584 }, + { 0x2140, 255, 0, 6588 }, + { 0x2145, 255, 0, 6592 }, + { 0x2146, 255, 0, 6596 }, + { 0x2147, 255, 0, 6544 }, + { 0x2148, 255, 0, 6356 }, + { 0x2149, 255, 0, 1752 }, + { 0x2153, 255, 0, 6600 }, + { 0x2154, 255, 0, 6608 }, + { 0x2155, 255, 0, 6616 }, + { 0x2156, 255, 0, 6624 }, + { 0x2157, 255, 0, 6632 }, + { 0x2158, 255, 0, 6640 }, + { 0x2159, 255, 0, 6648 }, + { 0x215a, 255, 0, 6656 }, + { 0x215b, 255, 0, 6664 }, + { 0x215c, 255, 0, 6672 }, + { 0x215d, 255, 0, 6680 }, + { 0x215e, 255, 0, 6688 }, + { 0x215f, 255, 0, 6696 }, + { 0x2160, 255, 0, 6478 }, + { 0x2161, 255, 0, 6702 }, + { 0x2162, 255, 0, 6708 }, + { 0x2163, 255, 0, 6716 }, + { 0x2164, 255, 0, 6722 }, + { 0x2165, 255, 0, 6726 }, + { 0x2166, 255, 0, 6732 }, + { 0x2167, 255, 0, 6740 }, + { 0x2168, 255, 0, 6750 }, + { 0x2169, 255, 0, 6756 }, + { 0x216a, 255, 0, 6760 }, + { 0x216b, 255, 0, 6766 }, + { 0x216c, 255, 0, 6482 }, + { 0x216d, 255, 0, 6430 }, + { 0x216e, 255, 0, 6592 }, + { 0x216f, 255, 0, 6556 }, + { 0x2170, 255, 0, 6356 }, + { 0x2171, 255, 0, 6774 }, + { 0x2172, 255, 0, 6780 }, + { 0x2173, 255, 0, 6788 }, + { 0x2174, 255, 0, 6794 }, + { 0x2175, 255, 0, 6798 }, + { 0x2176, 255, 0, 6804 }, + { 0x2177, 255, 0, 6812 }, + { 0x2178, 255, 0, 6822 }, + { 0x2179, 255, 0, 1824 }, + { 0x217a, 255, 0, 6828 }, + { 0x217b, 255, 0, 6834 }, + { 0x217c, 255, 0, 1820 }, + { 0x217d, 255, 0, 6842 }, + { 0x217e, 255, 0, 6596 }, + { 0x217f, 255, 0, 6846 }, + { 0x219a, 0, 255, 6850 }, + { 0x219b, 0, 255, 6856 }, + { 0x21ae, 0, 255, 6862 }, + { 0x21cd, 0, 255, 6868 }, + { 0x21ce, 0, 255, 6874 }, + { 0x21cf, 0, 255, 6880 }, + { 0x2204, 0, 255, 6886 }, + { 0x2209, 0, 255, 6892 }, + { 0x220c, 0, 255, 6898 }, + { 0x2224, 0, 255, 6904 }, + { 0x2226, 0, 255, 6910 }, + { 0x222c, 255, 0, 6916 }, + { 0x222d, 255, 0, 6922 }, + { 0x222f, 255, 0, 6930 }, + { 0x2230, 255, 0, 6936 }, + { 0x2241, 0, 255, 6944 }, + { 0x2244, 0, 255, 6950 }, + { 0x2247, 0, 255, 6956 }, + { 0x2249, 0, 255, 6962 }, + { 0x2260, 0, 255, 6968 }, + { 0x2262, 0, 255, 6974 }, + { 0x226d, 0, 255, 6980 }, + { 0x226e, 0, 255, 6986 }, + { 0x226f, 0, 255, 6992 }, + { 0x2270, 0, 255, 6998 }, + { 0x2271, 0, 255, 7004 }, + { 0x2274, 0, 255, 7010 }, + { 0x2275, 0, 255, 7016 }, + { 0x2278, 0, 255, 7022 }, + { 0x2279, 0, 255, 7028 }, + { 0x2280, 0, 255, 7034 }, + { 0x2281, 0, 255, 7040 }, + { 0x2284, 0, 255, 7046 }, + { 0x2285, 0, 255, 7052 }, + { 0x2288, 0, 255, 7058 }, + { 0x2289, 0, 255, 7064 }, + { 0x22ac, 0, 255, 7070 }, + { 0x22ad, 0, 255, 7076 }, + { 0x22ae, 0, 255, 7082 }, + { 0x22af, 0, 255, 7088 }, + { 0x22e0, 0, 255, 7094 }, + { 0x22e1, 0, 255, 7100 }, + { 0x22e2, 0, 255, 7106 }, + { 0x22e3, 0, 255, 7112 }, + { 0x22ea, 0, 255, 7118 }, + { 0x22eb, 0, 255, 7124 }, + { 0x22ec, 0, 255, 7130 }, + { 0x22ed, 0, 255, 7136 }, + { 0x2329, 0, 255, 7142 }, + { 0x232a, 0, 255, 7146 }, + { 0x2460, 255, 0, 44 }, + { 0x2461, 255, 0, 20 }, + { 0x2462, 255, 0, 24 }, + { 0x2463, 255, 0, 6360 }, + { 0x2464, 255, 0, 6364 }, + { 0x2465, 255, 0, 6368 }, + { 0x2466, 255, 0, 6372 }, + { 0x2467, 255, 0, 6376 }, + { 0x2468, 255, 0, 6380 }, + { 0x2469, 255, 0, 7150 }, + { 0x246a, 255, 0, 7156 }, + { 0x246b, 255, 0, 7162 }, + { 0x246c, 255, 0, 7168 }, + { 0x246d, 255, 0, 7174 }, + { 0x246e, 255, 0, 7180 }, + { 0x246f, 255, 0, 7186 }, + { 0x2470, 255, 0, 7192 }, + { 0x2471, 255, 0, 7198 }, + { 0x2472, 255, 0, 7204 }, + { 0x2473, 255, 0, 7210 }, + { 0x2474, 255, 0, 7216 }, + { 0x2475, 255, 0, 7224 }, + { 0x2476, 255, 0, 7232 }, + { 0x2477, 255, 0, 7240 }, + { 0x2478, 255, 0, 7248 }, + { 0x2479, 255, 0, 7256 }, + { 0x247a, 255, 0, 7264 }, + { 0x247b, 255, 0, 7272 }, + { 0x247c, 255, 0, 7280 }, + { 0x247d, 255, 0, 7288 }, + { 0x247e, 255, 0, 7298 }, + { 0x247f, 255, 0, 7308 }, + { 0x2480, 255, 0, 7318 }, + { 0x2481, 255, 0, 7328 }, + { 0x2482, 255, 0, 7338 }, + { 0x2483, 255, 0, 7348 }, + { 0x2484, 255, 0, 7358 }, + { 0x2485, 255, 0, 7368 }, + { 0x2486, 255, 0, 7378 }, + { 0x2487, 255, 0, 7388 }, + { 0x2488, 255, 0, 7398 }, + { 0x2489, 255, 0, 7404 }, + { 0x248a, 255, 0, 7410 }, + { 0x248b, 255, 0, 7416 }, + { 0x248c, 255, 0, 7422 }, + { 0x248d, 255, 0, 7428 }, + { 0x248e, 255, 0, 7434 }, + { 0x248f, 255, 0, 7440 }, + { 0x2490, 255, 0, 7446 }, + { 0x2491, 255, 0, 7452 }, + { 0x2492, 255, 0, 7460 }, + { 0x2493, 255, 0, 7468 }, + { 0x2494, 255, 0, 7476 }, + { 0x2495, 255, 0, 7484 }, + { 0x2496, 255, 0, 7492 }, + { 0x2497, 255, 0, 7500 }, + { 0x2498, 255, 0, 7508 }, + { 0x2499, 255, 0, 7516 }, + { 0x249a, 255, 0, 7524 }, + { 0x249b, 255, 0, 7532 }, + { 0x249c, 255, 0, 7540 }, + { 0x249d, 255, 0, 7548 }, + { 0x249e, 255, 0, 7556 }, + { 0x249f, 255, 0, 7564 }, + { 0x24a0, 255, 0, 7572 }, + { 0x24a1, 255, 0, 7580 }, + { 0x24a2, 255, 0, 7588 }, + { 0x24a3, 255, 0, 7596 }, + { 0x24a4, 255, 0, 7604 }, + { 0x24a5, 255, 0, 7612 }, + { 0x24a6, 255, 0, 7620 }, + { 0x24a7, 255, 0, 7628 }, + { 0x24a8, 255, 0, 7636 }, + { 0x24a9, 255, 0, 7644 }, + { 0x24aa, 255, 0, 7652 }, + { 0x24ab, 255, 0, 7660 }, + { 0x24ac, 255, 0, 7668 }, + { 0x24ad, 255, 0, 7676 }, + { 0x24ae, 255, 0, 7684 }, + { 0x24af, 255, 0, 7692 }, + { 0x24b0, 255, 0, 7700 }, + { 0x24b1, 255, 0, 7708 }, + { 0x24b2, 255, 0, 7716 }, + { 0x24b3, 255, 0, 7724 }, + { 0x24b4, 255, 0, 7732 }, + { 0x24b5, 255, 0, 7740 }, + { 0x24b6, 255, 0, 7748 }, + { 0x24b7, 255, 0, 6540 }, + { 0x24b8, 255, 0, 6430 }, + { 0x24b9, 255, 0, 6592 }, + { 0x24ba, 255, 0, 6548 }, + { 0x24bb, 255, 0, 6552 }, + { 0x24bc, 255, 0, 7752 }, + { 0x24bd, 255, 0, 6470 }, + { 0x24be, 255, 0, 6478 }, + { 0x24bf, 255, 0, 7756 }, + { 0x24c0, 255, 0, 6536 }, + { 0x24c1, 255, 0, 6482 }, + { 0x24c2, 255, 0, 6556 }, + { 0x24c3, 255, 0, 6486 }, + { 0x24c4, 255, 0, 7760 }, + { 0x24c5, 255, 0, 6496 }, + { 0x24c6, 255, 0, 6500 }, + { 0x24c7, 255, 0, 6504 }, + { 0x24c8, 255, 0, 7764 }, + { 0x24c9, 255, 0, 7768 }, + { 0x24ca, 255, 0, 7772 }, + { 0x24cb, 255, 0, 6722 }, + { 0x24cc, 255, 0, 7776 }, + { 0x24cd, 255, 0, 6756 }, + { 0x24ce, 255, 0, 7780 }, + { 0x24cf, 255, 0, 6528 }, + { 0x24d0, 255, 0, 10 }, + { 0x24d1, 255, 0, 7784 }, + { 0x24d2, 255, 0, 6842 }, + { 0x24d3, 255, 0, 6596 }, + { 0x24d4, 255, 0, 6544 }, + { 0x24d5, 255, 0, 7788 }, + { 0x24d6, 255, 0, 6466 }, + { 0x24d7, 255, 0, 1744 }, + { 0x24d8, 255, 0, 6356 }, + { 0x24d9, 255, 0, 1752 }, + { 0x24da, 255, 0, 7792 }, + { 0x24db, 255, 0, 1820 }, + { 0x24dc, 255, 0, 6846 }, + { 0x24dd, 255, 0, 6404 }, + { 0x24de, 255, 0, 48 }, + { 0x24df, 255, 0, 7796 }, + { 0x24e0, 255, 0, 7800 }, + { 0x24e1, 255, 0, 1756 }, + { 0x24e2, 255, 0, 1072 }, + { 0x24e3, 255, 0, 7804 }, + { 0x24e4, 255, 0, 7808 }, + { 0x24e5, 255, 0, 6794 }, + { 0x24e6, 255, 0, 1772 }, + { 0x24e7, 255, 0, 1824 }, + { 0x24e8, 255, 0, 1776 }, + { 0x24e9, 255, 0, 7812 }, + { 0x24ea, 255, 0, 6352 }, + { 0x2a0c, 255, 0, 7816 }, + { 0x2a74, 255, 0, 7826 }, + { 0x2a75, 255, 0, 7834 }, + { 0x2a76, 255, 0, 7840 }, + { 0x2adc, 0, 255, 7848 }, + { 0x2e9f, 255, 0, 7854 }, + { 0x2ef3, 255, 0, 7858 }, + { 0x2f00, 255, 0, 7862 }, + { 0x2f01, 255, 0, 7866 }, + { 0x2f02, 255, 0, 7870 }, + { 0x2f03, 255, 0, 7874 }, + { 0x2f04, 255, 0, 7878 }, + { 0x2f05, 255, 0, 7882 }, + { 0x2f06, 255, 0, 7886 }, + { 0x2f07, 255, 0, 7890 }, + { 0x2f08, 255, 0, 7894 }, + { 0x2f09, 255, 0, 7898 }, + { 0x2f0a, 255, 0, 7902 }, + { 0x2f0b, 255, 0, 7906 }, + { 0x2f0c, 255, 0, 7910 }, + { 0x2f0d, 255, 0, 7914 }, + { 0x2f0e, 255, 0, 7918 }, + { 0x2f0f, 255, 0, 7922 }, + { 0x2f10, 255, 0, 7926 }, + { 0x2f11, 255, 0, 7930 }, + { 0x2f12, 255, 0, 7934 }, + { 0x2f13, 255, 0, 7938 }, + { 0x2f14, 255, 0, 7942 }, + { 0x2f15, 255, 0, 7946 }, + { 0x2f16, 255, 0, 7950 }, + { 0x2f17, 255, 0, 7954 }, + { 0x2f18, 255, 0, 7958 }, + { 0x2f19, 255, 0, 7962 }, + { 0x2f1a, 255, 0, 7966 }, + { 0x2f1b, 255, 0, 7970 }, + { 0x2f1c, 255, 0, 7974 }, + { 0x2f1d, 255, 0, 7978 }, + { 0x2f1e, 255, 0, 7982 }, + { 0x2f1f, 255, 0, 7986 }, + { 0x2f20, 255, 0, 7990 }, + { 0x2f21, 255, 0, 7994 }, + { 0x2f22, 255, 0, 7998 }, + { 0x2f23, 255, 0, 8002 }, + { 0x2f24, 255, 0, 8006 }, + { 0x2f25, 255, 0, 8010 }, + { 0x2f26, 255, 0, 8014 }, + { 0x2f27, 255, 0, 8018 }, + { 0x2f28, 255, 0, 8022 }, + { 0x2f29, 255, 0, 8026 }, + { 0x2f2a, 255, 0, 8030 }, + { 0x2f2b, 255, 0, 8034 }, + { 0x2f2c, 255, 0, 8038 }, + { 0x2f2d, 255, 0, 8042 }, + { 0x2f2e, 255, 0, 8046 }, + { 0x2f2f, 255, 0, 8050 }, + { 0x2f30, 255, 0, 8054 }, + { 0x2f31, 255, 0, 8058 }, + { 0x2f32, 255, 0, 8062 }, + { 0x2f33, 255, 0, 8066 }, + { 0x2f34, 255, 0, 8070 }, + { 0x2f35, 255, 0, 8074 }, + { 0x2f36, 255, 0, 8078 }, + { 0x2f37, 255, 0, 8082 }, + { 0x2f38, 255, 0, 8086 }, + { 0x2f39, 255, 0, 8090 }, + { 0x2f3a, 255, 0, 8094 }, + { 0x2f3b, 255, 0, 8098 }, + { 0x2f3c, 255, 0, 8102 }, + { 0x2f3d, 255, 0, 8106 }, + { 0x2f3e, 255, 0, 8110 }, + { 0x2f3f, 255, 0, 8114 }, + { 0x2f40, 255, 0, 8118 }, + { 0x2f41, 255, 0, 8122 }, + { 0x2f42, 255, 0, 8126 }, + { 0x2f43, 255, 0, 8130 }, + { 0x2f44, 255, 0, 8134 }, + { 0x2f45, 255, 0, 8138 }, + { 0x2f46, 255, 0, 8142 }, + { 0x2f47, 255, 0, 8146 }, + { 0x2f48, 255, 0, 8150 }, + { 0x2f49, 255, 0, 8154 }, + { 0x2f4a, 255, 0, 8158 }, + { 0x2f4b, 255, 0, 8162 }, + { 0x2f4c, 255, 0, 8166 }, + { 0x2f4d, 255, 0, 8170 }, + { 0x2f4e, 255, 0, 8174 }, + { 0x2f4f, 255, 0, 8178 }, + { 0x2f50, 255, 0, 8182 }, + { 0x2f51, 255, 0, 8186 }, + { 0x2f52, 255, 0, 8190 }, + { 0x2f53, 255, 0, 8194 }, + { 0x2f54, 255, 0, 8198 }, + { 0x2f55, 255, 0, 8202 }, + { 0x2f56, 255, 0, 8206 }, + { 0x2f57, 255, 0, 8210 }, + { 0x2f58, 255, 0, 8214 }, + { 0x2f59, 255, 0, 8218 }, + { 0x2f5a, 255, 0, 8222 }, + { 0x2f5b, 255, 0, 8226 }, + { 0x2f5c, 255, 0, 8230 }, + { 0x2f5d, 255, 0, 8234 }, + { 0x2f5e, 255, 0, 8238 }, + { 0x2f5f, 255, 0, 8242 }, + { 0x2f60, 255, 0, 8246 }, + { 0x2f61, 255, 0, 8250 }, + { 0x2f62, 255, 0, 8254 }, + { 0x2f63, 255, 0, 8258 }, + { 0x2f64, 255, 0, 8262 }, + { 0x2f65, 255, 0, 8266 }, + { 0x2f66, 255, 0, 8270 }, + { 0x2f67, 255, 0, 8274 }, + { 0x2f68, 255, 0, 8278 }, + { 0x2f69, 255, 0, 8282 }, + { 0x2f6a, 255, 0, 8286 }, + { 0x2f6b, 255, 0, 8290 }, + { 0x2f6c, 255, 0, 8294 }, + { 0x2f6d, 255, 0, 8298 }, + { 0x2f6e, 255, 0, 8302 }, + { 0x2f6f, 255, 0, 8306 }, + { 0x2f70, 255, 0, 8310 }, + { 0x2f71, 255, 0, 8314 }, + { 0x2f72, 255, 0, 8318 }, + { 0x2f73, 255, 0, 8322 }, + { 0x2f74, 255, 0, 8326 }, + { 0x2f75, 255, 0, 8330 }, + { 0x2f76, 255, 0, 8334 }, + { 0x2f77, 255, 0, 8338 }, + { 0x2f78, 255, 0, 8342 }, + { 0x2f79, 255, 0, 8346 }, + { 0x2f7a, 255, 0, 8350 }, + { 0x2f7b, 255, 0, 8354 }, + { 0x2f7c, 255, 0, 8358 }, + { 0x2f7d, 255, 0, 8362 }, + { 0x2f7e, 255, 0, 8366 }, + { 0x2f7f, 255, 0, 8370 }, + { 0x2f80, 255, 0, 8374 }, + { 0x2f81, 255, 0, 8378 }, + { 0x2f82, 255, 0, 8382 }, + { 0x2f83, 255, 0, 8386 }, + { 0x2f84, 255, 0, 8390 }, + { 0x2f85, 255, 0, 8394 }, + { 0x2f86, 255, 0, 8398 }, + { 0x2f87, 255, 0, 8402 }, + { 0x2f88, 255, 0, 8406 }, + { 0x2f89, 255, 0, 8410 }, + { 0x2f8a, 255, 0, 8414 }, + { 0x2f8b, 255, 0, 8418 }, + { 0x2f8c, 255, 0, 8422 }, + { 0x2f8d, 255, 0, 8426 }, + { 0x2f8e, 255, 0, 8430 }, + { 0x2f8f, 255, 0, 8434 }, + { 0x2f90, 255, 0, 8438 }, + { 0x2f91, 255, 0, 8442 }, + { 0x2f92, 255, 0, 8446 }, + { 0x2f93, 255, 0, 8450 }, + { 0x2f94, 255, 0, 8454 }, + { 0x2f95, 255, 0, 8458 }, + { 0x2f96, 255, 0, 8462 }, + { 0x2f97, 255, 0, 8466 }, + { 0x2f98, 255, 0, 8470 }, + { 0x2f99, 255, 0, 8474 }, + { 0x2f9a, 255, 0, 8478 }, + { 0x2f9b, 255, 0, 8482 }, + { 0x2f9c, 255, 0, 8486 }, + { 0x2f9d, 255, 0, 8490 }, + { 0x2f9e, 255, 0, 8494 }, + { 0x2f9f, 255, 0, 8498 }, + { 0x2fa0, 255, 0, 8502 }, + { 0x2fa1, 255, 0, 8506 }, + { 0x2fa2, 255, 0, 8510 }, + { 0x2fa3, 255, 0, 8514 }, + { 0x2fa4, 255, 0, 8518 }, + { 0x2fa5, 255, 0, 8522 }, + { 0x2fa6, 255, 0, 8526 }, + { 0x2fa7, 255, 0, 8530 }, + { 0x2fa8, 255, 0, 8534 }, + { 0x2fa9, 255, 0, 8538 }, + { 0x2faa, 255, 0, 8542 }, + { 0x2fab, 255, 0, 8546 }, + { 0x2fac, 255, 0, 8550 }, + { 0x2fad, 255, 0, 8554 }, + { 0x2fae, 255, 0, 8558 }, + { 0x2faf, 255, 0, 8562 }, + { 0x2fb0, 255, 0, 8566 }, + { 0x2fb1, 255, 0, 8570 }, + { 0x2fb2, 255, 0, 8574 }, + { 0x2fb3, 255, 0, 8578 }, + { 0x2fb4, 255, 0, 8582 }, + { 0x2fb5, 255, 0, 8586 }, + { 0x2fb6, 255, 0, 8590 }, + { 0x2fb7, 255, 0, 8594 }, + { 0x2fb8, 255, 0, 8598 }, + { 0x2fb9, 255, 0, 8602 }, + { 0x2fba, 255, 0, 8606 }, + { 0x2fbb, 255, 0, 8610 }, + { 0x2fbc, 255, 0, 8614 }, + { 0x2fbd, 255, 0, 8618 }, + { 0x2fbe, 255, 0, 8622 }, + { 0x2fbf, 255, 0, 8626 }, + { 0x2fc0, 255, 0, 8630 }, + { 0x2fc1, 255, 0, 8634 }, + { 0x2fc2, 255, 0, 8638 }, + { 0x2fc3, 255, 0, 8642 }, + { 0x2fc4, 255, 0, 8646 }, + { 0x2fc5, 255, 0, 8650 }, + { 0x2fc6, 255, 0, 8654 }, + { 0x2fc7, 255, 0, 8658 }, + { 0x2fc8, 255, 0, 8662 }, + { 0x2fc9, 255, 0, 8666 }, + { 0x2fca, 255, 0, 8670 }, + { 0x2fcb, 255, 0, 8674 }, + { 0x2fcc, 255, 0, 8678 }, + { 0x2fcd, 255, 0, 8682 }, + { 0x2fce, 255, 0, 8686 }, + { 0x2fcf, 255, 0, 8690 }, + { 0x2fd0, 255, 0, 8694 }, + { 0x2fd1, 255, 0, 8698 }, + { 0x2fd2, 255, 0, 8702 }, + { 0x2fd3, 255, 0, 8706 }, + { 0x2fd4, 255, 0, 8710 }, + { 0x2fd5, 255, 0, 8714 }, + { 0x3000, 255, 0, 0 }, + { 0x3036, 255, 0, 8718 }, + { 0x3038, 255, 0, 7954 }, + { 0x3039, 255, 0, 8722 }, + { 0x303a, 255, 0, 8726 }, + { 0x304c, 0, 255, 8730 }, + { 0x304e, 0, 255, 8736 }, + { 0x3050, 0, 255, 8742 }, + { 0x3052, 0, 255, 8748 }, + { 0x3054, 0, 255, 8754 }, + { 0x3056, 0, 255, 8760 }, + { 0x3058, 0, 255, 8766 }, + { 0x305a, 0, 255, 8772 }, + { 0x305c, 0, 255, 8778 }, + { 0x305e, 0, 255, 8784 }, + { 0x3060, 0, 255, 8790 }, + { 0x3062, 0, 255, 8796 }, + { 0x3065, 0, 255, 8802 }, + { 0x3067, 0, 255, 8808 }, + { 0x3069, 0, 255, 8814 }, + { 0x3070, 0, 255, 8820 }, + { 0x3071, 0, 255, 8826 }, + { 0x3073, 0, 255, 8832 }, + { 0x3074, 0, 255, 8838 }, + { 0x3076, 0, 255, 8844 }, + { 0x3077, 0, 255, 8850 }, + { 0x3079, 0, 255, 8856 }, + { 0x307a, 0, 255, 8862 }, + { 0x307c, 0, 255, 8868 }, + { 0x307d, 0, 255, 8874 }, + { 0x3094, 0, 255, 8880 }, + { 0x309b, 255, 0, 8886 }, + { 0x309c, 255, 0, 8892 }, + { 0x309e, 0, 255, 8898 }, + { 0x309f, 255, 0, 8904 }, + { 0x30ac, 0, 255, 8910 }, + { 0x30ae, 0, 255, 8916 }, + { 0x30b0, 0, 255, 8922 }, + { 0x30b2, 0, 255, 8928 }, + { 0x30b4, 0, 255, 8934 }, + { 0x30b6, 0, 255, 8940 }, + { 0x30b8, 0, 255, 8946 }, + { 0x30ba, 0, 255, 8952 }, + { 0x30bc, 0, 255, 8958 }, + { 0x30be, 0, 255, 8964 }, + { 0x30c0, 0, 255, 8970 }, + { 0x30c2, 0, 255, 8976 }, + { 0x30c5, 0, 255, 8982 }, + { 0x30c7, 0, 255, 8988 }, + { 0x30c9, 0, 255, 8994 }, + { 0x30d0, 0, 255, 9000 }, + { 0x30d1, 0, 255, 9006 }, + { 0x30d3, 0, 255, 9012 }, + { 0x30d4, 0, 255, 9018 }, + { 0x30d6, 0, 255, 9024 }, + { 0x30d7, 0, 255, 9030 }, + { 0x30d9, 0, 255, 9036 }, + { 0x30da, 0, 255, 9042 }, + { 0x30dc, 0, 255, 9048 }, + { 0x30dd, 0, 255, 9054 }, + { 0x30f4, 0, 255, 9060 }, + { 0x30f7, 0, 255, 9066 }, + { 0x30f8, 0, 255, 9072 }, + { 0x30f9, 0, 255, 9078 }, + { 0x30fa, 0, 255, 9084 }, + { 0x30fe, 0, 255, 9090 }, + { 0x30ff, 255, 0, 9096 }, + { 0x3131, 255, 0, 9102 }, + { 0x3132, 255, 0, 9106 }, + { 0x3133, 255, 0, 9110 }, + { 0x3134, 255, 0, 9114 }, + { 0x3135, 255, 0, 9118 }, + { 0x3136, 255, 0, 9122 }, + { 0x3137, 255, 0, 9126 }, + { 0x3138, 255, 0, 9130 }, + { 0x3139, 255, 0, 9134 }, + { 0x313a, 255, 0, 9138 }, + { 0x313b, 255, 0, 9142 }, + { 0x313c, 255, 0, 9146 }, + { 0x313d, 255, 0, 9150 }, + { 0x313e, 255, 0, 9154 }, + { 0x313f, 255, 0, 9158 }, + { 0x3140, 255, 0, 9162 }, + { 0x3141, 255, 0, 9166 }, + { 0x3142, 255, 0, 9170 }, + { 0x3143, 255, 0, 9174 }, + { 0x3144, 255, 0, 9178 }, + { 0x3145, 255, 0, 9182 }, + { 0x3146, 255, 0, 9186 }, + { 0x3147, 255, 0, 9190 }, + { 0x3148, 255, 0, 9194 }, + { 0x3149, 255, 0, 9198 }, + { 0x314a, 255, 0, 9202 }, + { 0x314b, 255, 0, 9206 }, + { 0x314c, 255, 0, 9210 }, + { 0x314d, 255, 0, 9214 }, + { 0x314e, 255, 0, 9218 }, + { 0x314f, 255, 0, 9222 }, + { 0x3150, 255, 0, 9226 }, + { 0x3151, 255, 0, 9230 }, + { 0x3152, 255, 0, 9234 }, + { 0x3153, 255, 0, 9238 }, + { 0x3154, 255, 0, 9242 }, + { 0x3155, 255, 0, 9246 }, + { 0x3156, 255, 0, 9250 }, + { 0x3157, 255, 0, 9254 }, + { 0x3158, 255, 0, 9258 }, + { 0x3159, 255, 0, 9262 }, + { 0x315a, 255, 0, 9266 }, + { 0x315b, 255, 0, 9270 }, + { 0x315c, 255, 0, 9274 }, + { 0x315d, 255, 0, 9278 }, + { 0x315e, 255, 0, 9282 }, + { 0x315f, 255, 0, 9286 }, + { 0x3160, 255, 0, 9290 }, + { 0x3161, 255, 0, 9294 }, + { 0x3162, 255, 0, 9298 }, + { 0x3163, 255, 0, 9302 }, + { 0x3164, 255, 0, 9306 }, + { 0x3165, 255, 0, 9310 }, + { 0x3166, 255, 0, 9314 }, + { 0x3167, 255, 0, 9318 }, + { 0x3168, 255, 0, 9322 }, + { 0x3169, 255, 0, 9326 }, + { 0x316a, 255, 0, 9330 }, + { 0x316b, 255, 0, 9334 }, + { 0x316c, 255, 0, 9338 }, + { 0x316d, 255, 0, 9342 }, + { 0x316e, 255, 0, 9346 }, + { 0x316f, 255, 0, 9350 }, + { 0x3170, 255, 0, 9354 }, + { 0x3171, 255, 0, 9358 }, + { 0x3172, 255, 0, 9362 }, + { 0x3173, 255, 0, 9366 }, + { 0x3174, 255, 0, 9370 }, + { 0x3175, 255, 0, 9374 }, + { 0x3176, 255, 0, 9378 }, + { 0x3177, 255, 0, 9382 }, + { 0x3178, 255, 0, 9386 }, + { 0x3179, 255, 0, 9390 }, + { 0x317a, 255, 0, 9394 }, + { 0x317b, 255, 0, 9398 }, + { 0x317c, 255, 0, 9402 }, + { 0x317d, 255, 0, 9406 }, + { 0x317e, 255, 0, 9410 }, + { 0x317f, 255, 0, 9414 }, + { 0x3180, 255, 0, 9418 }, + { 0x3181, 255, 0, 9422 }, + { 0x3182, 255, 0, 9426 }, + { 0x3183, 255, 0, 9430 }, + { 0x3184, 255, 0, 9434 }, + { 0x3185, 255, 0, 9438 }, + { 0x3186, 255, 0, 9442 }, + { 0x3187, 255, 0, 9446 }, + { 0x3188, 255, 0, 9450 }, + { 0x3189, 255, 0, 9454 }, + { 0x318a, 255, 0, 9458 }, + { 0x318b, 255, 0, 9462 }, + { 0x318c, 255, 0, 9466 }, + { 0x318d, 255, 0, 9470 }, + { 0x318e, 255, 0, 9474 }, + { 0x3192, 255, 0, 7862 }, + { 0x3193, 255, 0, 7886 }, + { 0x3194, 255, 0, 9478 }, + { 0x3195, 255, 0, 9482 }, + { 0x3196, 255, 0, 9486 }, + { 0x3197, 255, 0, 9490 }, + { 0x3198, 255, 0, 9494 }, + { 0x3199, 255, 0, 9498 }, + { 0x319a, 255, 0, 7878 }, + { 0x319b, 255, 0, 9502 }, + { 0x319c, 255, 0, 9506 }, + { 0x319d, 255, 0, 9510 }, + { 0x319e, 255, 0, 9514 }, + { 0x319f, 255, 0, 7894 }, + { 0x3200, 255, 0, 9518 }, + { 0x3201, 255, 0, 9526 }, + { 0x3202, 255, 0, 9534 }, + { 0x3203, 255, 0, 9542 }, + { 0x3204, 255, 0, 9550 }, + { 0x3205, 255, 0, 9558 }, + { 0x3206, 255, 0, 9566 }, + { 0x3207, 255, 0, 9574 }, + { 0x3208, 255, 0, 9582 }, + { 0x3209, 255, 0, 9590 }, + { 0x320a, 255, 0, 9598 }, + { 0x320b, 255, 0, 9606 }, + { 0x320c, 255, 0, 9614 }, + { 0x320d, 255, 0, 9622 }, + { 0x320e, 255, 0, 9630 }, + { 0x320f, 255, 0, 9640 }, + { 0x3210, 255, 0, 9650 }, + { 0x3211, 255, 0, 9660 }, + { 0x3212, 255, 0, 9670 }, + { 0x3213, 255, 0, 9680 }, + { 0x3214, 255, 0, 9690 }, + { 0x3215, 255, 0, 9700 }, + { 0x3216, 255, 0, 9710 }, + { 0x3217, 255, 0, 9720 }, + { 0x3218, 255, 0, 9730 }, + { 0x3219, 255, 0, 9740 }, + { 0x321a, 255, 0, 9750 }, + { 0x321b, 255, 0, 9760 }, + { 0x321c, 255, 0, 9770 }, + { 0x3220, 255, 0, 9780 }, + { 0x3221, 255, 0, 9788 }, + { 0x3222, 255, 0, 9796 }, + { 0x3223, 255, 0, 9804 }, + { 0x3224, 255, 0, 9812 }, + { 0x3225, 255, 0, 9820 }, + { 0x3226, 255, 0, 9828 }, + { 0x3227, 255, 0, 9836 }, + { 0x3228, 255, 0, 9844 }, + { 0x3229, 255, 0, 9852 }, + { 0x322a, 255, 0, 9860 }, + { 0x322b, 255, 0, 9868 }, + { 0x322c, 255, 0, 9876 }, + { 0x322d, 255, 0, 9884 }, + { 0x322e, 255, 0, 9892 }, + { 0x322f, 255, 0, 9900 }, + { 0x3230, 255, 0, 9908 }, + { 0x3231, 255, 0, 9916 }, + { 0x3232, 255, 0, 9924 }, + { 0x3233, 255, 0, 9932 }, + { 0x3234, 255, 0, 9940 }, + { 0x3235, 255, 0, 9948 }, + { 0x3236, 255, 0, 9956 }, + { 0x3237, 255, 0, 9964 }, + { 0x3238, 255, 0, 9972 }, + { 0x3239, 255, 0, 9980 }, + { 0x323a, 255, 0, 9988 }, + { 0x323b, 255, 0, 9996 }, + { 0x323c, 255, 0, 10004 }, + { 0x323d, 255, 0, 10012 }, + { 0x323e, 255, 0, 10020 }, + { 0x323f, 255, 0, 10028 }, + { 0x3240, 255, 0, 10036 }, + { 0x3241, 255, 0, 10044 }, + { 0x3242, 255, 0, 10052 }, + { 0x3243, 255, 0, 10060 }, + { 0x3251, 255, 0, 10068 }, + { 0x3252, 255, 0, 10074 }, + { 0x3253, 255, 0, 10080 }, + { 0x3254, 255, 0, 10086 }, + { 0x3255, 255, 0, 10092 }, + { 0x3256, 255, 0, 10098 }, + { 0x3257, 255, 0, 10104 }, + { 0x3258, 255, 0, 10110 }, + { 0x3259, 255, 0, 10116 }, + { 0x325a, 255, 0, 10122 }, + { 0x325b, 255, 0, 10128 }, + { 0x325c, 255, 0, 10134 }, + { 0x325d, 255, 0, 10140 }, + { 0x325e, 255, 0, 10146 }, + { 0x325f, 255, 0, 10152 }, + { 0x3260, 255, 0, 9102 }, + { 0x3261, 255, 0, 9114 }, + { 0x3262, 255, 0, 9126 }, + { 0x3263, 255, 0, 9134 }, + { 0x3264, 255, 0, 9166 }, + { 0x3265, 255, 0, 9170 }, + { 0x3266, 255, 0, 9182 }, + { 0x3267, 255, 0, 9190 }, + { 0x3268, 255, 0, 9194 }, + { 0x3269, 255, 0, 9202 }, + { 0x326a, 255, 0, 9206 }, + { 0x326b, 255, 0, 9210 }, + { 0x326c, 255, 0, 9214 }, + { 0x326d, 255, 0, 9218 }, + { 0x326e, 255, 0, 10158 }, + { 0x326f, 255, 0, 10164 }, + { 0x3270, 255, 0, 10170 }, + { 0x3271, 255, 0, 10176 }, + { 0x3272, 255, 0, 10182 }, + { 0x3273, 255, 0, 10188 }, + { 0x3274, 255, 0, 10194 }, + { 0x3275, 255, 0, 10200 }, + { 0x3276, 255, 0, 10206 }, + { 0x3277, 255, 0, 10212 }, + { 0x3278, 255, 0, 10218 }, + { 0x3279, 255, 0, 10224 }, + { 0x327a, 255, 0, 10230 }, + { 0x327b, 255, 0, 10236 }, + { 0x3280, 255, 0, 7862 }, + { 0x3281, 255, 0, 7886 }, + { 0x3282, 255, 0, 9478 }, + { 0x3283, 255, 0, 9482 }, + { 0x3284, 255, 0, 10242 }, + { 0x3285, 255, 0, 10246 }, + { 0x3286, 255, 0, 10250 }, + { 0x3287, 255, 0, 7906 }, + { 0x3288, 255, 0, 10254 }, + { 0x3289, 255, 0, 7954 }, + { 0x328a, 255, 0, 8154 }, + { 0x328b, 255, 0, 8202 }, + { 0x328c, 255, 0, 8198 }, + { 0x328d, 255, 0, 8158 }, + { 0x328e, 255, 0, 8526 }, + { 0x328f, 255, 0, 7986 }, + { 0x3290, 255, 0, 8146 }, + { 0x3291, 255, 0, 10258 }, + { 0x3292, 255, 0, 10262 }, + { 0x3293, 255, 0, 10266 }, + { 0x3294, 255, 0, 10270 }, + { 0x3295, 255, 0, 10274 }, + { 0x3296, 255, 0, 10278 }, + { 0x3297, 255, 0, 10282 }, + { 0x3298, 255, 0, 10286 }, + { 0x3299, 255, 0, 10290 }, + { 0x329a, 255, 0, 10294 }, + { 0x329b, 255, 0, 8010 }, + { 0x329c, 255, 0, 10298 }, + { 0x329d, 255, 0, 10302 }, + { 0x329e, 255, 0, 10306 }, + { 0x329f, 255, 0, 10310 }, + { 0x32a0, 255, 0, 10314 }, + { 0x32a1, 255, 0, 10318 }, + { 0x32a2, 255, 0, 10322 }, + { 0x32a3, 255, 0, 10326 }, + { 0x32a4, 255, 0, 9486 }, + { 0x32a5, 255, 0, 9490 }, + { 0x32a6, 255, 0, 9494 }, + { 0x32a7, 255, 0, 10330 }, + { 0x32a8, 255, 0, 10334 }, + { 0x32a9, 255, 0, 10338 }, + { 0x32aa, 255, 0, 10342 }, + { 0x32ab, 255, 0, 10346 }, + { 0x32ac, 255, 0, 10350 }, + { 0x32ad, 255, 0, 10354 }, + { 0x32ae, 255, 0, 10358 }, + { 0x32af, 255, 0, 10362 }, + { 0x32b0, 255, 0, 10366 }, + { 0x32b1, 255, 0, 10370 }, + { 0x32b2, 255, 0, 10376 }, + { 0x32b3, 255, 0, 10382 }, + { 0x32b4, 255, 0, 10388 }, + { 0x32b5, 255, 0, 10394 }, + { 0x32b6, 255, 0, 10400 }, + { 0x32b7, 255, 0, 10406 }, + { 0x32b8, 255, 0, 10412 }, + { 0x32b9, 255, 0, 10418 }, + { 0x32ba, 255, 0, 10424 }, + { 0x32bb, 255, 0, 10430 }, + { 0x32bc, 255, 0, 10436 }, + { 0x32bd, 255, 0, 10442 }, + { 0x32be, 255, 0, 10448 }, + { 0x32bf, 255, 0, 10454 }, + { 0x32c0, 255, 0, 10460 }, + { 0x32c1, 255, 0, 10466 }, + { 0x32c2, 255, 0, 10472 }, + { 0x32c3, 255, 0, 10478 }, + { 0x32c4, 255, 0, 10484 }, + { 0x32c5, 255, 0, 10490 }, + { 0x32c6, 255, 0, 10496 }, + { 0x32c7, 255, 0, 10502 }, + { 0x32c8, 255, 0, 10508 }, + { 0x32c9, 255, 0, 10514 }, + { 0x32ca, 255, 0, 10522 }, + { 0x32cb, 255, 0, 10530 }, + { 0x32d0, 255, 0, 10538 }, + { 0x32d1, 255, 0, 10542 }, + { 0x32d2, 255, 0, 10546 }, + { 0x32d3, 255, 0, 10550 }, + { 0x32d4, 255, 0, 10554 }, + { 0x32d5, 255, 0, 10558 }, + { 0x32d6, 255, 0, 10562 }, + { 0x32d7, 255, 0, 10566 }, + { 0x32d8, 255, 0, 10570 }, + { 0x32d9, 255, 0, 10574 }, + { 0x32da, 255, 0, 10578 }, + { 0x32db, 255, 0, 10582 }, + { 0x32dc, 255, 0, 10586 }, + { 0x32dd, 255, 0, 10590 }, + { 0x32de, 255, 0, 10594 }, + { 0x32df, 255, 0, 10598 }, + { 0x32e0, 255, 0, 10602 }, + { 0x32e1, 255, 0, 10606 }, + { 0x32e2, 255, 0, 10610 }, + { 0x32e3, 255, 0, 10614 }, + { 0x32e4, 255, 0, 10618 }, + { 0x32e5, 255, 0, 10622 }, + { 0x32e6, 255, 0, 10626 }, + { 0x32e7, 255, 0, 10630 }, + { 0x32e8, 255, 0, 10634 }, + { 0x32e9, 255, 0, 10638 }, + { 0x32ea, 255, 0, 10642 }, + { 0x32eb, 255, 0, 10646 }, + { 0x32ec, 255, 0, 10650 }, + { 0x32ed, 255, 0, 10654 }, + { 0x32ee, 255, 0, 10658 }, + { 0x32ef, 255, 0, 10662 }, + { 0x32f0, 255, 0, 10666 }, + { 0x32f1, 255, 0, 10670 }, + { 0x32f2, 255, 0, 10674 }, + { 0x32f3, 255, 0, 10678 }, + { 0x32f4, 255, 0, 10682 }, + { 0x32f5, 255, 0, 10686 }, + { 0x32f6, 255, 0, 10690 }, + { 0x32f7, 255, 0, 10694 }, + { 0x32f8, 255, 0, 10698 }, + { 0x32f9, 255, 0, 10702 }, + { 0x32fa, 255, 0, 10706 }, + { 0x32fb, 255, 0, 10710 }, + { 0x32fc, 255, 0, 10714 }, + { 0x32fd, 255, 0, 10718 }, + { 0x32fe, 255, 0, 10722 }, + { 0x3300, 255, 0, 10726 }, + { 0x3301, 255, 0, 10738 }, + { 0x3302, 255, 0, 10748 }, + { 0x3303, 255, 0, 10760 }, + { 0x3304, 255, 0, 10768 }, + { 0x3305, 255, 0, 10780 }, + { 0x3306, 255, 0, 10788 }, + { 0x3307, 255, 0, 10796 }, + { 0x3308, 255, 0, 10810 }, + { 0x3309, 255, 0, 10820 }, + { 0x330a, 255, 0, 10828 }, + { 0x330b, 255, 0, 10836 }, + { 0x330c, 255, 0, 10844 }, + { 0x330d, 255, 0, 10854 }, + { 0x330e, 255, 0, 10864 }, + { 0x330f, 255, 0, 10874 }, + { 0x3310, 255, 0, 10884 }, + { 0x3311, 255, 0, 10894 }, + { 0x3312, 255, 0, 10904 }, + { 0x3313, 255, 0, 10914 }, + { 0x3314, 255, 0, 10928 }, + { 0x3315, 255, 0, 10934 }, + { 0x3316, 255, 0, 10948 }, + { 0x3317, 255, 0, 10962 }, + { 0x3318, 255, 0, 10974 }, + { 0x3319, 255, 0, 10984 }, + { 0x331a, 255, 0, 10998 }, + { 0x331b, 255, 0, 11012 }, + { 0x331c, 255, 0, 11022 }, + { 0x331d, 255, 0, 11030 }, + { 0x331e, 255, 0, 11038 }, + { 0x331f, 255, 0, 11048 }, + { 0x3320, 255, 0, 11058 }, + { 0x3321, 255, 0, 11070 }, + { 0x3322, 255, 0, 11082 }, + { 0x3323, 255, 0, 11090 }, + { 0x3324, 255, 0, 11098 }, + { 0x3325, 255, 0, 11108 }, + { 0x3326, 255, 0, 11116 }, + { 0x3327, 255, 0, 11124 }, + { 0x3328, 255, 0, 11130 }, + { 0x3329, 255, 0, 11136 }, + { 0x332a, 255, 0, 11144 }, + { 0x332b, 255, 0, 11152 }, + { 0x332c, 255, 0, 11166 }, + { 0x332d, 255, 0, 11176 }, + { 0x332e, 255, 0, 11188 }, + { 0x332f, 255, 0, 11202 }, + { 0x3330, 255, 0, 11212 }, + { 0x3331, 255, 0, 11220 }, + { 0x3332, 255, 0, 11228 }, + { 0x3333, 255, 0, 11242 }, + { 0x3334, 255, 0, 11252 }, + { 0x3335, 255, 0, 11266 }, + { 0x3336, 255, 0, 11274 }, + { 0x3337, 255, 0, 11286 }, + { 0x3338, 255, 0, 11294 }, + { 0x3339, 255, 0, 11304 }, + { 0x333a, 255, 0, 11312 }, + { 0x333b, 255, 0, 11322 }, + { 0x333c, 255, 0, 11334 }, + { 0x333d, 255, 0, 11344 }, + { 0x333e, 255, 0, 11356 }, + { 0x333f, 255, 0, 11366 }, + { 0x3340, 255, 0, 11372 }, + { 0x3341, 255, 0, 11384 }, + { 0x3342, 255, 0, 11392 }, + { 0x3343, 255, 0, 11400 }, + { 0x3344, 255, 0, 11410 }, + { 0x3345, 255, 0, 11418 }, + { 0x3346, 255, 0, 11426 }, + { 0x3347, 255, 0, 11434 }, + { 0x3348, 255, 0, 11446 }, + { 0x3349, 255, 0, 11456 }, + { 0x334a, 255, 0, 11462 }, + { 0x334b, 255, 0, 11476 }, + { 0x334c, 255, 0, 11484 }, + { 0x334d, 255, 0, 11496 }, + { 0x334e, 255, 0, 11506 }, + { 0x334f, 255, 0, 11516 }, + { 0x3350, 255, 0, 11524 }, + { 0x3351, 255, 0, 11532 }, + { 0x3352, 255, 0, 11542 }, + { 0x3353, 255, 0, 11548 }, + { 0x3354, 255, 0, 11558 }, + { 0x3355, 255, 0, 11570 }, + { 0x3356, 255, 0, 11576 }, + { 0x3357, 255, 0, 11590 }, + { 0x3358, 255, 0, 11598 }, + { 0x3359, 255, 0, 11604 }, + { 0x335a, 255, 0, 11610 }, + { 0x335b, 255, 0, 11616 }, + { 0x335c, 255, 0, 11622 }, + { 0x335d, 255, 0, 11628 }, + { 0x335e, 255, 0, 11634 }, + { 0x335f, 255, 0, 11640 }, + { 0x3360, 255, 0, 11646 }, + { 0x3361, 255, 0, 11652 }, + { 0x3362, 255, 0, 11658 }, + { 0x3363, 255, 0, 11666 }, + { 0x3364, 255, 0, 11674 }, + { 0x3365, 255, 0, 11682 }, + { 0x3366, 255, 0, 11690 }, + { 0x3367, 255, 0, 11698 }, + { 0x3368, 255, 0, 11706 }, + { 0x3369, 255, 0, 11714 }, + { 0x336a, 255, 0, 11722 }, + { 0x336b, 255, 0, 11730 }, + { 0x336c, 255, 0, 11738 }, + { 0x336d, 255, 0, 11746 }, + { 0x336e, 255, 0, 11754 }, + { 0x336f, 255, 0, 11762 }, + { 0x3370, 255, 0, 11770 }, + { 0x3371, 255, 0, 11778 }, + { 0x3372, 255, 0, 11786 }, + { 0x3373, 255, 0, 11792 }, + { 0x3374, 255, 0, 11798 }, + { 0x3375, 255, 0, 11806 }, + { 0x3376, 255, 0, 11812 }, + { 0x337b, 255, 0, 11818 }, + { 0x337c, 255, 0, 11824 }, + { 0x337d, 255, 0, 11830 }, + { 0x337e, 255, 0, 11836 }, + { 0x337f, 255, 0, 11842 }, + { 0x3380, 255, 0, 11852 }, + { 0x3381, 255, 0, 11858 }, + { 0x3382, 255, 0, 11864 }, + { 0x3383, 255, 0, 11870 }, + { 0x3384, 255, 0, 11876 }, + { 0x3385, 255, 0, 11882 }, + { 0x3386, 255, 0, 11888 }, + { 0x3387, 255, 0, 11894 }, + { 0x3388, 255, 0, 11900 }, + { 0x3389, 255, 0, 11908 }, + { 0x338a, 255, 0, 11918 }, + { 0x338b, 255, 0, 11924 }, + { 0x338c, 255, 0, 11930 }, + { 0x338d, 255, 0, 11936 }, + { 0x338e, 255, 0, 11942 }, + { 0x338f, 255, 0, 11948 }, + { 0x3390, 255, 0, 11954 }, + { 0x3391, 255, 0, 11960 }, + { 0x3392, 255, 0, 11968 }, + { 0x3393, 255, 0, 11976 }, + { 0x3394, 255, 0, 11984 }, + { 0x3395, 255, 0, 11992 }, + { 0x3396, 255, 0, 11998 }, + { 0x3397, 255, 0, 12004 }, + { 0x3398, 255, 0, 12010 }, + { 0x3399, 255, 0, 12016 }, + { 0x339a, 255, 0, 12022 }, + { 0x339b, 255, 0, 12028 }, + { 0x339c, 255, 0, 12034 }, + { 0x339d, 255, 0, 12040 }, + { 0x339e, 255, 0, 12046 }, + { 0x339f, 255, 0, 12052 }, + { 0x33a0, 255, 0, 12060 }, + { 0x33a1, 255, 0, 12068 }, + { 0x33a2, 255, 0, 12074 }, + { 0x33a3, 255, 0, 12082 }, + { 0x33a4, 255, 0, 12090 }, + { 0x33a5, 255, 0, 12098 }, + { 0x33a6, 255, 0, 12104 }, + { 0x33a7, 255, 0, 12112 }, + { 0x33a8, 255, 0, 12120 }, + { 0x33a9, 255, 0, 12130 }, + { 0x33aa, 255, 0, 12136 }, + { 0x33ab, 255, 0, 12144 }, + { 0x33ac, 255, 0, 12152 }, + { 0x33ad, 255, 0, 12160 }, + { 0x33ae, 255, 0, 12168 }, + { 0x33af, 255, 0, 12180 }, + { 0x33b0, 255, 0, 12194 }, + { 0x33b1, 255, 0, 12200 }, + { 0x33b2, 255, 0, 12206 }, + { 0x33b3, 255, 0, 12212 }, + { 0x33b4, 255, 0, 12218 }, + { 0x33b5, 255, 0, 12224 }, + { 0x33b6, 255, 0, 12230 }, + { 0x33b7, 255, 0, 12236 }, + { 0x33b8, 255, 0, 12242 }, + { 0x33b9, 255, 0, 12248 }, + { 0x33ba, 255, 0, 12254 }, + { 0x33bb, 255, 0, 12260 }, + { 0x33bc, 255, 0, 12266 }, + { 0x33bd, 255, 0, 12272 }, + { 0x33be, 255, 0, 12278 }, + { 0x33bf, 255, 0, 12284 }, + { 0x33c0, 255, 0, 12290 }, + { 0x33c1, 255, 0, 12296 }, + { 0x33c2, 255, 0, 12302 }, + { 0x33c3, 255, 0, 12312 }, + { 0x33c4, 255, 0, 12318 }, + { 0x33c5, 255, 0, 12324 }, + { 0x33c6, 255, 0, 12330 }, + { 0x33c7, 255, 0, 12340 }, + { 0x33c8, 255, 0, 12348 }, + { 0x33c9, 255, 0, 12354 }, + { 0x33ca, 255, 0, 12360 }, + { 0x33cb, 255, 0, 12366 }, + { 0x33cc, 255, 0, 12372 }, + { 0x33cd, 255, 0, 12378 }, + { 0x33ce, 255, 0, 12384 }, + { 0x33cf, 255, 0, 12390 }, + { 0x33d0, 255, 0, 12396 }, + { 0x33d1, 255, 0, 12402 }, + { 0x33d2, 255, 0, 12408 }, + { 0x33d3, 255, 0, 12416 }, + { 0x33d4, 255, 0, 12422 }, + { 0x33d5, 255, 0, 12428 }, + { 0x33d6, 255, 0, 12436 }, + { 0x33d7, 255, 0, 12444 }, + { 0x33d8, 255, 0, 12450 }, + { 0x33d9, 255, 0, 12460 }, + { 0x33da, 255, 0, 12468 }, + { 0x33db, 255, 0, 12474 }, + { 0x33dc, 255, 0, 12480 }, + { 0x33dd, 255, 0, 12486 }, + { 0x33e0, 255, 0, 12492 }, + { 0x33e1, 255, 0, 12498 }, + { 0x33e2, 255, 0, 12504 }, + { 0x33e3, 255, 0, 12510 }, + { 0x33e4, 255, 0, 12516 }, + { 0x33e5, 255, 0, 12522 }, + { 0x33e6, 255, 0, 12528 }, + { 0x33e7, 255, 0, 12534 }, + { 0x33e8, 255, 0, 12540 }, + { 0x33e9, 255, 0, 12546 }, + { 0x33ea, 255, 0, 12554 }, + { 0x33eb, 255, 0, 12562 }, + { 0x33ec, 255, 0, 12570 }, + { 0x33ed, 255, 0, 12578 }, + { 0x33ee, 255, 0, 12586 }, + { 0x33ef, 255, 0, 12594 }, + { 0x33f0, 255, 0, 12602 }, + { 0x33f1, 255, 0, 12610 }, + { 0x33f2, 255, 0, 12618 }, + { 0x33f3, 255, 0, 12626 }, + { 0x33f4, 255, 0, 12634 }, + { 0x33f5, 255, 0, 12642 }, + { 0x33f6, 255, 0, 12650 }, + { 0x33f7, 255, 0, 12658 }, + { 0x33f8, 255, 0, 12666 }, + { 0x33f9, 255, 0, 12674 }, + { 0x33fa, 255, 0, 12682 }, + { 0x33fb, 255, 0, 12690 }, + { 0x33fc, 255, 0, 12698 }, + { 0x33fd, 255, 0, 12706 }, + { 0x33fe, 255, 0, 12714 }, + { 0xf900, 0, 255, 12722 }, + { 0xf901, 0, 255, 12726 }, + { 0xf902, 0, 255, 8494 }, + { 0xf903, 0, 255, 12730 }, + { 0xf904, 0, 255, 12734 }, + { 0xf905, 0, 255, 12738 }, + { 0xf906, 0, 255, 12742 }, + { 0xf907, 0, 255, 8710 }, + { 0xf908, 0, 255, 8710 }, + { 0xf909, 0, 255, 12746 }, + { 0xf90a, 0, 255, 8526 }, + { 0xf90b, 0, 255, 12750 }, + { 0xf90c, 0, 255, 12754 }, + { 0xf90d, 0, 255, 12758 }, + { 0xf90e, 0, 255, 12762 }, + { 0xf90f, 0, 255, 12766 }, + { 0xf910, 0, 255, 12770 }, + { 0xf911, 0, 255, 12774 }, + { 0xf912, 0, 255, 12778 }, + { 0xf913, 0, 255, 12782 }, + { 0xf914, 0, 255, 12786 }, + { 0xf915, 0, 255, 12790 }, + { 0xf916, 0, 255, 12794 }, + { 0xf917, 0, 255, 12798 }, + { 0xf918, 0, 255, 12802 }, + { 0xf919, 0, 255, 12806 }, + { 0xf91a, 0, 255, 12810 }, + { 0xf91b, 0, 255, 12814 }, + { 0xf91c, 0, 255, 12818 }, + { 0xf91d, 0, 255, 12822 }, + { 0xf91e, 0, 255, 12826 }, + { 0xf91f, 0, 255, 12830 }, + { 0xf920, 0, 255, 12834 }, + { 0xf921, 0, 255, 12838 }, + { 0xf922, 0, 255, 12842 }, + { 0xf923, 0, 255, 12846 }, + { 0xf924, 0, 255, 12850 }, + { 0xf925, 0, 255, 12854 }, + { 0xf926, 0, 255, 12858 }, + { 0xf927, 0, 255, 12862 }, + { 0xf928, 0, 255, 12866 }, + { 0xf929, 0, 255, 12870 }, + { 0xf92a, 0, 255, 12874 }, + { 0xf92b, 0, 255, 12878 }, + { 0xf92c, 0, 255, 12882 }, + { 0xf92d, 0, 255, 12886 }, + { 0xf92e, 0, 255, 12890 }, + { 0xf92f, 0, 255, 12894 }, + { 0xf930, 0, 255, 12898 }, + { 0xf931, 0, 255, 12902 }, + { 0xf932, 0, 255, 12906 }, + { 0xf933, 0, 255, 12910 }, + { 0xf934, 0, 255, 8358 }, + { 0xf935, 0, 255, 12914 }, + { 0xf936, 0, 255, 12918 }, + { 0xf937, 0, 255, 12922 }, + { 0xf938, 0, 255, 12926 }, + { 0xf939, 0, 255, 12930 }, + { 0xf93a, 0, 255, 12934 }, + { 0xf93b, 0, 255, 12938 }, + { 0xf93c, 0, 255, 12942 }, + { 0xf93d, 0, 255, 12946 }, + { 0xf93e, 0, 255, 12950 }, + { 0xf93f, 0, 255, 12954 }, + { 0xf940, 0, 255, 8650 }, + { 0xf941, 0, 255, 12958 }, + { 0xf942, 0, 255, 12962 }, + { 0xf943, 0, 255, 12966 }, + { 0xf944, 0, 255, 12970 }, + { 0xf945, 0, 255, 12974 }, + { 0xf946, 0, 255, 12978 }, + { 0xf947, 0, 255, 12982 }, + { 0xf948, 0, 255, 12986 }, + { 0xf949, 0, 255, 12990 }, + { 0xf94a, 0, 255, 12994 }, + { 0xf94b, 0, 255, 12998 }, + { 0xf94c, 0, 255, 13002 }, + { 0xf94d, 0, 255, 13006 }, + { 0xf94e, 0, 255, 13010 }, + { 0xf94f, 0, 255, 13014 }, + { 0xf950, 0, 255, 13018 }, + { 0xf951, 0, 255, 13022 }, + { 0xf952, 0, 255, 13026 }, + { 0xf953, 0, 255, 13030 }, + { 0xf954, 0, 255, 13034 }, + { 0xf955, 0, 255, 13038 }, + { 0xf956, 0, 255, 13042 }, + { 0xf957, 0, 255, 13046 }, + { 0xf958, 0, 255, 13050 }, + { 0xf959, 0, 255, 13054 }, + { 0xf95a, 0, 255, 13058 }, + { 0xf95b, 0, 255, 13062 }, + { 0xf95c, 0, 255, 12786 }, + { 0xf95d, 0, 255, 13066 }, + { 0xf95e, 0, 255, 13070 }, + { 0xf95f, 0, 255, 13074 }, + { 0xf960, 0, 255, 13078 }, + { 0xf961, 0, 255, 13082 }, + { 0xf962, 0, 255, 13086 }, + { 0xf963, 0, 255, 13090 }, + { 0xf964, 0, 255, 13094 }, + { 0xf965, 0, 255, 13098 }, + { 0xf966, 0, 255, 13102 }, + { 0xf967, 0, 255, 13106 }, + { 0xf968, 0, 255, 13110 }, + { 0xf969, 0, 255, 13114 }, + { 0xf96a, 0, 255, 13118 }, + { 0xf96b, 0, 255, 13122 }, + { 0xf96c, 0, 255, 13126 }, + { 0xf96d, 0, 255, 13130 }, + { 0xf96e, 0, 255, 13134 }, + { 0xf96f, 0, 255, 13138 }, + { 0xf970, 0, 255, 13142 }, + { 0xf971, 0, 255, 8502 }, + { 0xf972, 0, 255, 13146 }, + { 0xf973, 0, 255, 13150 }, + { 0xf974, 0, 255, 13154 }, + { 0xf975, 0, 255, 13158 }, + { 0xf976, 0, 255, 13162 }, + { 0xf977, 0, 255, 13166 }, + { 0xf978, 0, 255, 13170 }, + { 0xf979, 0, 255, 13174 }, + { 0xf97a, 0, 255, 13178 }, + { 0xf97b, 0, 255, 13182 }, + { 0xf97c, 0, 255, 13186 }, + { 0xf97d, 0, 255, 13190 }, + { 0xf97e, 0, 255, 13194 }, + { 0xf97f, 0, 255, 13198 }, + { 0xf980, 0, 255, 13202 }, + { 0xf981, 0, 255, 8010 }, + { 0xf982, 0, 255, 13206 }, + { 0xf983, 0, 255, 13210 }, + { 0xf984, 0, 255, 13214 }, + { 0xf985, 0, 255, 13218 }, + { 0xf986, 0, 255, 13222 }, + { 0xf987, 0, 255, 13226 }, + { 0xf988, 0, 255, 13230 }, + { 0xf989, 0, 255, 13234 }, + { 0xf98a, 0, 255, 7934 }, + { 0xf98b, 0, 255, 13238 }, + { 0xf98c, 0, 255, 13242 }, + { 0xf98d, 0, 255, 13246 }, + { 0xf98e, 0, 255, 13250 }, + { 0xf98f, 0, 255, 13254 }, + { 0xf990, 0, 255, 13258 }, + { 0xf991, 0, 255, 13262 }, + { 0xf992, 0, 255, 13266 }, + { 0xf993, 0, 255, 13270 }, + { 0xf994, 0, 255, 13274 }, + { 0xf995, 0, 255, 13278 }, + { 0xf996, 0, 255, 13282 }, + { 0xf997, 0, 255, 13286 }, + { 0xf998, 0, 255, 13290 }, + { 0xf999, 0, 255, 13294 }, + { 0xf99a, 0, 255, 13298 }, + { 0xf99b, 0, 255, 13302 }, + { 0xf99c, 0, 255, 13306 }, + { 0xf99d, 0, 255, 13310 }, + { 0xf99e, 0, 255, 13314 }, + { 0xf99f, 0, 255, 13318 }, + { 0xf9a0, 0, 255, 13322 }, + { 0xf9a1, 0, 255, 13138 }, + { 0xf9a2, 0, 255, 13326 }, + { 0xf9a3, 0, 255, 13330 }, + { 0xf9a4, 0, 255, 13334 }, + { 0xf9a5, 0, 255, 13338 }, + { 0xf9a6, 0, 255, 13342 }, + { 0xf9a7, 0, 255, 13346 }, + { 0xf9a8, 0, 255, 13350 }, + { 0xf9a9, 0, 255, 13354 }, + { 0xf9aa, 0, 255, 13074 }, + { 0xf9ab, 0, 255, 13358 }, + { 0xf9ac, 0, 255, 13362 }, + { 0xf9ad, 0, 255, 13366 }, + { 0xf9ae, 0, 255, 13370 }, + { 0xf9af, 0, 255, 13374 }, + { 0xf9b0, 0, 255, 13378 }, + { 0xf9b1, 0, 255, 13382 }, + { 0xf9b2, 0, 255, 13386 }, + { 0xf9b3, 0, 255, 13390 }, + { 0xf9b4, 0, 255, 13394 }, + { 0xf9b5, 0, 255, 13398 }, + { 0xf9b6, 0, 255, 13402 }, + { 0xf9b7, 0, 255, 13406 }, + { 0xf9b8, 0, 255, 13410 }, + { 0xf9b9, 0, 255, 13414 }, + { 0xf9ba, 0, 255, 13418 }, + { 0xf9bb, 0, 255, 13422 }, + { 0xf9bc, 0, 255, 13426 }, + { 0xf9bd, 0, 255, 13430 }, + { 0xf9be, 0, 255, 13434 }, + { 0xf9bf, 0, 255, 12786 }, + { 0xf9c0, 0, 255, 13438 }, + { 0xf9c1, 0, 255, 13442 }, + { 0xf9c2, 0, 255, 13446 }, + { 0xf9c3, 0, 255, 13450 }, + { 0xf9c4, 0, 255, 8706 }, + { 0xf9c5, 0, 255, 13454 }, + { 0xf9c6, 0, 255, 13458 }, + { 0xf9c7, 0, 255, 13462 }, + { 0xf9c8, 0, 255, 13466 }, + { 0xf9c9, 0, 255, 13470 }, + { 0xf9ca, 0, 255, 13474 }, + { 0xf9cb, 0, 255, 13478 }, + { 0xf9cc, 0, 255, 13482 }, + { 0xf9cd, 0, 255, 13486 }, + { 0xf9ce, 0, 255, 13490 }, + { 0xf9cf, 0, 255, 13494 }, + { 0xf9d0, 0, 255, 13498 }, + { 0xf9d1, 0, 255, 10246 }, + { 0xf9d2, 0, 255, 13502 }, + { 0xf9d3, 0, 255, 13506 }, + { 0xf9d4, 0, 255, 13510 }, + { 0xf9d5, 0, 255, 13514 }, + { 0xf9d6, 0, 255, 13518 }, + { 0xf9d7, 0, 255, 13522 }, + { 0xf9d8, 0, 255, 13526 }, + { 0xf9d9, 0, 255, 13530 }, + { 0xf9da, 0, 255, 13534 }, + { 0xf9db, 0, 255, 13082 }, + { 0xf9dc, 0, 255, 13538 }, + { 0xf9dd, 0, 255, 13542 }, + { 0xf9de, 0, 255, 13546 }, + { 0xf9df, 0, 255, 13550 }, + { 0xf9e0, 0, 255, 13554 }, + { 0xf9e1, 0, 255, 13558 }, + { 0xf9e2, 0, 255, 13562 }, + { 0xf9e3, 0, 255, 13566 }, + { 0xf9e4, 0, 255, 13570 }, + { 0xf9e5, 0, 255, 13574 }, + { 0xf9e6, 0, 255, 13578 }, + { 0xf9e7, 0, 255, 13582 }, + { 0xf9e8, 0, 255, 13586 }, + { 0xf9e9, 0, 255, 8522 }, + { 0xf9ea, 0, 255, 13590 }, + { 0xf9eb, 0, 255, 13594 }, + { 0xf9ec, 0, 255, 13598 }, + { 0xf9ed, 0, 255, 13602 }, + { 0xf9ee, 0, 255, 13606 }, + { 0xf9ef, 0, 255, 13610 }, + { 0xf9f0, 0, 255, 13614 }, + { 0xf9f1, 0, 255, 13618 }, + { 0xf9f2, 0, 255, 13622 }, + { 0xf9f3, 0, 255, 13626 }, + { 0xf9f4, 0, 255, 13630 }, + { 0xf9f5, 0, 255, 13634 }, + { 0xf9f6, 0, 255, 13638 }, + { 0xf9f7, 0, 255, 8326 }, + { 0xf9f8, 0, 255, 13642 }, + { 0xf9f9, 0, 255, 13646 }, + { 0xf9fa, 0, 255, 13650 }, + { 0xf9fb, 0, 255, 13654 }, + { 0xf9fc, 0, 255, 13658 }, + { 0xf9fd, 0, 255, 13662 }, + { 0xf9fe, 0, 255, 13666 }, + { 0xf9ff, 0, 255, 13670 }, + { 0xfa00, 0, 255, 13674 }, + { 0xfa01, 0, 255, 13678 }, + { 0xfa02, 0, 255, 13682 }, + { 0xfa03, 0, 255, 13686 }, + { 0xfa04, 0, 255, 13690 }, + { 0xfa05, 0, 255, 13694 }, + { 0xfa06, 0, 255, 13698 }, + { 0xfa07, 0, 255, 13702 }, + { 0xfa08, 0, 255, 8434 }, + { 0xfa09, 0, 255, 13706 }, + { 0xfa0a, 0, 255, 8446 }, + { 0xfa0b, 0, 255, 13710 }, + { 0xfa0c, 0, 255, 13714 }, + { 0xfa0d, 0, 255, 13718 }, + { 0xfa10, 0, 255, 13722 }, + { 0xfa12, 0, 255, 13726 }, + { 0xfa15, 0, 255, 13730 }, + { 0xfa16, 0, 255, 13734 }, + { 0xfa17, 0, 255, 13738 }, + { 0xfa18, 0, 255, 13742 }, + { 0xfa19, 0, 255, 13746 }, + { 0xfa1a, 0, 255, 13750 }, + { 0xfa1b, 0, 255, 13754 }, + { 0xfa1c, 0, 255, 13758 }, + { 0xfa1d, 0, 255, 13762 }, + { 0xfa1e, 0, 255, 8354 }, + { 0xfa20, 0, 255, 13766 }, + { 0xfa22, 0, 255, 13770 }, + { 0xfa25, 0, 255, 13774 }, + { 0xfa26, 0, 255, 13778 }, + { 0xfa2a, 0, 255, 13782 }, + { 0xfa2b, 0, 255, 13786 }, + { 0xfa2c, 0, 255, 13790 }, + { 0xfa2d, 0, 255, 13794 }, + { 0xfa30, 0, 255, 13798 }, + { 0xfa31, 0, 255, 13802 }, + { 0xfa32, 0, 255, 13806 }, + { 0xfa33, 0, 255, 13810 }, + { 0xfa34, 0, 255, 13814 }, + { 0xfa35, 0, 255, 13818 }, + { 0xfa36, 0, 255, 13822 }, + { 0xfa37, 0, 255, 13826 }, + { 0xfa38, 0, 255, 13830 }, + { 0xfa39, 0, 255, 13834 }, + { 0xfa3a, 0, 255, 13838 }, + { 0xfa3b, 0, 255, 13842 }, + { 0xfa3c, 0, 255, 8038 }, + { 0xfa3d, 0, 255, 13846 }, + { 0xfa3e, 0, 255, 13850 }, + { 0xfa3f, 0, 255, 13854 }, + { 0xfa40, 0, 255, 13858 }, + { 0xfa41, 0, 255, 13862 }, + { 0xfa42, 0, 255, 13866 }, + { 0xfa43, 0, 255, 13870 }, + { 0xfa44, 0, 255, 13874 }, + { 0xfa45, 0, 255, 13878 }, + { 0xfa46, 0, 255, 13882 }, + { 0xfa47, 0, 255, 13886 }, + { 0xfa48, 0, 255, 13890 }, + { 0xfa49, 0, 255, 13894 }, + { 0xfa4a, 0, 255, 13898 }, + { 0xfa4b, 0, 255, 13902 }, + { 0xfa4c, 0, 255, 10266 }, + { 0xfa4d, 0, 255, 13906 }, + { 0xfa4e, 0, 255, 13910 }, + { 0xfa4f, 0, 255, 13914 }, + { 0xfa50, 0, 255, 13918 }, + { 0xfa51, 0, 255, 10282 }, + { 0xfa52, 0, 255, 13922 }, + { 0xfa53, 0, 255, 13926 }, + { 0xfa54, 0, 255, 13930 }, + { 0xfa55, 0, 255, 13934 }, + { 0xfa56, 0, 255, 13938 }, + { 0xfa57, 0, 255, 13282 }, + { 0xfa58, 0, 255, 13942 }, + { 0xfa59, 0, 255, 13946 }, + { 0xfa5a, 0, 255, 13950 }, + { 0xfa5b, 0, 255, 13954 }, + { 0xfa5c, 0, 255, 13958 }, + { 0xfa5d, 0, 255, 13962 }, + { 0xfa5e, 0, 255, 13962 }, + { 0xfa5f, 0, 255, 13966 }, + { 0xfa60, 0, 255, 13970 }, + { 0xfa61, 0, 255, 13974 }, + { 0xfa62, 0, 255, 13978 }, + { 0xfa63, 0, 255, 13982 }, + { 0xfa64, 0, 255, 13986 }, + { 0xfa65, 0, 255, 13990 }, + { 0xfa66, 0, 255, 13994 }, + { 0xfa67, 0, 255, 13774 }, + { 0xfa68, 0, 255, 13998 }, + { 0xfa69, 0, 255, 14002 }, + { 0xfa6a, 0, 255, 14006 }, + { 0xfb00, 255, 0, 14010 }, + { 0xfb01, 255, 0, 14016 }, + { 0xfb02, 255, 0, 14022 }, + { 0xfb03, 255, 0, 14028 }, + { 0xfb04, 255, 0, 14036 }, + { 0xfb05, 255, 0, 14044 }, + { 0xfb06, 255, 0, 14044 }, + { 0xfb13, 255, 0, 14050 }, + { 0xfb14, 255, 0, 14056 }, + { 0xfb15, 255, 0, 14062 }, + { 0xfb16, 255, 0, 14068 }, + { 0xfb17, 255, 0, 14074 }, + { 0xfb1d, 0, 255, 14080 }, + { 0xfb1f, 0, 255, 14086 }, + { 0xfb20, 255, 0, 14092 }, + { 0xfb21, 255, 0, 6560 }, + { 0xfb22, 255, 0, 6572 }, + { 0xfb23, 255, 0, 14096 }, + { 0xfb24, 255, 0, 14100 }, + { 0xfb25, 255, 0, 14104 }, + { 0xfb26, 255, 0, 14108 }, + { 0xfb27, 255, 0, 14112 }, + { 0xfb28, 255, 0, 14116 }, + { 0xfb29, 255, 0, 6384 }, + { 0xfb2a, 0, 255, 14120 }, + { 0xfb2b, 0, 255, 14126 }, + { 0xfb2c, 0, 255, 14132 }, + { 0xfb2d, 0, 255, 14140 }, + { 0xfb2e, 0, 255, 14148 }, + { 0xfb2f, 0, 255, 14154 }, + { 0xfb30, 0, 255, 14160 }, + { 0xfb31, 0, 255, 14166 }, + { 0xfb32, 0, 255, 14172 }, + { 0xfb33, 0, 255, 14178 }, + { 0xfb34, 0, 255, 14184 }, + { 0xfb35, 0, 255, 14190 }, + { 0xfb36, 0, 255, 14196 }, + { 0xfb38, 0, 255, 14202 }, + { 0xfb39, 0, 255, 14208 }, + { 0xfb3a, 0, 255, 14214 }, + { 0xfb3b, 0, 255, 14220 }, + { 0xfb3c, 0, 255, 14226 }, + { 0xfb3e, 0, 255, 14232 }, + { 0xfb40, 0, 255, 14238 }, + { 0xfb41, 0, 255, 14244 }, + { 0xfb43, 0, 255, 14250 }, + { 0xfb44, 0, 255, 14256 }, + { 0xfb46, 0, 255, 14262 }, + { 0xfb47, 0, 255, 14268 }, + { 0xfb48, 0, 255, 14274 }, + { 0xfb49, 0, 255, 14280 }, + { 0xfb4a, 0, 255, 14286 }, + { 0xfb4b, 0, 255, 14292 }, + { 0xfb4c, 0, 255, 14298 }, + { 0xfb4d, 0, 255, 14304 }, + { 0xfb4e, 0, 255, 14310 }, + { 0xfb4f, 255, 0, 14316 }, + { 0xfb50, 255, 0, 14322 }, + { 0xfb51, 255, 0, 14322 }, + { 0xfb52, 255, 0, 14326 }, + { 0xfb53, 255, 0, 14326 }, + { 0xfb54, 255, 0, 14326 }, + { 0xfb55, 255, 0, 14326 }, + { 0xfb56, 255, 0, 14330 }, + { 0xfb57, 255, 0, 14330 }, + { 0xfb58, 255, 0, 14330 }, + { 0xfb59, 255, 0, 14330 }, + { 0xfb5a, 255, 0, 14334 }, + { 0xfb5b, 255, 0, 14334 }, + { 0xfb5c, 255, 0, 14334 }, + { 0xfb5d, 255, 0, 14334 }, + { 0xfb5e, 255, 0, 14338 }, + { 0xfb5f, 255, 0, 14338 }, + { 0xfb60, 255, 0, 14338 }, + { 0xfb61, 255, 0, 14338 }, + { 0xfb62, 255, 0, 14342 }, + { 0xfb63, 255, 0, 14342 }, + { 0xfb64, 255, 0, 14342 }, + { 0xfb65, 255, 0, 14342 }, + { 0xfb66, 255, 0, 14346 }, + { 0xfb67, 255, 0, 14346 }, + { 0xfb68, 255, 0, 14346 }, + { 0xfb69, 255, 0, 14346 }, + { 0xfb6a, 255, 0, 14350 }, + { 0xfb6b, 255, 0, 14350 }, + { 0xfb6c, 255, 0, 14350 }, + { 0xfb6d, 255, 0, 14350 }, + { 0xfb6e, 255, 0, 14354 }, + { 0xfb6f, 255, 0, 14354 }, + { 0xfb70, 255, 0, 14354 }, + { 0xfb71, 255, 0, 14354 }, + { 0xfb72, 255, 0, 14358 }, + { 0xfb73, 255, 0, 14358 }, + { 0xfb74, 255, 0, 14358 }, + { 0xfb75, 255, 0, 14358 }, + { 0xfb76, 255, 0, 14362 }, + { 0xfb77, 255, 0, 14362 }, + { 0xfb78, 255, 0, 14362 }, + { 0xfb79, 255, 0, 14362 }, + { 0xfb7a, 255, 0, 14366 }, + { 0xfb7b, 255, 0, 14366 }, + { 0xfb7c, 255, 0, 14366 }, + { 0xfb7d, 255, 0, 14366 }, + { 0xfb7e, 255, 0, 14370 }, + { 0xfb7f, 255, 0, 14370 }, + { 0xfb80, 255, 0, 14370 }, + { 0xfb81, 255, 0, 14370 }, + { 0xfb82, 255, 0, 14374 }, + { 0xfb83, 255, 0, 14374 }, + { 0xfb84, 255, 0, 14378 }, + { 0xfb85, 255, 0, 14378 }, + { 0xfb86, 255, 0, 14382 }, + { 0xfb87, 255, 0, 14382 }, + { 0xfb88, 255, 0, 14386 }, + { 0xfb89, 255, 0, 14386 }, + { 0xfb8a, 255, 0, 14390 }, + { 0xfb8b, 255, 0, 14390 }, + { 0xfb8c, 255, 0, 14394 }, + { 0xfb8d, 255, 0, 14394 }, + { 0xfb8e, 255, 0, 14398 }, + { 0xfb8f, 255, 0, 14398 }, + { 0xfb90, 255, 0, 14398 }, + { 0xfb91, 255, 0, 14398 }, + { 0xfb92, 255, 0, 14402 }, + { 0xfb93, 255, 0, 14402 }, + { 0xfb94, 255, 0, 14402 }, + { 0xfb95, 255, 0, 14402 }, + { 0xfb96, 255, 0, 14406 }, + { 0xfb97, 255, 0, 14406 }, + { 0xfb98, 255, 0, 14406 }, + { 0xfb99, 255, 0, 14406 }, + { 0xfb9a, 255, 0, 14410 }, + { 0xfb9b, 255, 0, 14410 }, + { 0xfb9c, 255, 0, 14410 }, + { 0xfb9d, 255, 0, 14410 }, + { 0xfb9e, 255, 0, 14414 }, + { 0xfb9f, 255, 0, 14414 }, + { 0xfba0, 255, 0, 14418 }, + { 0xfba1, 255, 0, 14418 }, + { 0xfba2, 255, 0, 14418 }, + { 0xfba3, 255, 0, 14418 }, + { 0xfba4, 255, 0, 2442 }, + { 0xfba5, 255, 0, 2442 }, + { 0xfba6, 255, 0, 14422 }, + { 0xfba7, 255, 0, 14422 }, + { 0xfba8, 255, 0, 14422 }, + { 0xfba9, 255, 0, 14422 }, + { 0xfbaa, 255, 0, 14426 }, + { 0xfbab, 255, 0, 14426 }, + { 0xfbac, 255, 0, 14426 }, + { 0xfbad, 255, 0, 14426 }, + { 0xfbae, 255, 0, 14430 }, + { 0xfbaf, 255, 0, 14430 }, + { 0xfbb0, 255, 0, 2454 }, + { 0xfbb1, 255, 0, 2454 }, + { 0xfbd3, 255, 0, 14434 }, + { 0xfbd4, 255, 0, 14434 }, + { 0xfbd5, 255, 0, 14434 }, + { 0xfbd6, 255, 0, 14434 }, + { 0xfbd7, 255, 0, 14438 }, + { 0xfbd8, 255, 0, 14438 }, + { 0xfbd9, 255, 0, 14442 }, + { 0xfbda, 255, 0, 14442 }, + { 0xfbdb, 255, 0, 14446 }, + { 0xfbdc, 255, 0, 14446 }, + { 0xfbdd, 255, 0, 2430 }, + { 0xfbde, 255, 0, 14450 }, + { 0xfbdf, 255, 0, 14450 }, + { 0xfbe0, 255, 0, 14454 }, + { 0xfbe1, 255, 0, 14454 }, + { 0xfbe2, 255, 0, 14458 }, + { 0xfbe3, 255, 0, 14458 }, + { 0xfbe4, 255, 0, 14462 }, + { 0xfbe5, 255, 0, 14462 }, + { 0xfbe6, 255, 0, 14462 }, + { 0xfbe7, 255, 0, 14462 }, + { 0xfbe8, 255, 0, 14466 }, + { 0xfbe9, 255, 0, 14466 }, + { 0xfbea, 255, 0, 14470 }, + { 0xfbeb, 255, 0, 14470 }, + { 0xfbec, 255, 0, 14478 }, + { 0xfbed, 255, 0, 14478 }, + { 0xfbee, 255, 0, 14486 }, + { 0xfbef, 255, 0, 14486 }, + { 0xfbf0, 255, 0, 14494 }, + { 0xfbf1, 255, 0, 14494 }, + { 0xfbf2, 255, 0, 14502 }, + { 0xfbf3, 255, 0, 14502 }, + { 0xfbf4, 255, 0, 14510 }, + { 0xfbf5, 255, 0, 14510 }, + { 0xfbf6, 255, 0, 14518 }, + { 0xfbf7, 255, 0, 14518 }, + { 0xfbf8, 255, 0, 14518 }, + { 0xfbf9, 255, 0, 14526 }, + { 0xfbfa, 255, 0, 14526 }, + { 0xfbfb, 255, 0, 14526 }, + { 0xfbfc, 255, 0, 14534 }, + { 0xfbfd, 255, 0, 14534 }, + { 0xfbfe, 255, 0, 14534 }, + { 0xfbff, 255, 0, 14534 }, + { 0xfc00, 255, 0, 14538 }, + { 0xfc01, 255, 0, 14546 }, + { 0xfc02, 255, 0, 14554 }, + { 0xfc03, 255, 0, 14526 }, + { 0xfc04, 255, 0, 14562 }, + { 0xfc05, 255, 0, 14570 }, + { 0xfc06, 255, 0, 14576 }, + { 0xfc07, 255, 0, 14582 }, + { 0xfc08, 255, 0, 14588 }, + { 0xfc09, 255, 0, 14594 }, + { 0xfc0a, 255, 0, 14600 }, + { 0xfc0b, 255, 0, 14606 }, + { 0xfc0c, 255, 0, 14612 }, + { 0xfc0d, 255, 0, 14618 }, + { 0xfc0e, 255, 0, 14624 }, + { 0xfc0f, 255, 0, 14630 }, + { 0xfc10, 255, 0, 14636 }, + { 0xfc11, 255, 0, 14642 }, + { 0xfc12, 255, 0, 14648 }, + { 0xfc13, 255, 0, 14654 }, + { 0xfc14, 255, 0, 14660 }, + { 0xfc15, 255, 0, 14666 }, + { 0xfc16, 255, 0, 14672 }, + { 0xfc17, 255, 0, 14678 }, + { 0xfc18, 255, 0, 14684 }, + { 0xfc19, 255, 0, 14690 }, + { 0xfc1a, 255, 0, 14696 }, + { 0xfc1b, 255, 0, 14702 }, + { 0xfc1c, 255, 0, 14708 }, + { 0xfc1d, 255, 0, 14714 }, + { 0xfc1e, 255, 0, 14720 }, + { 0xfc1f, 255, 0, 14726 }, + { 0xfc20, 255, 0, 14732 }, + { 0xfc21, 255, 0, 14738 }, + { 0xfc22, 255, 0, 14744 }, + { 0xfc23, 255, 0, 14750 }, + { 0xfc24, 255, 0, 14756 }, + { 0xfc25, 255, 0, 14762 }, + { 0xfc26, 255, 0, 14768 }, + { 0xfc27, 255, 0, 14774 }, + { 0xfc28, 255, 0, 14780 }, + { 0xfc29, 255, 0, 14786 }, + { 0xfc2a, 255, 0, 14792 }, + { 0xfc2b, 255, 0, 14798 }, + { 0xfc2c, 255, 0, 14804 }, + { 0xfc2d, 255, 0, 14810 }, + { 0xfc2e, 255, 0, 14816 }, + { 0xfc2f, 255, 0, 14822 }, + { 0xfc30, 255, 0, 14828 }, + { 0xfc31, 255, 0, 14834 }, + { 0xfc32, 255, 0, 14840 }, + { 0xfc33, 255, 0, 14846 }, + { 0xfc34, 255, 0, 14852 }, + { 0xfc35, 255, 0, 14858 }, + { 0xfc36, 255, 0, 14864 }, + { 0xfc37, 255, 0, 14870 }, + { 0xfc38, 255, 0, 14876 }, + { 0xfc39, 255, 0, 14882 }, + { 0xfc3a, 255, 0, 14888 }, + { 0xfc3b, 255, 0, 14894 }, + { 0xfc3c, 255, 0, 14900 }, + { 0xfc3d, 255, 0, 14906 }, + { 0xfc3e, 255, 0, 14912 }, + { 0xfc3f, 255, 0, 14918 }, + { 0xfc40, 255, 0, 14924 }, + { 0xfc41, 255, 0, 14930 }, + { 0xfc42, 255, 0, 14936 }, + { 0xfc43, 255, 0, 14942 }, + { 0xfc44, 255, 0, 14948 }, + { 0xfc45, 255, 0, 14954 }, + { 0xfc46, 255, 0, 14960 }, + { 0xfc47, 255, 0, 14966 }, + { 0xfc48, 255, 0, 14972 }, + { 0xfc49, 255, 0, 14978 }, + { 0xfc4a, 255, 0, 14984 }, + { 0xfc4b, 255, 0, 14990 }, + { 0xfc4c, 255, 0, 14996 }, + { 0xfc4d, 255, 0, 15002 }, + { 0xfc4e, 255, 0, 15008 }, + { 0xfc4f, 255, 0, 15014 }, + { 0xfc50, 255, 0, 15020 }, + { 0xfc51, 255, 0, 15026 }, + { 0xfc52, 255, 0, 15032 }, + { 0xfc53, 255, 0, 15038 }, + { 0xfc54, 255, 0, 15044 }, + { 0xfc55, 255, 0, 15050 }, + { 0xfc56, 255, 0, 15056 }, + { 0xfc57, 255, 0, 15062 }, + { 0xfc58, 255, 0, 15068 }, + { 0xfc59, 255, 0, 15074 }, + { 0xfc5a, 255, 0, 15080 }, + { 0xfc5b, 255, 0, 15086 }, + { 0xfc5c, 255, 0, 15092 }, + { 0xfc5d, 255, 0, 15098 }, + { 0xfc5e, 255, 0, 15104 }, + { 0xfc5f, 255, 0, 15112 }, + { 0xfc60, 255, 0, 15120 }, + { 0xfc61, 255, 0, 15128 }, + { 0xfc62, 255, 0, 15136 }, + { 0xfc63, 255, 0, 15144 }, + { 0xfc64, 255, 0, 15152 }, + { 0xfc65, 255, 0, 15160 }, + { 0xfc66, 255, 0, 14554 }, + { 0xfc67, 255, 0, 15168 }, + { 0xfc68, 255, 0, 14526 }, + { 0xfc69, 255, 0, 14562 }, + { 0xfc6a, 255, 0, 15176 }, + { 0xfc6b, 255, 0, 15182 }, + { 0xfc6c, 255, 0, 14588 }, + { 0xfc6d, 255, 0, 15188 }, + { 0xfc6e, 255, 0, 14594 }, + { 0xfc6f, 255, 0, 14600 }, + { 0xfc70, 255, 0, 15194 }, + { 0xfc71, 255, 0, 15200 }, + { 0xfc72, 255, 0, 14624 }, + { 0xfc73, 255, 0, 15206 }, + { 0xfc74, 255, 0, 14630 }, + { 0xfc75, 255, 0, 14636 }, + { 0xfc76, 255, 0, 15212 }, + { 0xfc77, 255, 0, 15218 }, + { 0xfc78, 255, 0, 14648 }, + { 0xfc79, 255, 0, 15224 }, + { 0xfc7a, 255, 0, 14654 }, + { 0xfc7b, 255, 0, 14660 }, + { 0xfc7c, 255, 0, 14834 }, + { 0xfc7d, 255, 0, 14840 }, + { 0xfc7e, 255, 0, 14858 }, + { 0xfc7f, 255, 0, 14864 }, + { 0xfc80, 255, 0, 14870 }, + { 0xfc81, 255, 0, 14894 }, + { 0xfc82, 255, 0, 14900 }, + { 0xfc83, 255, 0, 14906 }, + { 0xfc84, 255, 0, 14912 }, + { 0xfc85, 255, 0, 14936 }, + { 0xfc86, 255, 0, 14942 }, + { 0xfc87, 255, 0, 14948 }, + { 0xfc88, 255, 0, 15230 }, + { 0xfc89, 255, 0, 14972 }, + { 0xfc8a, 255, 0, 15236 }, + { 0xfc8b, 255, 0, 15242 }, + { 0xfc8c, 255, 0, 15008 }, + { 0xfc8d, 255, 0, 15248 }, + { 0xfc8e, 255, 0, 15014 }, + { 0xfc8f, 255, 0, 15020 }, + { 0xfc90, 255, 0, 15098 }, + { 0xfc91, 255, 0, 15254 }, + { 0xfc92, 255, 0, 15260 }, + { 0xfc93, 255, 0, 15068 }, + { 0xfc94, 255, 0, 15266 }, + { 0xfc95, 255, 0, 15074 }, + { 0xfc96, 255, 0, 15080 }, + { 0xfc97, 255, 0, 14538 }, + { 0xfc98, 255, 0, 14546 }, + { 0xfc99, 255, 0, 15272 }, + { 0xfc9a, 255, 0, 14554 }, + { 0xfc9b, 255, 0, 15280 }, + { 0xfc9c, 255, 0, 14570 }, + { 0xfc9d, 255, 0, 14576 }, + { 0xfc9e, 255, 0, 14582 }, + { 0xfc9f, 255, 0, 14588 }, + { 0xfca0, 255, 0, 15288 }, + { 0xfca1, 255, 0, 14606 }, + { 0xfca2, 255, 0, 14612 }, + { 0xfca3, 255, 0, 14618 }, + { 0xfca4, 255, 0, 14624 }, + { 0xfca5, 255, 0, 15294 }, + { 0xfca6, 255, 0, 14648 }, + { 0xfca7, 255, 0, 14666 }, + { 0xfca8, 255, 0, 14672 }, + { 0xfca9, 255, 0, 14678 }, + { 0xfcaa, 255, 0, 14684 }, + { 0xfcab, 255, 0, 14690 }, + { 0xfcac, 255, 0, 14702 }, + { 0xfcad, 255, 0, 14708 }, + { 0xfcae, 255, 0, 14714 }, + { 0xfcaf, 255, 0, 14720 }, + { 0xfcb0, 255, 0, 14726 }, + { 0xfcb1, 255, 0, 14732 }, + { 0xfcb2, 255, 0, 15300 }, + { 0xfcb3, 255, 0, 14738 }, + { 0xfcb4, 255, 0, 14744 }, + { 0xfcb5, 255, 0, 14750 }, + { 0xfcb6, 255, 0, 14756 }, + { 0xfcb7, 255, 0, 14762 }, + { 0xfcb8, 255, 0, 14768 }, + { 0xfcb9, 255, 0, 14780 }, + { 0xfcba, 255, 0, 14786 }, + { 0xfcbb, 255, 0, 14792 }, + { 0xfcbc, 255, 0, 14798 }, + { 0xfcbd, 255, 0, 14804 }, + { 0xfcbe, 255, 0, 14810 }, + { 0xfcbf, 255, 0, 14816 }, + { 0xfcc0, 255, 0, 14822 }, + { 0xfcc1, 255, 0, 14828 }, + { 0xfcc2, 255, 0, 14846 }, + { 0xfcc3, 255, 0, 14852 }, + { 0xfcc4, 255, 0, 14876 }, + { 0xfcc5, 255, 0, 14882 }, + { 0xfcc6, 255, 0, 14888 }, + { 0xfcc7, 255, 0, 14894 }, + { 0xfcc8, 255, 0, 14900 }, + { 0xfcc9, 255, 0, 14918 }, + { 0xfcca, 255, 0, 14924 }, + { 0xfccb, 255, 0, 14930 }, + { 0xfccc, 255, 0, 14936 }, + { 0xfccd, 255, 0, 15306 }, + { 0xfcce, 255, 0, 14954 }, + { 0xfccf, 255, 0, 14960 }, + { 0xfcd0, 255, 0, 14966 }, + { 0xfcd1, 255, 0, 14972 }, + { 0xfcd2, 255, 0, 14990 }, + { 0xfcd3, 255, 0, 14996 }, + { 0xfcd4, 255, 0, 15002 }, + { 0xfcd5, 255, 0, 15008 }, + { 0xfcd6, 255, 0, 15312 }, + { 0xfcd7, 255, 0, 15026 }, + { 0xfcd8, 255, 0, 15032 }, + { 0xfcd9, 255, 0, 15318 }, + { 0xfcda, 255, 0, 15050 }, + { 0xfcdb, 255, 0, 15056 }, + { 0xfcdc, 255, 0, 15062 }, + { 0xfcdd, 255, 0, 15068 }, + { 0xfcde, 255, 0, 15324 }, + { 0xfcdf, 255, 0, 14554 }, + { 0xfce0, 255, 0, 15280 }, + { 0xfce1, 255, 0, 14588 }, + { 0xfce2, 255, 0, 15288 }, + { 0xfce3, 255, 0, 14624 }, + { 0xfce4, 255, 0, 15294 }, + { 0xfce5, 255, 0, 14648 }, + { 0xfce6, 255, 0, 15330 }, + { 0xfce7, 255, 0, 14726 }, + { 0xfce8, 255, 0, 15336 }, + { 0xfce9, 255, 0, 15342 }, + { 0xfcea, 255, 0, 15348 }, + { 0xfceb, 255, 0, 14894 }, + { 0xfcec, 255, 0, 14900 }, + { 0xfced, 255, 0, 14936 }, + { 0xfcee, 255, 0, 15008 }, + { 0xfcef, 255, 0, 15312 }, + { 0xfcf0, 255, 0, 15068 }, + { 0xfcf1, 255, 0, 15324 }, + { 0xfcf2, 255, 0, 15354 }, + { 0xfcf3, 255, 0, 15362 }, + { 0xfcf4, 255, 0, 15370 }, + { 0xfcf5, 255, 0, 15378 }, + { 0xfcf6, 255, 0, 15384 }, + { 0xfcf7, 255, 0, 15390 }, + { 0xfcf8, 255, 0, 15396 }, + { 0xfcf9, 255, 0, 15402 }, + { 0xfcfa, 255, 0, 15408 }, + { 0xfcfb, 255, 0, 15414 }, + { 0xfcfc, 255, 0, 15420 }, + { 0xfcfd, 255, 0, 15426 }, + { 0xfcfe, 255, 0, 15432 }, + { 0xfcff, 255, 0, 15438 }, + { 0xfd00, 255, 0, 15444 }, + { 0xfd01, 255, 0, 15450 }, + { 0xfd02, 255, 0, 15456 }, + { 0xfd03, 255, 0, 15462 }, + { 0xfd04, 255, 0, 15468 }, + { 0xfd05, 255, 0, 15474 }, + { 0xfd06, 255, 0, 15480 }, + { 0xfd07, 255, 0, 15486 }, + { 0xfd08, 255, 0, 15492 }, + { 0xfd09, 255, 0, 15498 }, + { 0xfd0a, 255, 0, 15504 }, + { 0xfd0b, 255, 0, 15510 }, + { 0xfd0c, 255, 0, 15342 }, + { 0xfd0d, 255, 0, 15516 }, + { 0xfd0e, 255, 0, 15522 }, + { 0xfd0f, 255, 0, 15528 }, + { 0xfd10, 255, 0, 15534 }, + { 0xfd11, 255, 0, 15378 }, + { 0xfd12, 255, 0, 15384 }, + { 0xfd13, 255, 0, 15390 }, + { 0xfd14, 255, 0, 15396 }, + { 0xfd15, 255, 0, 15402 }, + { 0xfd16, 255, 0, 15408 }, + { 0xfd17, 255, 0, 15414 }, + { 0xfd18, 255, 0, 15420 }, + { 0xfd19, 255, 0, 15426 }, + { 0xfd1a, 255, 0, 15432 }, + { 0xfd1b, 255, 0, 15438 }, + { 0xfd1c, 255, 0, 15444 }, + { 0xfd1d, 255, 0, 15450 }, + { 0xfd1e, 255, 0, 15456 }, + { 0xfd1f, 255, 0, 15462 }, + { 0xfd20, 255, 0, 15468 }, + { 0xfd21, 255, 0, 15474 }, + { 0xfd22, 255, 0, 15480 }, + { 0xfd23, 255, 0, 15486 }, + { 0xfd24, 255, 0, 15492 }, + { 0xfd25, 255, 0, 15498 }, + { 0xfd26, 255, 0, 15504 }, + { 0xfd27, 255, 0, 15510 }, + { 0xfd28, 255, 0, 15342 }, + { 0xfd29, 255, 0, 15516 }, + { 0xfd2a, 255, 0, 15522 }, + { 0xfd2b, 255, 0, 15528 }, + { 0xfd2c, 255, 0, 15534 }, + { 0xfd2d, 255, 0, 15498 }, + { 0xfd2e, 255, 0, 15504 }, + { 0xfd2f, 255, 0, 15510 }, + { 0xfd30, 255, 0, 15342 }, + { 0xfd31, 255, 0, 15336 }, + { 0xfd32, 255, 0, 15348 }, + { 0xfd33, 255, 0, 14774 }, + { 0xfd34, 255, 0, 14708 }, + { 0xfd35, 255, 0, 14714 }, + { 0xfd36, 255, 0, 14720 }, + { 0xfd37, 255, 0, 15498 }, + { 0xfd38, 255, 0, 15504 }, + { 0xfd39, 255, 0, 15510 }, + { 0xfd3a, 255, 0, 14774 }, + { 0xfd3b, 255, 0, 14780 }, + { 0xfd3c, 255, 0, 15540 }, + { 0xfd3d, 255, 0, 15540 }, + { 0xfd50, 255, 0, 15546 }, + { 0xfd51, 255, 0, 15554 }, + { 0xfd52, 255, 0, 15554 }, + { 0xfd53, 255, 0, 15562 }, + { 0xfd54, 255, 0, 15570 }, + { 0xfd55, 255, 0, 15578 }, + { 0xfd56, 255, 0, 15586 }, + { 0xfd57, 255, 0, 15594 }, + { 0xfd58, 255, 0, 15602 }, + { 0xfd59, 255, 0, 15602 }, + { 0xfd5a, 255, 0, 15610 }, + { 0xfd5b, 255, 0, 15618 }, + { 0xfd5c, 255, 0, 15626 }, + { 0xfd5d, 255, 0, 15634 }, + { 0xfd5e, 255, 0, 15642 }, + { 0xfd5f, 255, 0, 15650 }, + { 0xfd60, 255, 0, 15650 }, + { 0xfd61, 255, 0, 15658 }, + { 0xfd62, 255, 0, 15666 }, + { 0xfd63, 255, 0, 15666 }, + { 0xfd64, 255, 0, 15674 }, + { 0xfd65, 255, 0, 15674 }, + { 0xfd66, 255, 0, 15682 }, + { 0xfd67, 255, 0, 15690 }, + { 0xfd68, 255, 0, 15690 }, + { 0xfd69, 255, 0, 15698 }, + { 0xfd6a, 255, 0, 15706 }, + { 0xfd6b, 255, 0, 15706 }, + { 0xfd6c, 255, 0, 15714 }, + { 0xfd6d, 255, 0, 15714 }, + { 0xfd6e, 255, 0, 15722 }, + { 0xfd6f, 255, 0, 15730 }, + { 0xfd70, 255, 0, 15730 }, + { 0xfd71, 255, 0, 15738 }, + { 0xfd72, 255, 0, 15738 }, + { 0xfd73, 255, 0, 15746 }, + { 0xfd74, 255, 0, 15754 }, + { 0xfd75, 255, 0, 15762 }, + { 0xfd76, 255, 0, 15770 }, + { 0xfd77, 255, 0, 15770 }, + { 0xfd78, 255, 0, 15778 }, + { 0xfd79, 255, 0, 15786 }, + { 0xfd7a, 255, 0, 15794 }, + { 0xfd7b, 255, 0, 15802 }, + { 0xfd7c, 255, 0, 15810 }, + { 0xfd7d, 255, 0, 15810 }, + { 0xfd7e, 255, 0, 15818 }, + { 0xfd7f, 255, 0, 15826 }, + { 0xfd80, 255, 0, 15834 }, + { 0xfd81, 255, 0, 15842 }, + { 0xfd82, 255, 0, 15850 }, + { 0xfd83, 255, 0, 15858 }, + { 0xfd84, 255, 0, 15858 }, + { 0xfd85, 255, 0, 15866 }, + { 0xfd86, 255, 0, 15866 }, + { 0xfd87, 255, 0, 15874 }, + { 0xfd88, 255, 0, 15874 }, + { 0xfd89, 255, 0, 15882 }, + { 0xfd8a, 255, 0, 15890 }, + { 0xfd8b, 255, 0, 15898 }, + { 0xfd8c, 255, 0, 15906 }, + { 0xfd8d, 255, 0, 15914 }, + { 0xfd8e, 255, 0, 15922 }, + { 0xfd8f, 255, 0, 15930 }, + { 0xfd92, 255, 0, 15938 }, + { 0xfd93, 255, 0, 15946 }, + { 0xfd94, 255, 0, 15954 }, + { 0xfd95, 255, 0, 15962 }, + { 0xfd96, 255, 0, 15970 }, + { 0xfd97, 255, 0, 15978 }, + { 0xfd98, 255, 0, 15978 }, + { 0xfd99, 255, 0, 15986 }, + { 0xfd9a, 255, 0, 15994 }, + { 0xfd9b, 255, 0, 16002 }, + { 0xfd9c, 255, 0, 16010 }, + { 0xfd9d, 255, 0, 16010 }, + { 0xfd9e, 255, 0, 16018 }, + { 0xfd9f, 255, 0, 16026 }, + { 0xfda0, 255, 0, 16034 }, + { 0xfda1, 255, 0, 16042 }, + { 0xfda2, 255, 0, 16050 }, + { 0xfda3, 255, 0, 16058 }, + { 0xfda4, 255, 0, 16066 }, + { 0xfda5, 255, 0, 16074 }, + { 0xfda6, 255, 0, 16082 }, + { 0xfda7, 255, 0, 16090 }, + { 0xfda8, 255, 0, 16098 }, + { 0xfda9, 255, 0, 16106 }, + { 0xfdaa, 255, 0, 16114 }, + { 0xfdab, 255, 0, 16122 }, + { 0xfdac, 255, 0, 16130 }, + { 0xfdad, 255, 0, 16138 }, + { 0xfdae, 255, 0, 16146 }, + { 0xfdaf, 255, 0, 16154 }, + { 0xfdb0, 255, 0, 16162 }, + { 0xfdb1, 255, 0, 16170 }, + { 0xfdb2, 255, 0, 16178 }, + { 0xfdb3, 255, 0, 16186 }, + { 0xfdb4, 255, 0, 15818 }, + { 0xfdb5, 255, 0, 15834 }, + { 0xfdb6, 255, 0, 16194 }, + { 0xfdb7, 255, 0, 16202 }, + { 0xfdb8, 255, 0, 16210 }, + { 0xfdb9, 255, 0, 16218 }, + { 0xfdba, 255, 0, 16226 }, + { 0xfdbb, 255, 0, 16234 }, + { 0xfdbc, 255, 0, 16226 }, + { 0xfdbd, 255, 0, 16210 }, + { 0xfdbe, 255, 0, 16242 }, + { 0xfdbf, 255, 0, 16250 }, + { 0xfdc0, 255, 0, 16258 }, + { 0xfdc1, 255, 0, 16266 }, + { 0xfdc2, 255, 0, 16274 }, + { 0xfdc3, 255, 0, 16234 }, + { 0xfdc4, 255, 0, 15762 }, + { 0xfdc5, 255, 0, 15682 }, + { 0xfdc6, 255, 0, 16282 }, + { 0xfdc7, 255, 0, 16290 }, + { 0xfdf0, 255, 0, 16298 }, + { 0xfdf1, 255, 0, 16306 }, + { 0xfdf2, 255, 0, 16314 }, + { 0xfdf3, 255, 0, 16324 }, + { 0xfdf4, 255, 0, 16334 }, + { 0xfdf5, 255, 0, 16344 }, + { 0xfdf6, 255, 0, 16354 }, + { 0xfdf7, 255, 0, 16364 }, + { 0xfdf8, 255, 0, 16374 }, + { 0xfdf9, 255, 0, 16384 }, + { 0xfdfa, 255, 0, 16392 }, + { 0xfdfb, 255, 0, 16430 }, + { 0xfdfc, 255, 0, 16448 }, + { 0xfe30, 255, 0, 6270 }, + { 0xfe31, 255, 0, 16458 }, + { 0xfe32, 255, 0, 16462 }, + { 0xfe33, 255, 0, 16466 }, + { 0xfe34, 255, 0, 16466 }, + { 0xfe35, 255, 0, 6396 }, + { 0xfe36, 255, 0, 6400 }, + { 0xfe37, 255, 0, 16470 }, + { 0xfe38, 255, 0, 16474 }, + { 0xfe39, 255, 0, 16478 }, + { 0xfe3a, 255, 0, 16482 }, + { 0xfe3b, 255, 0, 16486 }, + { 0xfe3c, 255, 0, 16490 }, + { 0xfe3d, 255, 0, 16494 }, + { 0xfe3e, 255, 0, 16498 }, + { 0xfe3f, 255, 0, 7142 }, + { 0xfe40, 255, 0, 7146 }, + { 0xfe41, 255, 0, 16502 }, + { 0xfe42, 255, 0, 16506 }, + { 0xfe43, 255, 0, 16510 }, + { 0xfe44, 255, 0, 16514 }, + { 0xfe49, 255, 0, 6318 }, + { 0xfe4a, 255, 0, 6318 }, + { 0xfe4b, 255, 0, 6318 }, + { 0xfe4c, 255, 0, 6318 }, + { 0xfe4d, 255, 0, 16466 }, + { 0xfe4e, 255, 0, 16466 }, + { 0xfe4f, 255, 0, 16466 }, + { 0xfe50, 255, 0, 16518 }, + { 0xfe51, 255, 0, 16522 }, + { 0xfe52, 255, 0, 6266 }, + { 0xfe54, 255, 0, 1860 }, + { 0xfe55, 255, 0, 16526 }, + { 0xfe56, 255, 0, 16530 }, + { 0xfe57, 255, 0, 16534 }, + { 0xfe58, 255, 0, 16458 }, + { 0xfe59, 255, 0, 6396 }, + { 0xfe5a, 255, 0, 6400 }, + { 0xfe5b, 255, 0, 16470 }, + { 0xfe5c, 255, 0, 16474 }, + { 0xfe5d, 255, 0, 16478 }, + { 0xfe5e, 255, 0, 16482 }, + { 0xfe5f, 255, 0, 16538 }, + { 0xfe60, 255, 0, 16542 }, + { 0xfe61, 255, 0, 16546 }, + { 0xfe62, 255, 0, 6384 }, + { 0xfe63, 255, 0, 16550 }, + { 0xfe64, 255, 0, 16554 }, + { 0xfe65, 255, 0, 16558 }, + { 0xfe66, 255, 0, 6392 }, + { 0xfe68, 255, 0, 16562 }, + { 0xfe69, 255, 0, 16566 }, + { 0xfe6a, 255, 0, 16570 }, + { 0xfe6b, 255, 0, 16574 }, + { 0xfe70, 255, 0, 16578 }, + { 0xfe71, 255, 0, 16584 }, + { 0xfe72, 255, 0, 16590 }, + { 0xfe74, 255, 0, 16596 }, + { 0xfe76, 255, 0, 16602 }, + { 0xfe77, 255, 0, 16608 }, + { 0xfe78, 255, 0, 16614 }, + { 0xfe79, 255, 0, 16620 }, + { 0xfe7a, 255, 0, 16626 }, + { 0xfe7b, 255, 0, 16632 }, + { 0xfe7c, 255, 0, 16638 }, + { 0xfe7d, 255, 0, 16644 }, + { 0xfe7e, 255, 0, 16650 }, + { 0xfe7f, 255, 0, 16656 }, + { 0xfe80, 255, 0, 16662 }, + { 0xfe81, 255, 0, 2388 }, + { 0xfe82, 255, 0, 2388 }, + { 0xfe83, 255, 0, 2394 }, + { 0xfe84, 255, 0, 2394 }, + { 0xfe85, 255, 0, 2400 }, + { 0xfe86, 255, 0, 2400 }, + { 0xfe87, 255, 0, 2406 }, + { 0xfe88, 255, 0, 2406 }, + { 0xfe89, 255, 0, 2412 }, + { 0xfe8a, 255, 0, 2412 }, + { 0xfe8b, 255, 0, 2412 }, + { 0xfe8c, 255, 0, 2412 }, + { 0xfe8d, 255, 0, 16666 }, + { 0xfe8e, 255, 0, 16666 }, + { 0xfe8f, 255, 0, 16670 }, + { 0xfe90, 255, 0, 16670 }, + { 0xfe91, 255, 0, 16670 }, + { 0xfe92, 255, 0, 16670 }, + { 0xfe93, 255, 0, 16674 }, + { 0xfe94, 255, 0, 16674 }, + { 0xfe95, 255, 0, 16678 }, + { 0xfe96, 255, 0, 16678 }, + { 0xfe97, 255, 0, 16678 }, + { 0xfe98, 255, 0, 16678 }, + { 0xfe99, 255, 0, 16682 }, + { 0xfe9a, 255, 0, 16682 }, + { 0xfe9b, 255, 0, 16682 }, + { 0xfe9c, 255, 0, 16682 }, + { 0xfe9d, 255, 0, 16686 }, + { 0xfe9e, 255, 0, 16686 }, + { 0xfe9f, 255, 0, 16686 }, + { 0xfea0, 255, 0, 16686 }, + { 0xfea1, 255, 0, 16690 }, + { 0xfea2, 255, 0, 16690 }, + { 0xfea3, 255, 0, 16690 }, + { 0xfea4, 255, 0, 16690 }, + { 0xfea5, 255, 0, 16694 }, + { 0xfea6, 255, 0, 16694 }, + { 0xfea7, 255, 0, 16694 }, + { 0xfea8, 255, 0, 16694 }, + { 0xfea9, 255, 0, 16698 }, + { 0xfeaa, 255, 0, 16698 }, + { 0xfeab, 255, 0, 16702 }, + { 0xfeac, 255, 0, 16702 }, + { 0xfead, 255, 0, 16706 }, + { 0xfeae, 255, 0, 16706 }, + { 0xfeaf, 255, 0, 16710 }, + { 0xfeb0, 255, 0, 16710 }, + { 0xfeb1, 255, 0, 16714 }, + { 0xfeb2, 255, 0, 16714 }, + { 0xfeb3, 255, 0, 16714 }, + { 0xfeb4, 255, 0, 16714 }, + { 0xfeb5, 255, 0, 16718 }, + { 0xfeb6, 255, 0, 16718 }, + { 0xfeb7, 255, 0, 16718 }, + { 0xfeb8, 255, 0, 16718 }, + { 0xfeb9, 255, 0, 16722 }, + { 0xfeba, 255, 0, 16722 }, + { 0xfebb, 255, 0, 16722 }, + { 0xfebc, 255, 0, 16722 }, + { 0xfebd, 255, 0, 16726 }, + { 0xfebe, 255, 0, 16726 }, + { 0xfebf, 255, 0, 16726 }, + { 0xfec0, 255, 0, 16726 }, + { 0xfec1, 255, 0, 16730 }, + { 0xfec2, 255, 0, 16730 }, + { 0xfec3, 255, 0, 16730 }, + { 0xfec4, 255, 0, 16730 }, + { 0xfec5, 255, 0, 16734 }, + { 0xfec6, 255, 0, 16734 }, + { 0xfec7, 255, 0, 16734 }, + { 0xfec8, 255, 0, 16734 }, + { 0xfec9, 255, 0, 16738 }, + { 0xfeca, 255, 0, 16738 }, + { 0xfecb, 255, 0, 16738 }, + { 0xfecc, 255, 0, 16738 }, + { 0xfecd, 255, 0, 16742 }, + { 0xfece, 255, 0, 16742 }, + { 0xfecf, 255, 0, 16742 }, + { 0xfed0, 255, 0, 16742 }, + { 0xfed1, 255, 0, 16746 }, + { 0xfed2, 255, 0, 16746 }, + { 0xfed3, 255, 0, 16746 }, + { 0xfed4, 255, 0, 16746 }, + { 0xfed5, 255, 0, 16750 }, + { 0xfed6, 255, 0, 16750 }, + { 0xfed7, 255, 0, 16750 }, + { 0xfed8, 255, 0, 16750 }, + { 0xfed9, 255, 0, 16754 }, + { 0xfeda, 255, 0, 16754 }, + { 0xfedb, 255, 0, 16754 }, + { 0xfedc, 255, 0, 16754 }, + { 0xfedd, 255, 0, 16758 }, + { 0xfede, 255, 0, 16758 }, + { 0xfedf, 255, 0, 16758 }, + { 0xfee0, 255, 0, 16758 }, + { 0xfee1, 255, 0, 16762 }, + { 0xfee2, 255, 0, 16762 }, + { 0xfee3, 255, 0, 16762 }, + { 0xfee4, 255, 0, 16762 }, + { 0xfee5, 255, 0, 16766 }, + { 0xfee6, 255, 0, 16766 }, + { 0xfee7, 255, 0, 16766 }, + { 0xfee8, 255, 0, 16766 }, + { 0xfee9, 255, 0, 16770 }, + { 0xfeea, 255, 0, 16770 }, + { 0xfeeb, 255, 0, 16770 }, + { 0xfeec, 255, 0, 16770 }, + { 0xfeed, 255, 0, 16774 }, + { 0xfeee, 255, 0, 16774 }, + { 0xfeef, 255, 0, 14466 }, + { 0xfef0, 255, 0, 14466 }, + { 0xfef1, 255, 0, 16778 }, + { 0xfef2, 255, 0, 16778 }, + { 0xfef3, 255, 0, 16778 }, + { 0xfef4, 255, 0, 16778 }, + { 0xfef5, 255, 0, 16782 }, + { 0xfef6, 255, 0, 16782 }, + { 0xfef7, 255, 0, 16790 }, + { 0xfef8, 255, 0, 16790 }, + { 0xfef9, 255, 0, 16798 }, + { 0xfefa, 255, 0, 16798 }, + { 0xfefb, 255, 0, 16806 }, + { 0xfefc, 255, 0, 16806 }, + { 0xff01, 255, 0, 16534 }, + { 0xff02, 255, 0, 16812 }, + { 0xff03, 255, 0, 16538 }, + { 0xff04, 255, 0, 16566 }, + { 0xff05, 255, 0, 16570 }, + { 0xff06, 255, 0, 16542 }, + { 0xff07, 255, 0, 16816 }, + { 0xff08, 255, 0, 6396 }, + { 0xff09, 255, 0, 6400 }, + { 0xff0a, 255, 0, 16546 }, + { 0xff0b, 255, 0, 6384 }, + { 0xff0c, 255, 0, 16518 }, + { 0xff0d, 255, 0, 16550 }, + { 0xff0e, 255, 0, 6266 }, + { 0xff0f, 255, 0, 16820 }, + { 0xff10, 255, 0, 6352 }, + { 0xff11, 255, 0, 44 }, + { 0xff12, 255, 0, 20 }, + { 0xff13, 255, 0, 24 }, + { 0xff14, 255, 0, 6360 }, + { 0xff15, 255, 0, 6364 }, + { 0xff16, 255, 0, 6368 }, + { 0xff17, 255, 0, 6372 }, + { 0xff18, 255, 0, 6376 }, + { 0xff19, 255, 0, 6380 }, + { 0xff1a, 255, 0, 16526 }, + { 0xff1b, 255, 0, 1860 }, + { 0xff1c, 255, 0, 16554 }, + { 0xff1d, 255, 0, 6392 }, + { 0xff1e, 255, 0, 16558 }, + { 0xff1f, 255, 0, 16530 }, + { 0xff20, 255, 0, 16574 }, + { 0xff21, 255, 0, 7748 }, + { 0xff22, 255, 0, 6540 }, + { 0xff23, 255, 0, 6430 }, + { 0xff24, 255, 0, 6592 }, + { 0xff25, 255, 0, 6548 }, + { 0xff26, 255, 0, 6552 }, + { 0xff27, 255, 0, 7752 }, + { 0xff28, 255, 0, 6470 }, + { 0xff29, 255, 0, 6478 }, + { 0xff2a, 255, 0, 7756 }, + { 0xff2b, 255, 0, 6536 }, + { 0xff2c, 255, 0, 6482 }, + { 0xff2d, 255, 0, 6556 }, + { 0xff2e, 255, 0, 6486 }, + { 0xff2f, 255, 0, 7760 }, + { 0xff30, 255, 0, 6496 }, + { 0xff31, 255, 0, 6500 }, + { 0xff32, 255, 0, 6504 }, + { 0xff33, 255, 0, 7764 }, + { 0xff34, 255, 0, 7768 }, + { 0xff35, 255, 0, 7772 }, + { 0xff36, 255, 0, 6722 }, + { 0xff37, 255, 0, 7776 }, + { 0xff38, 255, 0, 6756 }, + { 0xff39, 255, 0, 7780 }, + { 0xff3a, 255, 0, 6528 }, + { 0xff3b, 255, 0, 16824 }, + { 0xff3c, 255, 0, 16562 }, + { 0xff3d, 255, 0, 16828 }, + { 0xff3e, 255, 0, 16832 }, + { 0xff3f, 255, 0, 16466 }, + { 0xff40, 255, 0, 6166 }, + { 0xff41, 255, 0, 10 }, + { 0xff42, 255, 0, 7784 }, + { 0xff43, 255, 0, 6842 }, + { 0xff44, 255, 0, 6596 }, + { 0xff45, 255, 0, 6544 }, + { 0xff46, 255, 0, 7788 }, + { 0xff47, 255, 0, 6466 }, + { 0xff48, 255, 0, 1744 }, + { 0xff49, 255, 0, 6356 }, + { 0xff4a, 255, 0, 1752 }, + { 0xff4b, 255, 0, 7792 }, + { 0xff4c, 255, 0, 1820 }, + { 0xff4d, 255, 0, 6846 }, + { 0xff4e, 255, 0, 6404 }, + { 0xff4f, 255, 0, 48 }, + { 0xff50, 255, 0, 7796 }, + { 0xff51, 255, 0, 7800 }, + { 0xff52, 255, 0, 1756 }, + { 0xff53, 255, 0, 1072 }, + { 0xff54, 255, 0, 7804 }, + { 0xff55, 255, 0, 7808 }, + { 0xff56, 255, 0, 6794 }, + { 0xff57, 255, 0, 1772 }, + { 0xff58, 255, 0, 1824 }, + { 0xff59, 255, 0, 1776 }, + { 0xff5a, 255, 0, 7812 }, + { 0xff5b, 255, 0, 16470 }, + { 0xff5c, 255, 0, 16836 }, + { 0xff5d, 255, 0, 16474 }, + { 0xff5e, 255, 0, 16840 }, + { 0xff5f, 255, 0, 16844 }, + { 0xff60, 255, 0, 16848 }, + { 0xff61, 255, 0, 16852 }, + { 0xff62, 255, 0, 16502 }, + { 0xff63, 255, 0, 16506 }, + { 0xff64, 255, 0, 16522 }, + { 0xff65, 255, 0, 16856 }, + { 0xff66, 255, 0, 10722 }, + { 0xff67, 255, 0, 16860 }, + { 0xff68, 255, 0, 16864 }, + { 0xff69, 255, 0, 16868 }, + { 0xff6a, 255, 0, 16872 }, + { 0xff6b, 255, 0, 16876 }, + { 0xff6c, 255, 0, 16880 }, + { 0xff6d, 255, 0, 16884 }, + { 0xff6e, 255, 0, 16888 }, + { 0xff6f, 255, 0, 16892 }, + { 0xff70, 255, 0, 16896 }, + { 0xff71, 255, 0, 10538 }, + { 0xff72, 255, 0, 10542 }, + { 0xff73, 255, 0, 10546 }, + { 0xff74, 255, 0, 10550 }, + { 0xff75, 255, 0, 10554 }, + { 0xff76, 255, 0, 10558 }, + { 0xff77, 255, 0, 10562 }, + { 0xff78, 255, 0, 10566 }, + { 0xff79, 255, 0, 10570 }, + { 0xff7a, 255, 0, 10574 }, + { 0xff7b, 255, 0, 10578 }, + { 0xff7c, 255, 0, 10582 }, + { 0xff7d, 255, 0, 10586 }, + { 0xff7e, 255, 0, 10590 }, + { 0xff7f, 255, 0, 10594 }, + { 0xff80, 255, 0, 10598 }, + { 0xff81, 255, 0, 10602 }, + { 0xff82, 255, 0, 10606 }, + { 0xff83, 255, 0, 10610 }, + { 0xff84, 255, 0, 10614 }, + { 0xff85, 255, 0, 10618 }, + { 0xff86, 255, 0, 10622 }, + { 0xff87, 255, 0, 10626 }, + { 0xff88, 255, 0, 10630 }, + { 0xff89, 255, 0, 10634 }, + { 0xff8a, 255, 0, 10638 }, + { 0xff8b, 255, 0, 10642 }, + { 0xff8c, 255, 0, 10646 }, + { 0xff8d, 255, 0, 10650 }, + { 0xff8e, 255, 0, 10654 }, + { 0xff8f, 255, 0, 10658 }, + { 0xff90, 255, 0, 10662 }, + { 0xff91, 255, 0, 10666 }, + { 0xff92, 255, 0, 10670 }, + { 0xff93, 255, 0, 10674 }, + { 0xff94, 255, 0, 10678 }, + { 0xff95, 255, 0, 10682 }, + { 0xff96, 255, 0, 10686 }, + { 0xff97, 255, 0, 10690 }, + { 0xff98, 255, 0, 10694 }, + { 0xff99, 255, 0, 10698 }, + { 0xff9a, 255, 0, 10702 }, + { 0xff9b, 255, 0, 10706 }, + { 0xff9c, 255, 0, 10710 }, + { 0xff9d, 255, 0, 16900 }, + { 0xff9e, 255, 0, 16904 }, + { 0xff9f, 255, 0, 16908 }, + { 0xffa0, 255, 0, 9306 }, + { 0xffa1, 255, 0, 9102 }, + { 0xffa2, 255, 0, 9106 }, + { 0xffa3, 255, 0, 9110 }, + { 0xffa4, 255, 0, 9114 }, + { 0xffa5, 255, 0, 9118 }, + { 0xffa6, 255, 0, 9122 }, + { 0xffa7, 255, 0, 9126 }, + { 0xffa8, 255, 0, 9130 }, + { 0xffa9, 255, 0, 9134 }, + { 0xffaa, 255, 0, 9138 }, + { 0xffab, 255, 0, 9142 }, + { 0xffac, 255, 0, 9146 }, + { 0xffad, 255, 0, 9150 }, + { 0xffae, 255, 0, 9154 }, + { 0xffaf, 255, 0, 9158 }, + { 0xffb0, 255, 0, 9162 }, + { 0xffb1, 255, 0, 9166 }, + { 0xffb2, 255, 0, 9170 }, + { 0xffb3, 255, 0, 9174 }, + { 0xffb4, 255, 0, 9178 }, + { 0xffb5, 255, 0, 9182 }, + { 0xffb6, 255, 0, 9186 }, + { 0xffb7, 255, 0, 9190 }, + { 0xffb8, 255, 0, 9194 }, + { 0xffb9, 255, 0, 9198 }, + { 0xffba, 255, 0, 9202 }, + { 0xffbb, 255, 0, 9206 }, + { 0xffbc, 255, 0, 9210 }, + { 0xffbd, 255, 0, 9214 }, + { 0xffbe, 255, 0, 9218 }, + { 0xffc2, 255, 0, 9222 }, + { 0xffc3, 255, 0, 9226 }, + { 0xffc4, 255, 0, 9230 }, + { 0xffc5, 255, 0, 9234 }, + { 0xffc6, 255, 0, 9238 }, + { 0xffc7, 255, 0, 9242 }, + { 0xffca, 255, 0, 9246 }, + { 0xffcb, 255, 0, 9250 }, + { 0xffcc, 255, 0, 9254 }, + { 0xffcd, 255, 0, 9258 }, + { 0xffce, 255, 0, 9262 }, + { 0xffcf, 255, 0, 9266 }, + { 0xffd2, 255, 0, 9270 }, + { 0xffd3, 255, 0, 9274 }, + { 0xffd4, 255, 0, 9278 }, + { 0xffd5, 255, 0, 9282 }, + { 0xffd6, 255, 0, 9286 }, + { 0xffd7, 255, 0, 9290 }, + { 0xffda, 255, 0, 9294 }, + { 0xffdb, 255, 0, 9298 }, + { 0xffdc, 255, 0, 9302 }, + { 0xffe0, 255, 0, 16912 }, + { 0xffe1, 255, 0, 16916 }, + { 0xffe2, 255, 0, 16920 }, + { 0xffe3, 255, 0, 14 }, + { 0xffe4, 255, 0, 16924 }, + { 0xffe5, 255, 0, 16928 }, + { 0xffe6, 255, 0, 16932 }, + { 0xffe8, 255, 0, 16936 }, + { 0xffe9, 255, 0, 16940 }, + { 0xffea, 255, 0, 16944 }, + { 0xffeb, 255, 0, 16948 }, + { 0xffec, 255, 0, 16952 }, + { 0xffed, 255, 0, 16956 }, + { 0xffee, 255, 0, 16960 } +}; + +static const guchar decomp_expansion_string[] = + "\x00\x20\0\0" /* offset 0 */ + "\x00\x20\x03\x08\0\0" /* offset 4 */ + "\x00\x61\0\0" /* offset 10 */ + "\x00\x20\x03\x04\0\0" /* offset 14 */ + "\x00\x32\0\0" /* offset 20 */ + "\x00\x33\0\0" /* offset 24 */ + "\x00\x20\x03\x01\0\0" /* offset 28 */ + "\x03\xbc\0\0" /* offset 34 */ + "\x00\x20\x03\x27\0\0" /* offset 38 */ + "\x00\x31\0\0" /* offset 44 */ + "\x00\x6f\0\0" /* offset 48 */ + "\x00\x31\x20\x44\x00\x34\0\0" /* offset 52 */ + "\x00\x31\x20\x44\x00\x32\0\0" /* offset 60 */ + "\x00\x33\x20\x44\x00\x34\0\0" /* offset 68 */ + "\x00\x41\x03\x00\0\0" /* offset 76 */ + "\x00\x41\x03\x01\0\0" /* offset 82 */ + "\x00\x41\x03\x02\0\0" /* offset 88 */ + "\x00\x41\x03\x03\0\0" /* offset 94 */ + "\x00\x41\x03\x08\0\0" /* offset 100 */ + "\x00\x41\x03\x0a\0\0" /* offset 106 */ + "\x00\x43\x03\x27\0\0" /* offset 112 */ + "\x00\x45\x03\x00\0\0" /* offset 118 */ + "\x00\x45\x03\x01\0\0" /* offset 124 */ + "\x00\x45\x03\x02\0\0" /* offset 130 */ + "\x00\x45\x03\x08\0\0" /* offset 136 */ + "\x00\x49\x03\x00\0\0" /* offset 142 */ + "\x00\x49\x03\x01\0\0" /* offset 148 */ + "\x00\x49\x03\x02\0\0" /* offset 154 */ + "\x00\x49\x03\x08\0\0" /* offset 160 */ + "\x00\x4e\x03\x03\0\0" /* offset 166 */ + "\x00\x4f\x03\x00\0\0" /* offset 172 */ + "\x00\x4f\x03\x01\0\0" /* offset 178 */ + "\x00\x4f\x03\x02\0\0" /* offset 184 */ + "\x00\x4f\x03\x03\0\0" /* offset 190 */ + "\x00\x4f\x03\x08\0\0" /* offset 196 */ + "\x00\x55\x03\x00\0\0" /* offset 202 */ + "\x00\x55\x03\x01\0\0" /* offset 208 */ + "\x00\x55\x03\x02\0\0" /* offset 214 */ + "\x00\x55\x03\x08\0\0" /* offset 220 */ + "\x00\x59\x03\x01\0\0" /* offset 226 */ + "\x00\x61\x03\x00\0\0" /* offset 232 */ + "\x00\x61\x03\x01\0\0" /* offset 238 */ + "\x00\x61\x03\x02\0\0" /* offset 244 */ + "\x00\x61\x03\x03\0\0" /* offset 250 */ + "\x00\x61\x03\x08\0\0" /* offset 256 */ + "\x00\x61\x03\x0a\0\0" /* offset 262 */ + "\x00\x63\x03\x27\0\0" /* offset 268 */ + "\x00\x65\x03\x00\0\0" /* offset 274 */ + "\x00\x65\x03\x01\0\0" /* offset 280 */ + "\x00\x65\x03\x02\0\0" /* offset 286 */ + "\x00\x65\x03\x08\0\0" /* offset 292 */ + "\x00\x69\x03\x00\0\0" /* offset 298 */ + "\x00\x69\x03\x01\0\0" /* offset 304 */ + "\x00\x69\x03\x02\0\0" /* offset 310 */ + "\x00\x69\x03\x08\0\0" /* offset 316 */ + "\x00\x6e\x03\x03\0\0" /* offset 322 */ + "\x00\x6f\x03\x00\0\0" /* offset 328 */ + "\x00\x6f\x03\x01\0\0" /* offset 334 */ + "\x00\x6f\x03\x02\0\0" /* offset 340 */ + "\x00\x6f\x03\x03\0\0" /* offset 346 */ + "\x00\x6f\x03\x08\0\0" /* offset 352 */ + "\x00\x75\x03\x00\0\0" /* offset 358 */ + "\x00\x75\x03\x01\0\0" /* offset 364 */ + "\x00\x75\x03\x02\0\0" /* offset 370 */ + "\x00\x75\x03\x08\0\0" /* offset 376 */ + "\x00\x79\x03\x01\0\0" /* offset 382 */ + "\x00\x79\x03\x08\0\0" /* offset 388 */ + "\x00\x41\x03\x04\0\0" /* offset 394 */ + "\x00\x61\x03\x04\0\0" /* offset 400 */ + "\x00\x41\x03\x06\0\0" /* offset 406 */ + "\x00\x61\x03\x06\0\0" /* offset 412 */ + "\x00\x41\x03\x28\0\0" /* offset 418 */ + "\x00\x61\x03\x28\0\0" /* offset 424 */ + "\x00\x43\x03\x01\0\0" /* offset 430 */ + "\x00\x63\x03\x01\0\0" /* offset 436 */ + "\x00\x43\x03\x02\0\0" /* offset 442 */ + "\x00\x63\x03\x02\0\0" /* offset 448 */ + "\x00\x43\x03\x07\0\0" /* offset 454 */ + "\x00\x63\x03\x07\0\0" /* offset 460 */ + "\x00\x43\x03\x0c\0\0" /* offset 466 */ + "\x00\x63\x03\x0c\0\0" /* offset 472 */ + "\x00\x44\x03\x0c\0\0" /* offset 478 */ + "\x00\x64\x03\x0c\0\0" /* offset 484 */ + "\x00\x45\x03\x04\0\0" /* offset 490 */ + "\x00\x65\x03\x04\0\0" /* offset 496 */ + "\x00\x45\x03\x06\0\0" /* offset 502 */ + "\x00\x65\x03\x06\0\0" /* offset 508 */ + "\x00\x45\x03\x07\0\0" /* offset 514 */ + "\x00\x65\x03\x07\0\0" /* offset 520 */ + "\x00\x45\x03\x28\0\0" /* offset 526 */ + "\x00\x65\x03\x28\0\0" /* offset 532 */ + "\x00\x45\x03\x0c\0\0" /* offset 538 */ + "\x00\x65\x03\x0c\0\0" /* offset 544 */ + "\x00\x47\x03\x02\0\0" /* offset 550 */ + "\x00\x67\x03\x02\0\0" /* offset 556 */ + "\x00\x47\x03\x06\0\0" /* offset 562 */ + "\x00\x67\x03\x06\0\0" /* offset 568 */ + "\x00\x47\x03\x07\0\0" /* offset 574 */ + "\x00\x67\x03\x07\0\0" /* offset 580 */ + "\x00\x47\x03\x27\0\0" /* offset 586 */ + "\x00\x67\x03\x27\0\0" /* offset 592 */ + "\x00\x48\x03\x02\0\0" /* offset 598 */ + "\x00\x68\x03\x02\0\0" /* offset 604 */ + "\x00\x49\x03\x03\0\0" /* offset 610 */ + "\x00\x69\x03\x03\0\0" /* offset 616 */ + "\x00\x49\x03\x04\0\0" /* offset 622 */ + "\x00\x69\x03\x04\0\0" /* offset 628 */ + "\x00\x49\x03\x06\0\0" /* offset 634 */ + "\x00\x69\x03\x06\0\0" /* offset 640 */ + "\x00\x49\x03\x28\0\0" /* offset 646 */ + "\x00\x69\x03\x28\0\0" /* offset 652 */ + "\x00\x49\x03\x07\0\0" /* offset 658 */ + "\x00\x49\x00\x4a\0\0" /* offset 664 */ + "\x00\x69\x00\x6a\0\0" /* offset 670 */ + "\x00\x4a\x03\x02\0\0" /* offset 676 */ + "\x00\x6a\x03\x02\0\0" /* offset 682 */ + "\x00\x4b\x03\x27\0\0" /* offset 688 */ + "\x00\x6b\x03\x27\0\0" /* offset 694 */ + "\x00\x4c\x03\x01\0\0" /* offset 700 */ + "\x00\x6c\x03\x01\0\0" /* offset 706 */ + "\x00\x4c\x03\x27\0\0" /* offset 712 */ + "\x00\x6c\x03\x27\0\0" /* offset 718 */ + "\x00\x4c\x03\x0c\0\0" /* offset 724 */ + "\x00\x6c\x03\x0c\0\0" /* offset 730 */ + "\x00\x4c\x00\xb7\0\0" /* offset 736 */ + "\x00\x6c\x00\xb7\0\0" /* offset 742 */ + "\x00\x4e\x03\x01\0\0" /* offset 748 */ + "\x00\x6e\x03\x01\0\0" /* offset 754 */ + "\x00\x4e\x03\x27\0\0" /* offset 760 */ + "\x00\x6e\x03\x27\0\0" /* offset 766 */ + "\x00\x4e\x03\x0c\0\0" /* offset 772 */ + "\x00\x6e\x03\x0c\0\0" /* offset 778 */ + "\x02\xbc\x00\x6e\0\0" /* offset 784 */ + "\x00\x4f\x03\x04\0\0" /* offset 790 */ + "\x00\x6f\x03\x04\0\0" /* offset 796 */ + "\x00\x4f\x03\x06\0\0" /* offset 802 */ + "\x00\x6f\x03\x06\0\0" /* offset 808 */ + "\x00\x4f\x03\x0b\0\0" /* offset 814 */ + "\x00\x6f\x03\x0b\0\0" /* offset 820 */ + "\x00\x52\x03\x01\0\0" /* offset 826 */ + "\x00\x72\x03\x01\0\0" /* offset 832 */ + "\x00\x52\x03\x27\0\0" /* offset 838 */ + "\x00\x72\x03\x27\0\0" /* offset 844 */ + "\x00\x52\x03\x0c\0\0" /* offset 850 */ + "\x00\x72\x03\x0c\0\0" /* offset 856 */ + "\x00\x53\x03\x01\0\0" /* offset 862 */ + "\x00\x73\x03\x01\0\0" /* offset 868 */ + "\x00\x53\x03\x02\0\0" /* offset 874 */ + "\x00\x73\x03\x02\0\0" /* offset 880 */ + "\x00\x53\x03\x27\0\0" /* offset 886 */ + "\x00\x73\x03\x27\0\0" /* offset 892 */ + "\x00\x53\x03\x0c\0\0" /* offset 898 */ + "\x00\x73\x03\x0c\0\0" /* offset 904 */ + "\x00\x54\x03\x27\0\0" /* offset 910 */ + "\x00\x74\x03\x27\0\0" /* offset 916 */ + "\x00\x54\x03\x0c\0\0" /* offset 922 */ + "\x00\x74\x03\x0c\0\0" /* offset 928 */ + "\x00\x55\x03\x03\0\0" /* offset 934 */ + "\x00\x75\x03\x03\0\0" /* offset 940 */ + "\x00\x55\x03\x04\0\0" /* offset 946 */ + "\x00\x75\x03\x04\0\0" /* offset 952 */ + "\x00\x55\x03\x06\0\0" /* offset 958 */ + "\x00\x75\x03\x06\0\0" /* offset 964 */ + "\x00\x55\x03\x0a\0\0" /* offset 970 */ + "\x00\x75\x03\x0a\0\0" /* offset 976 */ + "\x00\x55\x03\x0b\0\0" /* offset 982 */ + "\x00\x75\x03\x0b\0\0" /* offset 988 */ + "\x00\x55\x03\x28\0\0" /* offset 994 */ + "\x00\x75\x03\x28\0\0" /* offset 1000 */ + "\x00\x57\x03\x02\0\0" /* offset 1006 */ + "\x00\x77\x03\x02\0\0" /* offset 1012 */ + "\x00\x59\x03\x02\0\0" /* offset 1018 */ + "\x00\x79\x03\x02\0\0" /* offset 1024 */ + "\x00\x59\x03\x08\0\0" /* offset 1030 */ + "\x00\x5a\x03\x01\0\0" /* offset 1036 */ + "\x00\x7a\x03\x01\0\0" /* offset 1042 */ + "\x00\x5a\x03\x07\0\0" /* offset 1048 */ + "\x00\x7a\x03\x07\0\0" /* offset 1054 */ + "\x00\x5a\x03\x0c\0\0" /* offset 1060 */ + "\x00\x7a\x03\x0c\0\0" /* offset 1066 */ + "\x00\x73\0\0" /* offset 1072 */ + "\x00\x4f\x03\x1b\0\0" /* offset 1076 */ + "\x00\x6f\x03\x1b\0\0" /* offset 1082 */ + "\x00\x55\x03\x1b\0\0" /* offset 1088 */ + "\x00\x75\x03\x1b\0\0" /* offset 1094 */ + "\x00\x44\x00\x5a\x03\x0c\0\0" /* offset 1100 */ + "\x00\x44\x00\x7a\x03\x0c\0\0" /* offset 1108 */ + "\x00\x64\x00\x7a\x03\x0c\0\0" /* offset 1116 */ + "\x00\x4c\x00\x4a\0\0" /* offset 1124 */ + "\x00\x4c\x00\x6a\0\0" /* offset 1130 */ + "\x00\x6c\x00\x6a\0\0" /* offset 1136 */ + "\x00\x4e\x00\x4a\0\0" /* offset 1142 */ + "\x00\x4e\x00\x6a\0\0" /* offset 1148 */ + "\x00\x6e\x00\x6a\0\0" /* offset 1154 */ + "\x00\x41\x03\x0c\0\0" /* offset 1160 */ + "\x00\x61\x03\x0c\0\0" /* offset 1166 */ + "\x00\x49\x03\x0c\0\0" /* offset 1172 */ + "\x00\x69\x03\x0c\0\0" /* offset 1178 */ + "\x00\x4f\x03\x0c\0\0" /* offset 1184 */ + "\x00\x6f\x03\x0c\0\0" /* offset 1190 */ + "\x00\x55\x03\x0c\0\0" /* offset 1196 */ + "\x00\x75\x03\x0c\0\0" /* offset 1202 */ + "\x00\x55\x03\x08\x03\x04\0\0" /* offset 1208 */ + "\x00\x75\x03\x08\x03\x04\0\0" /* offset 1216 */ + "\x00\x55\x03\x08\x03\x01\0\0" /* offset 1224 */ + "\x00\x75\x03\x08\x03\x01\0\0" /* offset 1232 */ + "\x00\x55\x03\x08\x03\x0c\0\0" /* offset 1240 */ + "\x00\x75\x03\x08\x03\x0c\0\0" /* offset 1248 */ + "\x00\x55\x03\x08\x03\x00\0\0" /* offset 1256 */ + "\x00\x75\x03\x08\x03\x00\0\0" /* offset 1264 */ + "\x00\x41\x03\x08\x03\x04\0\0" /* offset 1272 */ + "\x00\x61\x03\x08\x03\x04\0\0" /* offset 1280 */ + "\x00\x41\x03\x07\x03\x04\0\0" /* offset 1288 */ + "\x00\x61\x03\x07\x03\x04\0\0" /* offset 1296 */ + "\x00\xc6\x03\x04\0\0" /* offset 1304 */ + "\x00\xe6\x03\x04\0\0" /* offset 1310 */ + "\x00\x47\x03\x0c\0\0" /* offset 1316 */ + "\x00\x67\x03\x0c\0\0" /* offset 1322 */ + "\x00\x4b\x03\x0c\0\0" /* offset 1328 */ + "\x00\x6b\x03\x0c\0\0" /* offset 1334 */ + "\x00\x4f\x03\x28\0\0" /* offset 1340 */ + "\x00\x6f\x03\x28\0\0" /* offset 1346 */ + "\x00\x4f\x03\x28\x03\x04\0\0" /* offset 1352 */ + "\x00\x6f\x03\x28\x03\x04\0\0" /* offset 1360 */ + "\x01\xb7\x03\x0c\0\0" /* offset 1368 */ + "\x02\x92\x03\x0c\0\0" /* offset 1374 */ + "\x00\x6a\x03\x0c\0\0" /* offset 1380 */ + "\x00\x44\x00\x5a\0\0" /* offset 1386 */ + "\x00\x44\x00\x7a\0\0" /* offset 1392 */ + "\x00\x64\x00\x7a\0\0" /* offset 1398 */ + "\x00\x47\x03\x01\0\0" /* offset 1404 */ + "\x00\x67\x03\x01\0\0" /* offset 1410 */ + "\x00\x4e\x03\x00\0\0" /* offset 1416 */ + "\x00\x6e\x03\x00\0\0" /* offset 1422 */ + "\x00\x41\x03\x0a\x03\x01\0\0" /* offset 1428 */ + "\x00\x61\x03\x0a\x03\x01\0\0" /* offset 1436 */ + "\x00\xc6\x03\x01\0\0" /* offset 1444 */ + "\x00\xe6\x03\x01\0\0" /* offset 1450 */ + "\x00\xd8\x03\x01\0\0" /* offset 1456 */ + "\x00\xf8\x03\x01\0\0" /* offset 1462 */ + "\x00\x41\x03\x0f\0\0" /* offset 1468 */ + "\x00\x61\x03\x0f\0\0" /* offset 1474 */ + "\x00\x41\x03\x11\0\0" /* offset 1480 */ + "\x00\x61\x03\x11\0\0" /* offset 1486 */ + "\x00\x45\x03\x0f\0\0" /* offset 1492 */ + "\x00\x65\x03\x0f\0\0" /* offset 1498 */ + "\x00\x45\x03\x11\0\0" /* offset 1504 */ + "\x00\x65\x03\x11\0\0" /* offset 1510 */ + "\x00\x49\x03\x0f\0\0" /* offset 1516 */ + "\x00\x69\x03\x0f\0\0" /* offset 1522 */ + "\x00\x49\x03\x11\0\0" /* offset 1528 */ + "\x00\x69\x03\x11\0\0" /* offset 1534 */ + "\x00\x4f\x03\x0f\0\0" /* offset 1540 */ + "\x00\x6f\x03\x0f\0\0" /* offset 1546 */ + "\x00\x4f\x03\x11\0\0" /* offset 1552 */ + "\x00\x6f\x03\x11\0\0" /* offset 1558 */ + "\x00\x52\x03\x0f\0\0" /* offset 1564 */ + "\x00\x72\x03\x0f\0\0" /* offset 1570 */ + "\x00\x52\x03\x11\0\0" /* offset 1576 */ + "\x00\x72\x03\x11\0\0" /* offset 1582 */ + "\x00\x55\x03\x0f\0\0" /* offset 1588 */ + "\x00\x75\x03\x0f\0\0" /* offset 1594 */ + "\x00\x55\x03\x11\0\0" /* offset 1600 */ + "\x00\x75\x03\x11\0\0" /* offset 1606 */ + "\x00\x53\x03\x26\0\0" /* offset 1612 */ + "\x00\x73\x03\x26\0\0" /* offset 1618 */ + "\x00\x54\x03\x26\0\0" /* offset 1624 */ + "\x00\x74\x03\x26\0\0" /* offset 1630 */ + "\x00\x48\x03\x0c\0\0" /* offset 1636 */ + "\x00\x68\x03\x0c\0\0" /* offset 1642 */ + "\x00\x41\x03\x07\0\0" /* offset 1648 */ + "\x00\x61\x03\x07\0\0" /* offset 1654 */ + "\x00\x45\x03\x27\0\0" /* offset 1660 */ + "\x00\x65\x03\x27\0\0" /* offset 1666 */ + "\x00\x4f\x03\x08\x03\x04\0\0" /* offset 1672 */ + "\x00\x6f\x03\x08\x03\x04\0\0" /* offset 1680 */ + "\x00\x4f\x03\x03\x03\x04\0\0" /* offset 1688 */ + "\x00\x6f\x03\x03\x03\x04\0\0" /* offset 1696 */ + "\x00\x4f\x03\x07\0\0" /* offset 1704 */ + "\x00\x6f\x03\x07\0\0" /* offset 1710 */ + "\x00\x4f\x03\x07\x03\x04\0\0" /* offset 1716 */ + "\x00\x6f\x03\x07\x03\x04\0\0" /* offset 1724 */ + "\x00\x59\x03\x04\0\0" /* offset 1732 */ + "\x00\x79\x03\x04\0\0" /* offset 1738 */ + "\x00\x68\0\0" /* offset 1744 */ + "\x02\x66\0\0" /* offset 1748 */ + "\x00\x6a\0\0" /* offset 1752 */ + "\x00\x72\0\0" /* offset 1756 */ + "\x02\x79\0\0" /* offset 1760 */ + "\x02\x7b\0\0" /* offset 1764 */ + "\x02\x81\0\0" /* offset 1768 */ + "\x00\x77\0\0" /* offset 1772 */ + "\x00\x79\0\0" /* offset 1776 */ + "\x00\x20\x03\x06\0\0" /* offset 1780 */ + "\x00\x20\x03\x07\0\0" /* offset 1786 */ + "\x00\x20\x03\x0a\0\0" /* offset 1792 */ + "\x00\x20\x03\x28\0\0" /* offset 1798 */ + "\x00\x20\x03\x03\0\0" /* offset 1804 */ + "\x00\x20\x03\x0b\0\0" /* offset 1810 */ + "\x02\x63\0\0" /* offset 1816 */ + "\x00\x6c\0\0" /* offset 1820 */ + "\x00\x78\0\0" /* offset 1824 */ + "\x02\x95\0\0" /* offset 1828 */ + "\x03\x00\0\0" /* offset 1832 */ + "\x03\x01\0\0" /* offset 1836 */ + "\x03\x13\0\0" /* offset 1840 */ + "\x03\x08\x03\x01\0\0" /* offset 1844 */ + "\x02\xb9\0\0" /* offset 1850 */ + "\x00\x20\x03\x45\0\0" /* offset 1854 */ + "\x00\x3b\0\0" /* offset 1860 */ + "\x00\xa8\x03\x01\x00\x00\x00\x20\x03\x08\x03\x01\0\0" /* offset 1864 */ + "\x03\x91\x03\x01\0\0" /* offset 1878 */ + "\x00\xb7\0\0" /* offset 1884 */ + "\x03\x95\x03\x01\0\0" /* offset 1888 */ + "\x03\x97\x03\x01\0\0" /* offset 1894 */ + "\x03\x99\x03\x01\0\0" /* offset 1900 */ + "\x03\x9f\x03\x01\0\0" /* offset 1906 */ + "\x03\xa5\x03\x01\0\0" /* offset 1912 */ + "\x03\xa9\x03\x01\0\0" /* offset 1918 */ + "\x03\xb9\x03\x08\x03\x01\0\0" /* offset 1924 */ + "\x03\x99\x03\x08\0\0" /* offset 1932 */ + "\x03\xa5\x03\x08\0\0" /* offset 1938 */ + "\x03\xb1\x03\x01\0\0" /* offset 1944 */ + "\x03\xb5\x03\x01\0\0" /* offset 1950 */ + "\x03\xb7\x03\x01\0\0" /* offset 1956 */ + "\x03\xb9\x03\x01\0\0" /* offset 1962 */ + "\x03\xc5\x03\x08\x03\x01\0\0" /* offset 1968 */ + "\x03\xb9\x03\x08\0\0" /* offset 1976 */ + "\x03\xc5\x03\x08\0\0" /* offset 1982 */ + "\x03\xbf\x03\x01\0\0" /* offset 1988 */ + "\x03\xc5\x03\x01\0\0" /* offset 1994 */ + "\x03\xc9\x03\x01\0\0" /* offset 2000 */ + "\x03\xb2\0\0" /* offset 2006 */ + "\x03\xb8\0\0" /* offset 2010 */ + "\x03\xa5\0\0" /* offset 2014 */ + "\x03\xd2\x03\x01\x00\x00\x03\xa5\x03\x01\0\0" /* offset 2018 */ + "\x03\xd2\x03\x08\x00\x00\x03\xa5\x03\x08\0\0" /* offset 2030 */ + "\x03\xc6\0\0" /* offset 2042 */ + "\x03\xc0\0\0" /* offset 2046 */ + "\x03\xba\0\0" /* offset 2050 */ + "\x03\xc1\0\0" /* offset 2054 */ + "\x03\xc2\0\0" /* offset 2058 */ + "\x03\x98\0\0" /* offset 2062 */ + "\x03\xb5\0\0" /* offset 2066 */ + "\x04\x15\x03\x00\0\0" /* offset 2070 */ + "\x04\x15\x03\x08\0\0" /* offset 2076 */ + "\x04\x13\x03\x01\0\0" /* offset 2082 */ + "\x04\x06\x03\x08\0\0" /* offset 2088 */ + "\x04\x1a\x03\x01\0\0" /* offset 2094 */ + "\x04\x18\x03\x00\0\0" /* offset 2100 */ + "\x04\x23\x03\x06\0\0" /* offset 2106 */ + "\x04\x18\x03\x06\0\0" /* offset 2112 */ + "\x04\x38\x03\x06\0\0" /* offset 2118 */ + "\x04\x35\x03\x00\0\0" /* offset 2124 */ + "\x04\x35\x03\x08\0\0" /* offset 2130 */ + "\x04\x33\x03\x01\0\0" /* offset 2136 */ + "\x04\x56\x03\x08\0\0" /* offset 2142 */ + "\x04\x3a\x03\x01\0\0" /* offset 2148 */ + "\x04\x38\x03\x00\0\0" /* offset 2154 */ + "\x04\x43\x03\x06\0\0" /* offset 2160 */ + "\x04\x74\x03\x0f\0\0" /* offset 2166 */ + "\x04\x75\x03\x0f\0\0" /* offset 2172 */ + "\x04\x16\x03\x06\0\0" /* offset 2178 */ + "\x04\x36\x03\x06\0\0" /* offset 2184 */ + "\x04\x10\x03\x06\0\0" /* offset 2190 */ + "\x04\x30\x03\x06\0\0" /* offset 2196 */ + "\x04\x10\x03\x08\0\0" /* offset 2202 */ + "\x04\x30\x03\x08\0\0" /* offset 2208 */ + "\x04\x15\x03\x06\0\0" /* offset 2214 */ + "\x04\x35\x03\x06\0\0" /* offset 2220 */ + "\x04\xd8\x03\x08\0\0" /* offset 2226 */ + "\x04\xd9\x03\x08\0\0" /* offset 2232 */ + "\x04\x16\x03\x08\0\0" /* offset 2238 */ + "\x04\x36\x03\x08\0\0" /* offset 2244 */ + "\x04\x17\x03\x08\0\0" /* offset 2250 */ + "\x04\x37\x03\x08\0\0" /* offset 2256 */ + "\x04\x18\x03\x04\0\0" /* offset 2262 */ + "\x04\x38\x03\x04\0\0" /* offset 2268 */ + "\x04\x18\x03\x08\0\0" /* offset 2274 */ + "\x04\x38\x03\x08\0\0" /* offset 2280 */ + "\x04\x1e\x03\x08\0\0" /* offset 2286 */ + "\x04\x3e\x03\x08\0\0" /* offset 2292 */ + "\x04\xe8\x03\x08\0\0" /* offset 2298 */ + "\x04\xe9\x03\x08\0\0" /* offset 2304 */ + "\x04\x2d\x03\x08\0\0" /* offset 2310 */ + "\x04\x4d\x03\x08\0\0" /* offset 2316 */ + "\x04\x23\x03\x04\0\0" /* offset 2322 */ + "\x04\x43\x03\x04\0\0" /* offset 2328 */ + "\x04\x23\x03\x08\0\0" /* offset 2334 */ + "\x04\x43\x03\x08\0\0" /* offset 2340 */ + "\x04\x23\x03\x0b\0\0" /* offset 2346 */ + "\x04\x43\x03\x0b\0\0" /* offset 2352 */ + "\x04\x27\x03\x08\0\0" /* offset 2358 */ + "\x04\x47\x03\x08\0\0" /* offset 2364 */ + "\x04\x2b\x03\x08\0\0" /* offset 2370 */ + "\x04\x4b\x03\x08\0\0" /* offset 2376 */ + "\x05\x65\x05\x82\0\0" /* offset 2382 */ + "\x06\x27\x06\x53\0\0" /* offset 2388 */ + "\x06\x27\x06\x54\0\0" /* offset 2394 */ + "\x06\x48\x06\x54\0\0" /* offset 2400 */ + "\x06\x27\x06\x55\0\0" /* offset 2406 */ + "\x06\x4a\x06\x54\0\0" /* offset 2412 */ + "\x06\x27\x06\x74\0\0" /* offset 2418 */ + "\x06\x48\x06\x74\0\0" /* offset 2424 */ + "\x06\xc7\x06\x74\0\0" /* offset 2430 */ + "\x06\x4a\x06\x74\0\0" /* offset 2436 */ + "\x06\xd5\x06\x54\0\0" /* offset 2442 */ + "\x06\xc1\x06\x54\0\0" /* offset 2448 */ + "\x06\xd2\x06\x54\0\0" /* offset 2454 */ + "\x09\x28\x09\x3c\0\0" /* offset 2460 */ + "\x09\x30\x09\x3c\0\0" /* offset 2466 */ + "\x09\x33\x09\x3c\0\0" /* offset 2472 */ + "\x09\x15\x09\x3c\0\0" /* offset 2478 */ + "\x09\x16\x09\x3c\0\0" /* offset 2484 */ + "\x09\x17\x09\x3c\0\0" /* offset 2490 */ + "\x09\x1c\x09\x3c\0\0" /* offset 2496 */ + "\x09\x21\x09\x3c\0\0" /* offset 2502 */ + "\x09\x22\x09\x3c\0\0" /* offset 2508 */ + "\x09\x2b\x09\x3c\0\0" /* offset 2514 */ + "\x09\x2f\x09\x3c\0\0" /* offset 2520 */ + "\x09\xc7\x09\xbe\0\0" /* offset 2526 */ + "\x09\xc7\x09\xd7\0\0" /* offset 2532 */ + "\x09\xa1\x09\xbc\0\0" /* offset 2538 */ + "\x09\xa2\x09\xbc\0\0" /* offset 2544 */ + "\x09\xaf\x09\xbc\0\0" /* offset 2550 */ + "\x0a\x32\x0a\x3c\0\0" /* offset 2556 */ + "\x0a\x38\x0a\x3c\0\0" /* offset 2562 */ + "\x0a\x16\x0a\x3c\0\0" /* offset 2568 */ + "\x0a\x17\x0a\x3c\0\0" /* offset 2574 */ + "\x0a\x1c\x0a\x3c\0\0" /* offset 2580 */ + "\x0a\x2b\x0a\x3c\0\0" /* offset 2586 */ + "\x0b\x47\x0b\x56\0\0" /* offset 2592 */ + "\x0b\x47\x0b\x3e\0\0" /* offset 2598 */ + "\x0b\x47\x0b\x57\0\0" /* offset 2604 */ + "\x0b\x21\x0b\x3c\0\0" /* offset 2610 */ + "\x0b\x22\x0b\x3c\0\0" /* offset 2616 */ + "\x0b\x92\x0b\xd7\0\0" /* offset 2622 */ + "\x0b\xc6\x0b\xbe\0\0" /* offset 2628 */ + "\x0b\xc7\x0b\xbe\0\0" /* offset 2634 */ + "\x0b\xc6\x0b\xd7\0\0" /* offset 2640 */ + "\x0c\x46\x0c\x56\0\0" /* offset 2646 */ + "\x0c\xbf\x0c\xd5\0\0" /* offset 2652 */ + "\x0c\xc6\x0c\xd5\0\0" /* offset 2658 */ + "\x0c\xc6\x0c\xd6\0\0" /* offset 2664 */ + "\x0c\xc6\x0c\xc2\0\0" /* offset 2670 */ + "\x0c\xc6\x0c\xc2\x0c\xd5\0\0" /* offset 2676 */ + "\x0d\x46\x0d\x3e\0\0" /* offset 2684 */ + "\x0d\x47\x0d\x3e\0\0" /* offset 2690 */ + "\x0d\x46\x0d\x57\0\0" /* offset 2696 */ + "\x0d\xd9\x0d\xca\0\0" /* offset 2702 */ + "\x0d\xd9\x0d\xcf\0\0" /* offset 2708 */ + "\x0d\xd9\x0d\xcf\x0d\xca\0\0" /* offset 2714 */ + "\x0d\xd9\x0d\xdf\0\0" /* offset 2722 */ + "\x0e\x4d\x0e\x32\0\0" /* offset 2728 */ + "\x0e\xcd\x0e\xb2\0\0" /* offset 2734 */ + "\x0e\xab\x0e\x99\0\0" /* offset 2740 */ + "\x0e\xab\x0e\xa1\0\0" /* offset 2746 */ + "\x0f\x0b\0\0" /* offset 2752 */ + "\x0f\x42\x0f\xb7\0\0" /* offset 2756 */ + "\x0f\x4c\x0f\xb7\0\0" /* offset 2762 */ + "\x0f\x51\x0f\xb7\0\0" /* offset 2768 */ + "\x0f\x56\x0f\xb7\0\0" /* offset 2774 */ + "\x0f\x5b\x0f\xb7\0\0" /* offset 2780 */ + "\x0f\x40\x0f\xb5\0\0" /* offset 2786 */ + "\x0f\x71\x0f\x72\0\0" /* offset 2792 */ + "\x0f\x71\x0f\x74\0\0" /* offset 2798 */ + "\x0f\xb2\x0f\x80\0\0" /* offset 2804 */ + "\x0f\xb2\x0f\x71\x0f\x80\0\0" /* offset 2810 */ + "\x0f\xb3\x0f\x80\0\0" /* offset 2818 */ + "\x0f\xb3\x0f\x71\x0f\x80\0\0" /* offset 2824 */ + "\x0f\x71\x0f\x80\0\0" /* offset 2832 */ + "\x0f\x92\x0f\xb7\0\0" /* offset 2838 */ + "\x0f\x9c\x0f\xb7\0\0" /* offset 2844 */ + "\x0f\xa1\x0f\xb7\0\0" /* offset 2850 */ + "\x0f\xa6\x0f\xb7\0\0" /* offset 2856 */ + "\x0f\xab\x0f\xb7\0\0" /* offset 2862 */ + "\x0f\x90\x0f\xb5\0\0" /* offset 2868 */ + "\x10\x25\x10\x2e\0\0" /* offset 2874 */ + "\x00\x41\x03\x25\0\0" /* offset 2880 */ + "\x00\x61\x03\x25\0\0" /* offset 2886 */ + "\x00\x42\x03\x07\0\0" /* offset 2892 */ + "\x00\x62\x03\x07\0\0" /* offset 2898 */ + "\x00\x42\x03\x23\0\0" /* offset 2904 */ + "\x00\x62\x03\x23\0\0" /* offset 2910 */ + "\x00\x42\x03\x31\0\0" /* offset 2916 */ + "\x00\x62\x03\x31\0\0" /* offset 2922 */ + "\x00\x43\x03\x27\x03\x01\0\0" /* offset 2928 */ + "\x00\x63\x03\x27\x03\x01\0\0" /* offset 2936 */ + "\x00\x44\x03\x07\0\0" /* offset 2944 */ + "\x00\x64\x03\x07\0\0" /* offset 2950 */ + "\x00\x44\x03\x23\0\0" /* offset 2956 */ + "\x00\x64\x03\x23\0\0" /* offset 2962 */ + "\x00\x44\x03\x31\0\0" /* offset 2968 */ + "\x00\x64\x03\x31\0\0" /* offset 2974 */ + "\x00\x44\x03\x27\0\0" /* offset 2980 */ + "\x00\x64\x03\x27\0\0" /* offset 2986 */ + "\x00\x44\x03\x2d\0\0" /* offset 2992 */ + "\x00\x64\x03\x2d\0\0" /* offset 2998 */ + "\x00\x45\x03\x04\x03\x00\0\0" /* offset 3004 */ + "\x00\x65\x03\x04\x03\x00\0\0" /* offset 3012 */ + "\x00\x45\x03\x04\x03\x01\0\0" /* offset 3020 */ + "\x00\x65\x03\x04\x03\x01\0\0" /* offset 3028 */ + "\x00\x45\x03\x2d\0\0" /* offset 3036 */ + "\x00\x65\x03\x2d\0\0" /* offset 3042 */ + "\x00\x45\x03\x30\0\0" /* offset 3048 */ + "\x00\x65\x03\x30\0\0" /* offset 3054 */ + "\x00\x45\x03\x27\x03\x06\0\0" /* offset 3060 */ + "\x00\x65\x03\x27\x03\x06\0\0" /* offset 3068 */ + "\x00\x46\x03\x07\0\0" /* offset 3076 */ + "\x00\x66\x03\x07\0\0" /* offset 3082 */ + "\x00\x47\x03\x04\0\0" /* offset 3088 */ + "\x00\x67\x03\x04\0\0" /* offset 3094 */ + "\x00\x48\x03\x07\0\0" /* offset 3100 */ + "\x00\x68\x03\x07\0\0" /* offset 3106 */ + "\x00\x48\x03\x23\0\0" /* offset 3112 */ + "\x00\x68\x03\x23\0\0" /* offset 3118 */ + "\x00\x48\x03\x08\0\0" /* offset 3124 */ + "\x00\x68\x03\x08\0\0" /* offset 3130 */ + "\x00\x48\x03\x27\0\0" /* offset 3136 */ + "\x00\x68\x03\x27\0\0" /* offset 3142 */ + "\x00\x48\x03\x2e\0\0" /* offset 3148 */ + "\x00\x68\x03\x2e\0\0" /* offset 3154 */ + "\x00\x49\x03\x30\0\0" /* offset 3160 */ + "\x00\x69\x03\x30\0\0" /* offset 3166 */ + "\x00\x49\x03\x08\x03\x01\0\0" /* offset 3172 */ + "\x00\x69\x03\x08\x03\x01\0\0" /* offset 3180 */ + "\x00\x4b\x03\x01\0\0" /* offset 3188 */ + "\x00\x6b\x03\x01\0\0" /* offset 3194 */ + "\x00\x4b\x03\x23\0\0" /* offset 3200 */ + "\x00\x6b\x03\x23\0\0" /* offset 3206 */ + "\x00\x4b\x03\x31\0\0" /* offset 3212 */ + "\x00\x6b\x03\x31\0\0" /* offset 3218 */ + "\x00\x4c\x03\x23\0\0" /* offset 3224 */ + "\x00\x6c\x03\x23\0\0" /* offset 3230 */ + "\x00\x4c\x03\x23\x03\x04\0\0" /* offset 3236 */ + "\x00\x6c\x03\x23\x03\x04\0\0" /* offset 3244 */ + "\x00\x4c\x03\x31\0\0" /* offset 3252 */ + "\x00\x6c\x03\x31\0\0" /* offset 3258 */ + "\x00\x4c\x03\x2d\0\0" /* offset 3264 */ + "\x00\x6c\x03\x2d\0\0" /* offset 3270 */ + "\x00\x4d\x03\x01\0\0" /* offset 3276 */ + "\x00\x6d\x03\x01\0\0" /* offset 3282 */ + "\x00\x4d\x03\x07\0\0" /* offset 3288 */ + "\x00\x6d\x03\x07\0\0" /* offset 3294 */ + "\x00\x4d\x03\x23\0\0" /* offset 3300 */ + "\x00\x6d\x03\x23\0\0" /* offset 3306 */ + "\x00\x4e\x03\x07\0\0" /* offset 3312 */ + "\x00\x6e\x03\x07\0\0" /* offset 3318 */ + "\x00\x4e\x03\x23\0\0" /* offset 3324 */ + "\x00\x6e\x03\x23\0\0" /* offset 3330 */ + "\x00\x4e\x03\x31\0\0" /* offset 3336 */ + "\x00\x6e\x03\x31\0\0" /* offset 3342 */ + "\x00\x4e\x03\x2d\0\0" /* offset 3348 */ + "\x00\x6e\x03\x2d\0\0" /* offset 3354 */ + "\x00\x4f\x03\x03\x03\x01\0\0" /* offset 3360 */ + "\x00\x6f\x03\x03\x03\x01\0\0" /* offset 3368 */ + "\x00\x4f\x03\x03\x03\x08\0\0" /* offset 3376 */ + "\x00\x6f\x03\x03\x03\x08\0\0" /* offset 3384 */ + "\x00\x4f\x03\x04\x03\x00\0\0" /* offset 3392 */ + "\x00\x6f\x03\x04\x03\x00\0\0" /* offset 3400 */ + "\x00\x4f\x03\x04\x03\x01\0\0" /* offset 3408 */ + "\x00\x6f\x03\x04\x03\x01\0\0" /* offset 3416 */ + "\x00\x50\x03\x01\0\0" /* offset 3424 */ + "\x00\x70\x03\x01\0\0" /* offset 3430 */ + "\x00\x50\x03\x07\0\0" /* offset 3436 */ + "\x00\x70\x03\x07\0\0" /* offset 3442 */ + "\x00\x52\x03\x07\0\0" /* offset 3448 */ + "\x00\x72\x03\x07\0\0" /* offset 3454 */ + "\x00\x52\x03\x23\0\0" /* offset 3460 */ + "\x00\x72\x03\x23\0\0" /* offset 3466 */ + "\x00\x52\x03\x23\x03\x04\0\0" /* offset 3472 */ + "\x00\x72\x03\x23\x03\x04\0\0" /* offset 3480 */ + "\x00\x52\x03\x31\0\0" /* offset 3488 */ + "\x00\x72\x03\x31\0\0" /* offset 3494 */ + "\x00\x53\x03\x07\0\0" /* offset 3500 */ + "\x00\x73\x03\x07\0\0" /* offset 3506 */ + "\x00\x53\x03\x23\0\0" /* offset 3512 */ + "\x00\x73\x03\x23\0\0" /* offset 3518 */ + "\x00\x53\x03\x01\x03\x07\0\0" /* offset 3524 */ + "\x00\x73\x03\x01\x03\x07\0\0" /* offset 3532 */ + "\x00\x53\x03\x0c\x03\x07\0\0" /* offset 3540 */ + "\x00\x73\x03\x0c\x03\x07\0\0" /* offset 3548 */ + "\x00\x53\x03\x23\x03\x07\0\0" /* offset 3556 */ + "\x00\x73\x03\x23\x03\x07\0\0" /* offset 3564 */ + "\x00\x54\x03\x07\0\0" /* offset 3572 */ + "\x00\x74\x03\x07\0\0" /* offset 3578 */ + "\x00\x54\x03\x23\0\0" /* offset 3584 */ + "\x00\x74\x03\x23\0\0" /* offset 3590 */ + "\x00\x54\x03\x31\0\0" /* offset 3596 */ + "\x00\x74\x03\x31\0\0" /* offset 3602 */ + "\x00\x54\x03\x2d\0\0" /* offset 3608 */ + "\x00\x74\x03\x2d\0\0" /* offset 3614 */ + "\x00\x55\x03\x24\0\0" /* offset 3620 */ + "\x00\x75\x03\x24\0\0" /* offset 3626 */ + "\x00\x55\x03\x30\0\0" /* offset 3632 */ + "\x00\x75\x03\x30\0\0" /* offset 3638 */ + "\x00\x55\x03\x2d\0\0" /* offset 3644 */ + "\x00\x75\x03\x2d\0\0" /* offset 3650 */ + "\x00\x55\x03\x03\x03\x01\0\0" /* offset 3656 */ + "\x00\x75\x03\x03\x03\x01\0\0" /* offset 3664 */ + "\x00\x55\x03\x04\x03\x08\0\0" /* offset 3672 */ + "\x00\x75\x03\x04\x03\x08\0\0" /* offset 3680 */ + "\x00\x56\x03\x03\0\0" /* offset 3688 */ + "\x00\x76\x03\x03\0\0" /* offset 3694 */ + "\x00\x56\x03\x23\0\0" /* offset 3700 */ + "\x00\x76\x03\x23\0\0" /* offset 3706 */ + "\x00\x57\x03\x00\0\0" /* offset 3712 */ + "\x00\x77\x03\x00\0\0" /* offset 3718 */ + "\x00\x57\x03\x01\0\0" /* offset 3724 */ + "\x00\x77\x03\x01\0\0" /* offset 3730 */ + "\x00\x57\x03\x08\0\0" /* offset 3736 */ + "\x00\x77\x03\x08\0\0" /* offset 3742 */ + "\x00\x57\x03\x07\0\0" /* offset 3748 */ + "\x00\x77\x03\x07\0\0" /* offset 3754 */ + "\x00\x57\x03\x23\0\0" /* offset 3760 */ + "\x00\x77\x03\x23\0\0" /* offset 3766 */ + "\x00\x58\x03\x07\0\0" /* offset 3772 */ + "\x00\x78\x03\x07\0\0" /* offset 3778 */ + "\x00\x58\x03\x08\0\0" /* offset 3784 */ + "\x00\x78\x03\x08\0\0" /* offset 3790 */ + "\x00\x59\x03\x07\0\0" /* offset 3796 */ + "\x00\x79\x03\x07\0\0" /* offset 3802 */ + "\x00\x5a\x03\x02\0\0" /* offset 3808 */ + "\x00\x7a\x03\x02\0\0" /* offset 3814 */ + "\x00\x5a\x03\x23\0\0" /* offset 3820 */ + "\x00\x7a\x03\x23\0\0" /* offset 3826 */ + "\x00\x5a\x03\x31\0\0" /* offset 3832 */ + "\x00\x7a\x03\x31\0\0" /* offset 3838 */ + "\x00\x68\x03\x31\0\0" /* offset 3844 */ + "\x00\x74\x03\x08\0\0" /* offset 3850 */ + "\x00\x77\x03\x0a\0\0" /* offset 3856 */ + "\x00\x79\x03\x0a\0\0" /* offset 3862 */ + "\x00\x61\x02\xbe\0\0" /* offset 3868 */ + "\x01\x7f\x03\x07\x00\x00\x00\x73\x03\x07\0\0" /* offset 3874 */ + "\x00\x41\x03\x23\0\0" /* offset 3886 */ + "\x00\x61\x03\x23\0\0" /* offset 3892 */ + "\x00\x41\x03\x09\0\0" /* offset 3898 */ + "\x00\x61\x03\x09\0\0" /* offset 3904 */ + "\x00\x41\x03\x02\x03\x01\0\0" /* offset 3910 */ + "\x00\x61\x03\x02\x03\x01\0\0" /* offset 3918 */ + "\x00\x41\x03\x02\x03\x00\0\0" /* offset 3926 */ + "\x00\x61\x03\x02\x03\x00\0\0" /* offset 3934 */ + "\x00\x41\x03\x02\x03\x09\0\0" /* offset 3942 */ + "\x00\x61\x03\x02\x03\x09\0\0" /* offset 3950 */ + "\x00\x41\x03\x02\x03\x03\0\0" /* offset 3958 */ + "\x00\x61\x03\x02\x03\x03\0\0" /* offset 3966 */ + "\x00\x41\x03\x23\x03\x02\0\0" /* offset 3974 */ + "\x00\x61\x03\x23\x03\x02\0\0" /* offset 3982 */ + "\x00\x41\x03\x06\x03\x01\0\0" /* offset 3990 */ + "\x00\x61\x03\x06\x03\x01\0\0" /* offset 3998 */ + "\x00\x41\x03\x06\x03\x00\0\0" /* offset 4006 */ + "\x00\x61\x03\x06\x03\x00\0\0" /* offset 4014 */ + "\x00\x41\x03\x06\x03\x09\0\0" /* offset 4022 */ + "\x00\x61\x03\x06\x03\x09\0\0" /* offset 4030 */ + "\x00\x41\x03\x06\x03\x03\0\0" /* offset 4038 */ + "\x00\x61\x03\x06\x03\x03\0\0" /* offset 4046 */ + "\x00\x41\x03\x23\x03\x06\0\0" /* offset 4054 */ + "\x00\x61\x03\x23\x03\x06\0\0" /* offset 4062 */ + "\x00\x45\x03\x23\0\0" /* offset 4070 */ + "\x00\x65\x03\x23\0\0" /* offset 4076 */ + "\x00\x45\x03\x09\0\0" /* offset 4082 */ + "\x00\x65\x03\x09\0\0" /* offset 4088 */ + "\x00\x45\x03\x03\0\0" /* offset 4094 */ + "\x00\x65\x03\x03\0\0" /* offset 4100 */ + "\x00\x45\x03\x02\x03\x01\0\0" /* offset 4106 */ + "\x00\x65\x03\x02\x03\x01\0\0" /* offset 4114 */ + "\x00\x45\x03\x02\x03\x00\0\0" /* offset 4122 */ + "\x00\x65\x03\x02\x03\x00\0\0" /* offset 4130 */ + "\x00\x45\x03\x02\x03\x09\0\0" /* offset 4138 */ + "\x00\x65\x03\x02\x03\x09\0\0" /* offset 4146 */ + "\x00\x45\x03\x02\x03\x03\0\0" /* offset 4154 */ + "\x00\x65\x03\x02\x03\x03\0\0" /* offset 4162 */ + "\x00\x45\x03\x23\x03\x02\0\0" /* offset 4170 */ + "\x00\x65\x03\x23\x03\x02\0\0" /* offset 4178 */ + "\x00\x49\x03\x09\0\0" /* offset 4186 */ + "\x00\x69\x03\x09\0\0" /* offset 4192 */ + "\x00\x49\x03\x23\0\0" /* offset 4198 */ + "\x00\x69\x03\x23\0\0" /* offset 4204 */ + "\x00\x4f\x03\x23\0\0" /* offset 4210 */ + "\x00\x6f\x03\x23\0\0" /* offset 4216 */ + "\x00\x4f\x03\x09\0\0" /* offset 4222 */ + "\x00\x6f\x03\x09\0\0" /* offset 4228 */ + "\x00\x4f\x03\x02\x03\x01\0\0" /* offset 4234 */ + "\x00\x6f\x03\x02\x03\x01\0\0" /* offset 4242 */ + "\x00\x4f\x03\x02\x03\x00\0\0" /* offset 4250 */ + "\x00\x6f\x03\x02\x03\x00\0\0" /* offset 4258 */ + "\x00\x4f\x03\x02\x03\x09\0\0" /* offset 4266 */ + "\x00\x6f\x03\x02\x03\x09\0\0" /* offset 4274 */ + "\x00\x4f\x03\x02\x03\x03\0\0" /* offset 4282 */ + "\x00\x6f\x03\x02\x03\x03\0\0" /* offset 4290 */ + "\x00\x4f\x03\x23\x03\x02\0\0" /* offset 4298 */ + "\x00\x6f\x03\x23\x03\x02\0\0" /* offset 4306 */ + "\x00\x4f\x03\x1b\x03\x01\0\0" /* offset 4314 */ + "\x00\x6f\x03\x1b\x03\x01\0\0" /* offset 4322 */ + "\x00\x4f\x03\x1b\x03\x00\0\0" /* offset 4330 */ + "\x00\x6f\x03\x1b\x03\x00\0\0" /* offset 4338 */ + "\x00\x4f\x03\x1b\x03\x09\0\0" /* offset 4346 */ + "\x00\x6f\x03\x1b\x03\x09\0\0" /* offset 4354 */ + "\x00\x4f\x03\x1b\x03\x03\0\0" /* offset 4362 */ + "\x00\x6f\x03\x1b\x03\x03\0\0" /* offset 4370 */ + "\x00\x4f\x03\x1b\x03\x23\0\0" /* offset 4378 */ + "\x00\x6f\x03\x1b\x03\x23\0\0" /* offset 4386 */ + "\x00\x55\x03\x23\0\0" /* offset 4394 */ + "\x00\x75\x03\x23\0\0" /* offset 4400 */ + "\x00\x55\x03\x09\0\0" /* offset 4406 */ + "\x00\x75\x03\x09\0\0" /* offset 4412 */ + "\x00\x55\x03\x1b\x03\x01\0\0" /* offset 4418 */ + "\x00\x75\x03\x1b\x03\x01\0\0" /* offset 4426 */ + "\x00\x55\x03\x1b\x03\x00\0\0" /* offset 4434 */ + "\x00\x75\x03\x1b\x03\x00\0\0" /* offset 4442 */ + "\x00\x55\x03\x1b\x03\x09\0\0" /* offset 4450 */ + "\x00\x75\x03\x1b\x03\x09\0\0" /* offset 4458 */ + "\x00\x55\x03\x1b\x03\x03\0\0" /* offset 4466 */ + "\x00\x75\x03\x1b\x03\x03\0\0" /* offset 4474 */ + "\x00\x55\x03\x1b\x03\x23\0\0" /* offset 4482 */ + "\x00\x75\x03\x1b\x03\x23\0\0" /* offset 4490 */ + "\x00\x59\x03\x00\0\0" /* offset 4498 */ + "\x00\x79\x03\x00\0\0" /* offset 4504 */ + "\x00\x59\x03\x23\0\0" /* offset 4510 */ + "\x00\x79\x03\x23\0\0" /* offset 4516 */ + "\x00\x59\x03\x09\0\0" /* offset 4522 */ + "\x00\x79\x03\x09\0\0" /* offset 4528 */ + "\x00\x59\x03\x03\0\0" /* offset 4534 */ + "\x00\x79\x03\x03\0\0" /* offset 4540 */ + "\x03\xb1\x03\x13\0\0" /* offset 4546 */ + "\x03\xb1\x03\x14\0\0" /* offset 4552 */ + "\x03\xb1\x03\x13\x03\x00\0\0" /* offset 4558 */ + "\x03\xb1\x03\x14\x03\x00\0\0" /* offset 4566 */ + "\x03\xb1\x03\x13\x03\x01\0\0" /* offset 4574 */ + "\x03\xb1\x03\x14\x03\x01\0\0" /* offset 4582 */ + "\x03\xb1\x03\x13\x03\x42\0\0" /* offset 4590 */ + "\x03\xb1\x03\x14\x03\x42\0\0" /* offset 4598 */ + "\x03\x91\x03\x13\0\0" /* offset 4606 */ + "\x03\x91\x03\x14\0\0" /* offset 4612 */ + "\x03\x91\x03\x13\x03\x00\0\0" /* offset 4618 */ + "\x03\x91\x03\x14\x03\x00\0\0" /* offset 4626 */ + "\x03\x91\x03\x13\x03\x01\0\0" /* offset 4634 */ + "\x03\x91\x03\x14\x03\x01\0\0" /* offset 4642 */ + "\x03\x91\x03\x13\x03\x42\0\0" /* offset 4650 */ + "\x03\x91\x03\x14\x03\x42\0\0" /* offset 4658 */ + "\x03\xb5\x03\x13\0\0" /* offset 4666 */ + "\x03\xb5\x03\x14\0\0" /* offset 4672 */ + "\x03\xb5\x03\x13\x03\x00\0\0" /* offset 4678 */ + "\x03\xb5\x03\x14\x03\x00\0\0" /* offset 4686 */ + "\x03\xb5\x03\x13\x03\x01\0\0" /* offset 4694 */ + "\x03\xb5\x03\x14\x03\x01\0\0" /* offset 4702 */ + "\x03\x95\x03\x13\0\0" /* offset 4710 */ + "\x03\x95\x03\x14\0\0" /* offset 4716 */ + "\x03\x95\x03\x13\x03\x00\0\0" /* offset 4722 */ + "\x03\x95\x03\x14\x03\x00\0\0" /* offset 4730 */ + "\x03\x95\x03\x13\x03\x01\0\0" /* offset 4738 */ + "\x03\x95\x03\x14\x03\x01\0\0" /* offset 4746 */ + "\x03\xb7\x03\x13\0\0" /* offset 4754 */ + "\x03\xb7\x03\x14\0\0" /* offset 4760 */ + "\x03\xb7\x03\x13\x03\x00\0\0" /* offset 4766 */ + "\x03\xb7\x03\x14\x03\x00\0\0" /* offset 4774 */ + "\x03\xb7\x03\x13\x03\x01\0\0" /* offset 4782 */ + "\x03\xb7\x03\x14\x03\x01\0\0" /* offset 4790 */ + "\x03\xb7\x03\x13\x03\x42\0\0" /* offset 4798 */ + "\x03\xb7\x03\x14\x03\x42\0\0" /* offset 4806 */ + "\x03\x97\x03\x13\0\0" /* offset 4814 */ + "\x03\x97\x03\x14\0\0" /* offset 4820 */ + "\x03\x97\x03\x13\x03\x00\0\0" /* offset 4826 */ + "\x03\x97\x03\x14\x03\x00\0\0" /* offset 4834 */ + "\x03\x97\x03\x13\x03\x01\0\0" /* offset 4842 */ + "\x03\x97\x03\x14\x03\x01\0\0" /* offset 4850 */ + "\x03\x97\x03\x13\x03\x42\0\0" /* offset 4858 */ + "\x03\x97\x03\x14\x03\x42\0\0" /* offset 4866 */ + "\x03\xb9\x03\x13\0\0" /* offset 4874 */ + "\x03\xb9\x03\x14\0\0" /* offset 4880 */ + "\x03\xb9\x03\x13\x03\x00\0\0" /* offset 4886 */ + "\x03\xb9\x03\x14\x03\x00\0\0" /* offset 4894 */ + "\x03\xb9\x03\x13\x03\x01\0\0" /* offset 4902 */ + "\x03\xb9\x03\x14\x03\x01\0\0" /* offset 4910 */ + "\x03\xb9\x03\x13\x03\x42\0\0" /* offset 4918 */ + "\x03\xb9\x03\x14\x03\x42\0\0" /* offset 4926 */ + "\x03\x99\x03\x13\0\0" /* offset 4934 */ + "\x03\x99\x03\x14\0\0" /* offset 4940 */ + "\x03\x99\x03\x13\x03\x00\0\0" /* offset 4946 */ + "\x03\x99\x03\x14\x03\x00\0\0" /* offset 4954 */ + "\x03\x99\x03\x13\x03\x01\0\0" /* offset 4962 */ + "\x03\x99\x03\x14\x03\x01\0\0" /* offset 4970 */ + "\x03\x99\x03\x13\x03\x42\0\0" /* offset 4978 */ + "\x03\x99\x03\x14\x03\x42\0\0" /* offset 4986 */ + "\x03\xbf\x03\x13\0\0" /* offset 4994 */ + "\x03\xbf\x03\x14\0\0" /* offset 5000 */ + "\x03\xbf\x03\x13\x03\x00\0\0" /* offset 5006 */ + "\x03\xbf\x03\x14\x03\x00\0\0" /* offset 5014 */ + "\x03\xbf\x03\x13\x03\x01\0\0" /* offset 5022 */ + "\x03\xbf\x03\x14\x03\x01\0\0" /* offset 5030 */ + "\x03\x9f\x03\x13\0\0" /* offset 5038 */ + "\x03\x9f\x03\x14\0\0" /* offset 5044 */ + "\x03\x9f\x03\x13\x03\x00\0\0" /* offset 5050 */ + "\x03\x9f\x03\x14\x03\x00\0\0" /* offset 5058 */ + "\x03\x9f\x03\x13\x03\x01\0\0" /* offset 5066 */ + "\x03\x9f\x03\x14\x03\x01\0\0" /* offset 5074 */ + "\x03\xc5\x03\x13\0\0" /* offset 5082 */ + "\x03\xc5\x03\x14\0\0" /* offset 5088 */ + "\x03\xc5\x03\x13\x03\x00\0\0" /* offset 5094 */ + "\x03\xc5\x03\x14\x03\x00\0\0" /* offset 5102 */ + "\x03\xc5\x03\x13\x03\x01\0\0" /* offset 5110 */ + "\x03\xc5\x03\x14\x03\x01\0\0" /* offset 5118 */ + "\x03\xc5\x03\x13\x03\x42\0\0" /* offset 5126 */ + "\x03\xc5\x03\x14\x03\x42\0\0" /* offset 5134 */ + "\x03\xa5\x03\x14\0\0" /* offset 5142 */ + "\x03\xa5\x03\x14\x03\x00\0\0" /* offset 5148 */ + "\x03\xa5\x03\x14\x03\x01\0\0" /* offset 5156 */ + "\x03\xa5\x03\x14\x03\x42\0\0" /* offset 5164 */ + "\x03\xc9\x03\x13\0\0" /* offset 5172 */ + "\x03\xc9\x03\x14\0\0" /* offset 5178 */ + "\x03\xc9\x03\x13\x03\x00\0\0" /* offset 5184 */ + "\x03\xc9\x03\x14\x03\x00\0\0" /* offset 5192 */ + "\x03\xc9\x03\x13\x03\x01\0\0" /* offset 5200 */ + "\x03\xc9\x03\x14\x03\x01\0\0" /* offset 5208 */ + "\x03\xc9\x03\x13\x03\x42\0\0" /* offset 5216 */ + "\x03\xc9\x03\x14\x03\x42\0\0" /* offset 5224 */ + "\x03\xa9\x03\x13\0\0" /* offset 5232 */ + "\x03\xa9\x03\x14\0\0" /* offset 5238 */ + "\x03\xa9\x03\x13\x03\x00\0\0" /* offset 5244 */ + "\x03\xa9\x03\x14\x03\x00\0\0" /* offset 5252 */ + "\x03\xa9\x03\x13\x03\x01\0\0" /* offset 5260 */ + "\x03\xa9\x03\x14\x03\x01\0\0" /* offset 5268 */ + "\x03\xa9\x03\x13\x03\x42\0\0" /* offset 5276 */ + "\x03\xa9\x03\x14\x03\x42\0\0" /* offset 5284 */ + "\x03\xb1\x03\x00\0\0" /* offset 5292 */ + "\x03\xb5\x03\x00\0\0" /* offset 5298 */ + "\x03\xb7\x03\x00\0\0" /* offset 5304 */ + "\x03\xb9\x03\x00\0\0" /* offset 5310 */ + "\x03\xbf\x03\x00\0\0" /* offset 5316 */ + "\x03\xc5\x03\x00\0\0" /* offset 5322 */ + "\x03\xc9\x03\x00\0\0" /* offset 5328 */ + "\x03\xb1\x03\x13\x03\x45\0\0" /* offset 5334 */ + "\x03\xb1\x03\x14\x03\x45\0\0" /* offset 5342 */ + "\x03\xb1\x03\x13\x03\x00\x03\x45\0\0" /* offset 5350 */ + "\x03\xb1\x03\x14\x03\x00\x03\x45\0\0" /* offset 5360 */ + "\x03\xb1\x03\x13\x03\x01\x03\x45\0\0" /* offset 5370 */ + "\x03\xb1\x03\x14\x03\x01\x03\x45\0\0" /* offset 5380 */ + "\x03\xb1\x03\x13\x03\x42\x03\x45\0\0" /* offset 5390 */ + "\x03\xb1\x03\x14\x03\x42\x03\x45\0\0" /* offset 5400 */ + "\x03\x91\x03\x13\x03\x45\0\0" /* offset 5410 */ + "\x03\x91\x03\x14\x03\x45\0\0" /* offset 5418 */ + "\x03\x91\x03\x13\x03\x00\x03\x45\0\0" /* offset 5426 */ + "\x03\x91\x03\x14\x03\x00\x03\x45\0\0" /* offset 5436 */ + "\x03\x91\x03\x13\x03\x01\x03\x45\0\0" /* offset 5446 */ + "\x03\x91\x03\x14\x03\x01\x03\x45\0\0" /* offset 5456 */ + "\x03\x91\x03\x13\x03\x42\x03\x45\0\0" /* offset 5466 */ + "\x03\x91\x03\x14\x03\x42\x03\x45\0\0" /* offset 5476 */ + "\x03\xb7\x03\x13\x03\x45\0\0" /* offset 5486 */ + "\x03\xb7\x03\x14\x03\x45\0\0" /* offset 5494 */ + "\x03\xb7\x03\x13\x03\x00\x03\x45\0\0" /* offset 5502 */ + "\x03\xb7\x03\x14\x03\x00\x03\x45\0\0" /* offset 5512 */ + "\x03\xb7\x03\x13\x03\x01\x03\x45\0\0" /* offset 5522 */ + "\x03\xb7\x03\x14\x03\x01\x03\x45\0\0" /* offset 5532 */ + "\x03\xb7\x03\x13\x03\x42\x03\x45\0\0" /* offset 5542 */ + "\x03\xb7\x03\x14\x03\x42\x03\x45\0\0" /* offset 5552 */ + "\x03\x97\x03\x13\x03\x45\0\0" /* offset 5562 */ + "\x03\x97\x03\x14\x03\x45\0\0" /* offset 5570 */ + "\x03\x97\x03\x13\x03\x00\x03\x45\0\0" /* offset 5578 */ + "\x03\x97\x03\x14\x03\x00\x03\x45\0\0" /* offset 5588 */ + "\x03\x97\x03\x13\x03\x01\x03\x45\0\0" /* offset 5598 */ + "\x03\x97\x03\x14\x03\x01\x03\x45\0\0" /* offset 5608 */ + "\x03\x97\x03\x13\x03\x42\x03\x45\0\0" /* offset 5618 */ + "\x03\x97\x03\x14\x03\x42\x03\x45\0\0" /* offset 5628 */ + "\x03\xc9\x03\x13\x03\x45\0\0" /* offset 5638 */ + "\x03\xc9\x03\x14\x03\x45\0\0" /* offset 5646 */ + "\x03\xc9\x03\x13\x03\x00\x03\x45\0\0" /* offset 5654 */ + "\x03\xc9\x03\x14\x03\x00\x03\x45\0\0" /* offset 5664 */ + "\x03\xc9\x03\x13\x03\x01\x03\x45\0\0" /* offset 5674 */ + "\x03\xc9\x03\x14\x03\x01\x03\x45\0\0" /* offset 5684 */ + "\x03\xc9\x03\x13\x03\x42\x03\x45\0\0" /* offset 5694 */ + "\x03\xc9\x03\x14\x03\x42\x03\x45\0\0" /* offset 5704 */ + "\x03\xa9\x03\x13\x03\x45\0\0" /* offset 5714 */ + "\x03\xa9\x03\x14\x03\x45\0\0" /* offset 5722 */ + "\x03\xa9\x03\x13\x03\x00\x03\x45\0\0" /* offset 5730 */ + "\x03\xa9\x03\x14\x03\x00\x03\x45\0\0" /* offset 5740 */ + "\x03\xa9\x03\x13\x03\x01\x03\x45\0\0" /* offset 5750 */ + "\x03\xa9\x03\x14\x03\x01\x03\x45\0\0" /* offset 5760 */ + "\x03\xa9\x03\x13\x03\x42\x03\x45\0\0" /* offset 5770 */ + "\x03\xa9\x03\x14\x03\x42\x03\x45\0\0" /* offset 5780 */ + "\x03\xb1\x03\x06\0\0" /* offset 5790 */ + "\x03\xb1\x03\x04\0\0" /* offset 5796 */ + "\x03\xb1\x03\x00\x03\x45\0\0" /* offset 5802 */ + "\x03\xb1\x03\x45\0\0" /* offset 5810 */ + "\x03\xb1\x03\x01\x03\x45\0\0" /* offset 5816 */ + "\x03\xb1\x03\x42\0\0" /* offset 5824 */ + "\x03\xb1\x03\x42\x03\x45\0\0" /* offset 5830 */ + "\x03\x91\x03\x06\0\0" /* offset 5838 */ + "\x03\x91\x03\x04\0\0" /* offset 5844 */ + "\x03\x91\x03\x00\0\0" /* offset 5850 */ + "\x03\x91\x03\x45\0\0" /* offset 5856 */ + "\x00\x20\x03\x13\0\0" /* offset 5862 */ + "\x03\xb9\0\0" /* offset 5868 */ + "\x00\x20\x03\x42\0\0" /* offset 5872 */ + "\x00\xa8\x03\x42\x00\x00\x00\x20\x03\x08\x03\x42\0\0" /* offset 5878 */ + "\x03\xb7\x03\x00\x03\x45\0\0" /* offset 5892 */ + "\x03\xb7\x03\x45\0\0" /* offset 5900 */ + "\x03\xb7\x03\x01\x03\x45\0\0" /* offset 5906 */ + "\x03\xb7\x03\x42\0\0" /* offset 5914 */ + "\x03\xb7\x03\x42\x03\x45\0\0" /* offset 5920 */ + "\x03\x95\x03\x00\0\0" /* offset 5928 */ + "\x03\x97\x03\x00\0\0" /* offset 5934 */ + "\x03\x97\x03\x45\0\0" /* offset 5940 */ + "\x1f\xbf\x03\x00\x00\x00\x00\x20\x03\x13\x03\x00\0\0" /* offset 5946 */ + "\x1f\xbf\x03\x01\x00\x00\x00\x20\x03\x13\x03\x01\0\0" /* offset 5960 */ + "\x1f\xbf\x03\x42\x00\x00\x00\x20\x03\x13\x03\x42\0\0" /* offset 5974 */ + "\x03\xb9\x03\x06\0\0" /* offset 5988 */ + "\x03\xb9\x03\x04\0\0" /* offset 5994 */ + "\x03\xb9\x03\x08\x03\x00\0\0" /* offset 6000 */ + "\x03\xb9\x03\x42\0\0" /* offset 6008 */ + "\x03\xb9\x03\x08\x03\x42\0\0" /* offset 6014 */ + "\x03\x99\x03\x06\0\0" /* offset 6022 */ + "\x03\x99\x03\x04\0\0" /* offset 6028 */ + "\x03\x99\x03\x00\0\0" /* offset 6034 */ + "\x1f\xfe\x03\x00\x00\x00\x00\x20\x03\x14\x03\x00\0\0" /* offset 6040 */ + "\x1f\xfe\x03\x01\x00\x00\x00\x20\x03\x14\x03\x01\0\0" /* offset 6054 */ + "\x1f\xfe\x03\x42\x00\x00\x00\x20\x03\x14\x03\x42\0\0" /* offset 6068 */ + "\x03\xc5\x03\x06\0\0" /* offset 6082 */ + "\x03\xc5\x03\x04\0\0" /* offset 6088 */ + "\x03\xc5\x03\x08\x03\x00\0\0" /* offset 6094 */ + "\x03\xc1\x03\x13\0\0" /* offset 6102 */ + "\x03\xc1\x03\x14\0\0" /* offset 6108 */ + "\x03\xc5\x03\x42\0\0" /* offset 6114 */ + "\x03\xc5\x03\x08\x03\x42\0\0" /* offset 6120 */ + "\x03\xa5\x03\x06\0\0" /* offset 6128 */ + "\x03\xa5\x03\x04\0\0" /* offset 6134 */ + "\x03\xa5\x03\x00\0\0" /* offset 6140 */ + "\x03\xa1\x03\x14\0\0" /* offset 6146 */ + "\x00\xa8\x03\x00\x00\x00\x00\x20\x03\x08\x03\x00\0\0" /* offset 6152 */ + "\x00\x60\0\0" /* offset 6166 */ + "\x03\xc9\x03\x00\x03\x45\0\0" /* offset 6170 */ + "\x03\xc9\x03\x45\0\0" /* offset 6178 */ + "\x03\xc9\x03\x01\x03\x45\0\0" /* offset 6184 */ + "\x03\xc9\x03\x42\0\0" /* offset 6192 */ + "\x03\xc9\x03\x42\x03\x45\0\0" /* offset 6198 */ + "\x03\x9f\x03\x00\0\0" /* offset 6206 */ + "\x03\xa9\x03\x00\0\0" /* offset 6212 */ + "\x03\xa9\x03\x45\0\0" /* offset 6218 */ + "\x00\xb4\x00\x00\x00\x20\x03\x01\0\0" /* offset 6224 */ + "\x00\x20\x03\x14\0\0" /* offset 6234 */ + "\x20\x02\x00\x00\x00\x20\0\0" /* offset 6240 */ + "\x20\x03\x00\x00\x00\x20\0\0" /* offset 6248 */ + "\x20\x10\0\0" /* offset 6256 */ + "\x00\x20\x03\x33\0\0" /* offset 6260 */ + "\x00\x2e\0\0" /* offset 6266 */ + "\x00\x2e\x00\x2e\0\0" /* offset 6270 */ + "\x00\x2e\x00\x2e\x00\x2e\0\0" /* offset 6276 */ + "\x20\x32\x20\x32\0\0" /* offset 6284 */ + "\x20\x32\x20\x32\x20\x32\0\0" /* offset 6290 */ + "\x20\x35\x20\x35\0\0" /* offset 6298 */ + "\x20\x35\x20\x35\x20\x35\0\0" /* offset 6304 */ + "\x00\x21\x00\x21\0\0" /* offset 6312 */ + "\x00\x20\x03\x05\0\0" /* offset 6318 */ + "\x00\x3f\x00\x3f\0\0" /* offset 6324 */ + "\x00\x3f\x00\x21\0\0" /* offset 6330 */ + "\x00\x21\x00\x3f\0\0" /* offset 6336 */ + "\x20\x32\x20\x32\x20\x32\x20\x32\0\0" /* offset 6342 */ + "\x00\x30\0\0" /* offset 6352 */ + "\x00\x69\0\0" /* offset 6356 */ + "\x00\x34\0\0" /* offset 6360 */ + "\x00\x35\0\0" /* offset 6364 */ + "\x00\x36\0\0" /* offset 6368 */ + "\x00\x37\0\0" /* offset 6372 */ + "\x00\x38\0\0" /* offset 6376 */ + "\x00\x39\0\0" /* offset 6380 */ + "\x00\x2b\0\0" /* offset 6384 */ + "\x22\x12\0\0" /* offset 6388 */ + "\x00\x3d\0\0" /* offset 6392 */ + "\x00\x28\0\0" /* offset 6396 */ + "\x00\x29\0\0" /* offset 6400 */ + "\x00\x6e\0\0" /* offset 6404 */ + "\x00\x52\x00\x73\0\0" /* offset 6408 */ + "\x00\x61\x00\x2f\x00\x63\0\0" /* offset 6414 */ + "\x00\x61\x00\x2f\x00\x73\0\0" /* offset 6422 */ + "\x00\x43\0\0" /* offset 6430 */ + "\x00\xb0\x00\x43\0\0" /* offset 6434 */ + "\x00\x63\x00\x2f\x00\x6f\0\0" /* offset 6440 */ + "\x00\x63\x00\x2f\x00\x75\0\0" /* offset 6448 */ + "\x01\x90\0\0" /* offset 6456 */ + "\x00\xb0\x00\x46\0\0" /* offset 6460 */ + "\x00\x67\0\0" /* offset 6466 */ + "\x00\x48\0\0" /* offset 6470 */ + "\x01\x27\0\0" /* offset 6474 */ + "\x00\x49\0\0" /* offset 6478 */ + "\x00\x4c\0\0" /* offset 6482 */ + "\x00\x4e\0\0" /* offset 6486 */ + "\x00\x4e\x00\x6f\0\0" /* offset 6490 */ + "\x00\x50\0\0" /* offset 6496 */ + "\x00\x51\0\0" /* offset 6500 */ + "\x00\x52\0\0" /* offset 6504 */ + "\x00\x53\x00\x4d\0\0" /* offset 6508 */ + "\x00\x54\x00\x45\x00\x4c\0\0" /* offset 6514 */ + "\x00\x54\x00\x4d\0\0" /* offset 6522 */ + "\x00\x5a\0\0" /* offset 6528 */ + "\x03\xa9\0\0" /* offset 6532 */ + "\x00\x4b\0\0" /* offset 6536 */ + "\x00\x42\0\0" /* offset 6540 */ + "\x00\x65\0\0" /* offset 6544 */ + "\x00\x45\0\0" /* offset 6548 */ + "\x00\x46\0\0" /* offset 6552 */ + "\x00\x4d\0\0" /* offset 6556 */ + "\x05\xd0\0\0" /* offset 6560 */ + "\x05\xd1\0\0" /* offset 6564 */ + "\x05\xd2\0\0" /* offset 6568 */ + "\x05\xd3\0\0" /* offset 6572 */ + "\x03\xb3\0\0" /* offset 6576 */ + "\x03\x93\0\0" /* offset 6580 */ + "\x03\xa0\0\0" /* offset 6584 */ + "\x22\x11\0\0" /* offset 6588 */ + "\x00\x44\0\0" /* offset 6592 */ + "\x00\x64\0\0" /* offset 6596 */ + "\x00\x31\x20\x44\x00\x33\0\0" /* offset 6600 */ + "\x00\x32\x20\x44\x00\x33\0\0" /* offset 6608 */ + "\x00\x31\x20\x44\x00\x35\0\0" /* offset 6616 */ + "\x00\x32\x20\x44\x00\x35\0\0" /* offset 6624 */ + "\x00\x33\x20\x44\x00\x35\0\0" /* offset 6632 */ + "\x00\x34\x20\x44\x00\x35\0\0" /* offset 6640 */ + "\x00\x31\x20\x44\x00\x36\0\0" /* offset 6648 */ + "\x00\x35\x20\x44\x00\x36\0\0" /* offset 6656 */ + "\x00\x31\x20\x44\x00\x38\0\0" /* offset 6664 */ + "\x00\x33\x20\x44\x00\x38\0\0" /* offset 6672 */ + "\x00\x35\x20\x44\x00\x38\0\0" /* offset 6680 */ + "\x00\x37\x20\x44\x00\x38\0\0" /* offset 6688 */ + "\x00\x31\x20\x44\0\0" /* offset 6696 */ + "\x00\x49\x00\x49\0\0" /* offset 6702 */ + "\x00\x49\x00\x49\x00\x49\0\0" /* offset 6708 */ + "\x00\x49\x00\x56\0\0" /* offset 6716 */ + "\x00\x56\0\0" /* offset 6722 */ + "\x00\x56\x00\x49\0\0" /* offset 6726 */ + "\x00\x56\x00\x49\x00\x49\0\0" /* offset 6732 */ + "\x00\x56\x00\x49\x00\x49\x00\x49\0\0" /* offset 6740 */ + "\x00\x49\x00\x58\0\0" /* offset 6750 */ + "\x00\x58\0\0" /* offset 6756 */ + "\x00\x58\x00\x49\0\0" /* offset 6760 */ + "\x00\x58\x00\x49\x00\x49\0\0" /* offset 6766 */ + "\x00\x69\x00\x69\0\0" /* offset 6774 */ + "\x00\x69\x00\x69\x00\x69\0\0" /* offset 6780 */ + "\x00\x69\x00\x76\0\0" /* offset 6788 */ + "\x00\x76\0\0" /* offset 6794 */ + "\x00\x76\x00\x69\0\0" /* offset 6798 */ + "\x00\x76\x00\x69\x00\x69\0\0" /* offset 6804 */ + "\x00\x76\x00\x69\x00\x69\x00\x69\0\0" /* offset 6812 */ + "\x00\x69\x00\x78\0\0" /* offset 6822 */ + "\x00\x78\x00\x69\0\0" /* offset 6828 */ + "\x00\x78\x00\x69\x00\x69\0\0" /* offset 6834 */ + "\x00\x63\0\0" /* offset 6842 */ + "\x00\x6d\0\0" /* offset 6846 */ + "\x21\x90\x03\x38\0\0" /* offset 6850 */ + "\x21\x92\x03\x38\0\0" /* offset 6856 */ + "\x21\x94\x03\x38\0\0" /* offset 6862 */ + "\x21\xd0\x03\x38\0\0" /* offset 6868 */ + "\x21\xd4\x03\x38\0\0" /* offset 6874 */ + "\x21\xd2\x03\x38\0\0" /* offset 6880 */ + "\x22\x03\x03\x38\0\0" /* offset 6886 */ + "\x22\x08\x03\x38\0\0" /* offset 6892 */ + "\x22\x0b\x03\x38\0\0" /* offset 6898 */ + "\x22\x23\x03\x38\0\0" /* offset 6904 */ + "\x22\x25\x03\x38\0\0" /* offset 6910 */ + "\x22\x2b\x22\x2b\0\0" /* offset 6916 */ + "\x22\x2b\x22\x2b\x22\x2b\0\0" /* offset 6922 */ + "\x22\x2e\x22\x2e\0\0" /* offset 6930 */ + "\x22\x2e\x22\x2e\x22\x2e\0\0" /* offset 6936 */ + "\x22\x3c\x03\x38\0\0" /* offset 6944 */ + "\x22\x43\x03\x38\0\0" /* offset 6950 */ + "\x22\x45\x03\x38\0\0" /* offset 6956 */ + "\x22\x48\x03\x38\0\0" /* offset 6962 */ + "\x00\x3d\x03\x38\0\0" /* offset 6968 */ + "\x22\x61\x03\x38\0\0" /* offset 6974 */ + "\x22\x4d\x03\x38\0\0" /* offset 6980 */ + "\x00\x3c\x03\x38\0\0" /* offset 6986 */ + "\x00\x3e\x03\x38\0\0" /* offset 6992 */ + "\x22\x64\x03\x38\0\0" /* offset 6998 */ + "\x22\x65\x03\x38\0\0" /* offset 7004 */ + "\x22\x72\x03\x38\0\0" /* offset 7010 */ + "\x22\x73\x03\x38\0\0" /* offset 7016 */ + "\x22\x76\x03\x38\0\0" /* offset 7022 */ + "\x22\x77\x03\x38\0\0" /* offset 7028 */ + "\x22\x7a\x03\x38\0\0" /* offset 7034 */ + "\x22\x7b\x03\x38\0\0" /* offset 7040 */ + "\x22\x82\x03\x38\0\0" /* offset 7046 */ + "\x22\x83\x03\x38\0\0" /* offset 7052 */ + "\x22\x86\x03\x38\0\0" /* offset 7058 */ + "\x22\x87\x03\x38\0\0" /* offset 7064 */ + "\x22\xa2\x03\x38\0\0" /* offset 7070 */ + "\x22\xa8\x03\x38\0\0" /* offset 7076 */ + "\x22\xa9\x03\x38\0\0" /* offset 7082 */ + "\x22\xab\x03\x38\0\0" /* offset 7088 */ + "\x22\x7c\x03\x38\0\0" /* offset 7094 */ + "\x22\x7d\x03\x38\0\0" /* offset 7100 */ + "\x22\x91\x03\x38\0\0" /* offset 7106 */ + "\x22\x92\x03\x38\0\0" /* offset 7112 */ + "\x22\xb2\x03\x38\0\0" /* offset 7118 */ + "\x22\xb3\x03\x38\0\0" /* offset 7124 */ + "\x22\xb4\x03\x38\0\0" /* offset 7130 */ + "\x22\xb5\x03\x38\0\0" /* offset 7136 */ + "\x30\x08\0\0" /* offset 7142 */ + "\x30\x09\0\0" /* offset 7146 */ + "\x00\x31\x00\x30\0\0" /* offset 7150 */ + "\x00\x31\x00\x31\0\0" /* offset 7156 */ + "\x00\x31\x00\x32\0\0" /* offset 7162 */ + "\x00\x31\x00\x33\0\0" /* offset 7168 */ + "\x00\x31\x00\x34\0\0" /* offset 7174 */ + "\x00\x31\x00\x35\0\0" /* offset 7180 */ + "\x00\x31\x00\x36\0\0" /* offset 7186 */ + "\x00\x31\x00\x37\0\0" /* offset 7192 */ + "\x00\x31\x00\x38\0\0" /* offset 7198 */ + "\x00\x31\x00\x39\0\0" /* offset 7204 */ + "\x00\x32\x00\x30\0\0" /* offset 7210 */ + "\x00\x28\x00\x31\x00\x29\0\0" /* offset 7216 */ + "\x00\x28\x00\x32\x00\x29\0\0" /* offset 7224 */ + "\x00\x28\x00\x33\x00\x29\0\0" /* offset 7232 */ + "\x00\x28\x00\x34\x00\x29\0\0" /* offset 7240 */ + "\x00\x28\x00\x35\x00\x29\0\0" /* offset 7248 */ + "\x00\x28\x00\x36\x00\x29\0\0" /* offset 7256 */ + "\x00\x28\x00\x37\x00\x29\0\0" /* offset 7264 */ + "\x00\x28\x00\x38\x00\x29\0\0" /* offset 7272 */ + "\x00\x28\x00\x39\x00\x29\0\0" /* offset 7280 */ + "\x00\x28\x00\x31\x00\x30\x00\x29\0\0" /* offset 7288 */ + "\x00\x28\x00\x31\x00\x31\x00\x29\0\0" /* offset 7298 */ + "\x00\x28\x00\x31\x00\x32\x00\x29\0\0" /* offset 7308 */ + "\x00\x28\x00\x31\x00\x33\x00\x29\0\0" /* offset 7318 */ + "\x00\x28\x00\x31\x00\x34\x00\x29\0\0" /* offset 7328 */ + "\x00\x28\x00\x31\x00\x35\x00\x29\0\0" /* offset 7338 */ + "\x00\x28\x00\x31\x00\x36\x00\x29\0\0" /* offset 7348 */ + "\x00\x28\x00\x31\x00\x37\x00\x29\0\0" /* offset 7358 */ + "\x00\x28\x00\x31\x00\x38\x00\x29\0\0" /* offset 7368 */ + "\x00\x28\x00\x31\x00\x39\x00\x29\0\0" /* offset 7378 */ + "\x00\x28\x00\x32\x00\x30\x00\x29\0\0" /* offset 7388 */ + "\x00\x31\x00\x2e\0\0" /* offset 7398 */ + "\x00\x32\x00\x2e\0\0" /* offset 7404 */ + "\x00\x33\x00\x2e\0\0" /* offset 7410 */ + "\x00\x34\x00\x2e\0\0" /* offset 7416 */ + "\x00\x35\x00\x2e\0\0" /* offset 7422 */ + "\x00\x36\x00\x2e\0\0" /* offset 7428 */ + "\x00\x37\x00\x2e\0\0" /* offset 7434 */ + "\x00\x38\x00\x2e\0\0" /* offset 7440 */ + "\x00\x39\x00\x2e\0\0" /* offset 7446 */ + "\x00\x31\x00\x30\x00\x2e\0\0" /* offset 7452 */ + "\x00\x31\x00\x31\x00\x2e\0\0" /* offset 7460 */ + "\x00\x31\x00\x32\x00\x2e\0\0" /* offset 7468 */ + "\x00\x31\x00\x33\x00\x2e\0\0" /* offset 7476 */ + "\x00\x31\x00\x34\x00\x2e\0\0" /* offset 7484 */ + "\x00\x31\x00\x35\x00\x2e\0\0" /* offset 7492 */ + "\x00\x31\x00\x36\x00\x2e\0\0" /* offset 7500 */ + "\x00\x31\x00\x37\x00\x2e\0\0" /* offset 7508 */ + "\x00\x31\x00\x38\x00\x2e\0\0" /* offset 7516 */ + "\x00\x31\x00\x39\x00\x2e\0\0" /* offset 7524 */ + "\x00\x32\x00\x30\x00\x2e\0\0" /* offset 7532 */ + "\x00\x28\x00\x61\x00\x29\0\0" /* offset 7540 */ + "\x00\x28\x00\x62\x00\x29\0\0" /* offset 7548 */ + "\x00\x28\x00\x63\x00\x29\0\0" /* offset 7556 */ + "\x00\x28\x00\x64\x00\x29\0\0" /* offset 7564 */ + "\x00\x28\x00\x65\x00\x29\0\0" /* offset 7572 */ + "\x00\x28\x00\x66\x00\x29\0\0" /* offset 7580 */ + "\x00\x28\x00\x67\x00\x29\0\0" /* offset 7588 */ + "\x00\x28\x00\x68\x00\x29\0\0" /* offset 7596 */ + "\x00\x28\x00\x69\x00\x29\0\0" /* offset 7604 */ + "\x00\x28\x00\x6a\x00\x29\0\0" /* offset 7612 */ + "\x00\x28\x00\x6b\x00\x29\0\0" /* offset 7620 */ + "\x00\x28\x00\x6c\x00\x29\0\0" /* offset 7628 */ + "\x00\x28\x00\x6d\x00\x29\0\0" /* offset 7636 */ + "\x00\x28\x00\x6e\x00\x29\0\0" /* offset 7644 */ + "\x00\x28\x00\x6f\x00\x29\0\0" /* offset 7652 */ + "\x00\x28\x00\x70\x00\x29\0\0" /* offset 7660 */ + "\x00\x28\x00\x71\x00\x29\0\0" /* offset 7668 */ + "\x00\x28\x00\x72\x00\x29\0\0" /* offset 7676 */ + "\x00\x28\x00\x73\x00\x29\0\0" /* offset 7684 */ + "\x00\x28\x00\x74\x00\x29\0\0" /* offset 7692 */ + "\x00\x28\x00\x75\x00\x29\0\0" /* offset 7700 */ + "\x00\x28\x00\x76\x00\x29\0\0" /* offset 7708 */ + "\x00\x28\x00\x77\x00\x29\0\0" /* offset 7716 */ + "\x00\x28\x00\x78\x00\x29\0\0" /* offset 7724 */ + "\x00\x28\x00\x79\x00\x29\0\0" /* offset 7732 */ + "\x00\x28\x00\x7a\x00\x29\0\0" /* offset 7740 */ + "\x00\x41\0\0" /* offset 7748 */ + "\x00\x47\0\0" /* offset 7752 */ + "\x00\x4a\0\0" /* offset 7756 */ + "\x00\x4f\0\0" /* offset 7760 */ + "\x00\x53\0\0" /* offset 7764 */ + "\x00\x54\0\0" /* offset 7768 */ + "\x00\x55\0\0" /* offset 7772 */ + "\x00\x57\0\0" /* offset 7776 */ + "\x00\x59\0\0" /* offset 7780 */ + "\x00\x62\0\0" /* offset 7784 */ + "\x00\x66\0\0" /* offset 7788 */ + "\x00\x6b\0\0" /* offset 7792 */ + "\x00\x70\0\0" /* offset 7796 */ + "\x00\x71\0\0" /* offset 7800 */ + "\x00\x74\0\0" /* offset 7804 */ + "\x00\x75\0\0" /* offset 7808 */ + "\x00\x7a\0\0" /* offset 7812 */ + "\x22\x2b\x22\x2b\x22\x2b\x22\x2b\0\0" /* offset 7816 */ + "\x00\x3a\x00\x3a\x00\x3d\0\0" /* offset 7826 */ + "\x00\x3d\x00\x3d\0\0" /* offset 7834 */ + "\x00\x3d\x00\x3d\x00\x3d\0\0" /* offset 7840 */ + "\x2a\xdd\x03\x38\0\0" /* offset 7848 */ + "\x6b\xcd\0\0" /* offset 7854 */ + "\x9f\x9f\0\0" /* offset 7858 */ + "\x4e\x00\0\0" /* offset 7862 */ + "\x4e\x28\0\0" /* offset 7866 */ + "\x4e\x36\0\0" /* offset 7870 */ + "\x4e\x3f\0\0" /* offset 7874 */ + "\x4e\x59\0\0" /* offset 7878 */ + "\x4e\x85\0\0" /* offset 7882 */ + "\x4e\x8c\0\0" /* offset 7886 */ + "\x4e\xa0\0\0" /* offset 7890 */ + "\x4e\xba\0\0" /* offset 7894 */ + "\x51\x3f\0\0" /* offset 7898 */ + "\x51\x65\0\0" /* offset 7902 */ + "\x51\x6b\0\0" /* offset 7906 */ + "\x51\x82\0\0" /* offset 7910 */ + "\x51\x96\0\0" /* offset 7914 */ + "\x51\xab\0\0" /* offset 7918 */ + "\x51\xe0\0\0" /* offset 7922 */ + "\x51\xf5\0\0" /* offset 7926 */ + "\x52\x00\0\0" /* offset 7930 */ + "\x52\x9b\0\0" /* offset 7934 */ + "\x52\xf9\0\0" /* offset 7938 */ + "\x53\x15\0\0" /* offset 7942 */ + "\x53\x1a\0\0" /* offset 7946 */ + "\x53\x38\0\0" /* offset 7950 */ + "\x53\x41\0\0" /* offset 7954 */ + "\x53\x5c\0\0" /* offset 7958 */ + "\x53\x69\0\0" /* offset 7962 */ + "\x53\x82\0\0" /* offset 7966 */ + "\x53\xb6\0\0" /* offset 7970 */ + "\x53\xc8\0\0" /* offset 7974 */ + "\x53\xe3\0\0" /* offset 7978 */ + "\x56\xd7\0\0" /* offset 7982 */ + "\x57\x1f\0\0" /* offset 7986 */ + "\x58\xeb\0\0" /* offset 7990 */ + "\x59\x02\0\0" /* offset 7994 */ + "\x59\x0a\0\0" /* offset 7998 */ + "\x59\x15\0\0" /* offset 8002 */ + "\x59\x27\0\0" /* offset 8006 */ + "\x59\x73\0\0" /* offset 8010 */ + "\x5b\x50\0\0" /* offset 8014 */ + "\x5b\x80\0\0" /* offset 8018 */ + "\x5b\xf8\0\0" /* offset 8022 */ + "\x5c\x0f\0\0" /* offset 8026 */ + "\x5c\x22\0\0" /* offset 8030 */ + "\x5c\x38\0\0" /* offset 8034 */ + "\x5c\x6e\0\0" /* offset 8038 */ + "\x5c\x71\0\0" /* offset 8042 */ + "\x5d\xdb\0\0" /* offset 8046 */ + "\x5d\xe5\0\0" /* offset 8050 */ + "\x5d\xf1\0\0" /* offset 8054 */ + "\x5d\xfe\0\0" /* offset 8058 */ + "\x5e\x72\0\0" /* offset 8062 */ + "\x5e\x7a\0\0" /* offset 8066 */ + "\x5e\x7f\0\0" /* offset 8070 */ + "\x5e\xf4\0\0" /* offset 8074 */ + "\x5e\xfe\0\0" /* offset 8078 */ + "\x5f\x0b\0\0" /* offset 8082 */ + "\x5f\x13\0\0" /* offset 8086 */ + "\x5f\x50\0\0" /* offset 8090 */ + "\x5f\x61\0\0" /* offset 8094 */ + "\x5f\x73\0\0" /* offset 8098 */ + "\x5f\xc3\0\0" /* offset 8102 */ + "\x62\x08\0\0" /* offset 8106 */ + "\x62\x36\0\0" /* offset 8110 */ + "\x62\x4b\0\0" /* offset 8114 */ + "\x65\x2f\0\0" /* offset 8118 */ + "\x65\x34\0\0" /* offset 8122 */ + "\x65\x87\0\0" /* offset 8126 */ + "\x65\x97\0\0" /* offset 8130 */ + "\x65\xa4\0\0" /* offset 8134 */ + "\x65\xb9\0\0" /* offset 8138 */ + "\x65\xe0\0\0" /* offset 8142 */ + "\x65\xe5\0\0" /* offset 8146 */ + "\x66\xf0\0\0" /* offset 8150 */ + "\x67\x08\0\0" /* offset 8154 */ + "\x67\x28\0\0" /* offset 8158 */ + "\x6b\x20\0\0" /* offset 8162 */ + "\x6b\x62\0\0" /* offset 8166 */ + "\x6b\x79\0\0" /* offset 8170 */ + "\x6b\xb3\0\0" /* offset 8174 */ + "\x6b\xcb\0\0" /* offset 8178 */ + "\x6b\xd4\0\0" /* offset 8182 */ + "\x6b\xdb\0\0" /* offset 8186 */ + "\x6c\x0f\0\0" /* offset 8190 */ + "\x6c\x14\0\0" /* offset 8194 */ + "\x6c\x34\0\0" /* offset 8198 */ + "\x70\x6b\0\0" /* offset 8202 */ + "\x72\x2a\0\0" /* offset 8206 */ + "\x72\x36\0\0" /* offset 8210 */ + "\x72\x3b\0\0" /* offset 8214 */ + "\x72\x3f\0\0" /* offset 8218 */ + "\x72\x47\0\0" /* offset 8222 */ + "\x72\x59\0\0" /* offset 8226 */ + "\x72\x5b\0\0" /* offset 8230 */ + "\x72\xac\0\0" /* offset 8234 */ + "\x73\x84\0\0" /* offset 8238 */ + "\x73\x89\0\0" /* offset 8242 */ + "\x74\xdc\0\0" /* offset 8246 */ + "\x74\xe6\0\0" /* offset 8250 */ + "\x75\x18\0\0" /* offset 8254 */ + "\x75\x1f\0\0" /* offset 8258 */ + "\x75\x28\0\0" /* offset 8262 */ + "\x75\x30\0\0" /* offset 8266 */ + "\x75\x8b\0\0" /* offset 8270 */ + "\x75\x92\0\0" /* offset 8274 */ + "\x76\x76\0\0" /* offset 8278 */ + "\x76\x7d\0\0" /* offset 8282 */ + "\x76\xae\0\0" /* offset 8286 */ + "\x76\xbf\0\0" /* offset 8290 */ + "\x76\xee\0\0" /* offset 8294 */ + "\x77\xdb\0\0" /* offset 8298 */ + "\x77\xe2\0\0" /* offset 8302 */ + "\x77\xf3\0\0" /* offset 8306 */ + "\x79\x3a\0\0" /* offset 8310 */ + "\x79\xb8\0\0" /* offset 8314 */ + "\x79\xbe\0\0" /* offset 8318 */ + "\x7a\x74\0\0" /* offset 8322 */ + "\x7a\xcb\0\0" /* offset 8326 */ + "\x7a\xf9\0\0" /* offset 8330 */ + "\x7c\x73\0\0" /* offset 8334 */ + "\x7c\xf8\0\0" /* offset 8338 */ + "\x7f\x36\0\0" /* offset 8342 */ + "\x7f\x51\0\0" /* offset 8346 */ + "\x7f\x8a\0\0" /* offset 8350 */ + "\x7f\xbd\0\0" /* offset 8354 */ + "\x80\x01\0\0" /* offset 8358 */ + "\x80\x0c\0\0" /* offset 8362 */ + "\x80\x12\0\0" /* offset 8366 */ + "\x80\x33\0\0" /* offset 8370 */ + "\x80\x7f\0\0" /* offset 8374 */ + "\x80\x89\0\0" /* offset 8378 */ + "\x81\xe3\0\0" /* offset 8382 */ + "\x81\xea\0\0" /* offset 8386 */ + "\x81\xf3\0\0" /* offset 8390 */ + "\x81\xfc\0\0" /* offset 8394 */ + "\x82\x0c\0\0" /* offset 8398 */ + "\x82\x1b\0\0" /* offset 8402 */ + "\x82\x1f\0\0" /* offset 8406 */ + "\x82\x6e\0\0" /* offset 8410 */ + "\x82\x72\0\0" /* offset 8414 */ + "\x82\x78\0\0" /* offset 8418 */ + "\x86\x4d\0\0" /* offset 8422 */ + "\x86\x6b\0\0" /* offset 8426 */ + "\x88\x40\0\0" /* offset 8430 */ + "\x88\x4c\0\0" /* offset 8434 */ + "\x88\x63\0\0" /* offset 8438 */ + "\x89\x7e\0\0" /* offset 8442 */ + "\x89\x8b\0\0" /* offset 8446 */ + "\x89\xd2\0\0" /* offset 8450 */ + "\x8a\x00\0\0" /* offset 8454 */ + "\x8c\x37\0\0" /* offset 8458 */ + "\x8c\x46\0\0" /* offset 8462 */ + "\x8c\x55\0\0" /* offset 8466 */ + "\x8c\x78\0\0" /* offset 8470 */ + "\x8c\x9d\0\0" /* offset 8474 */ + "\x8d\x64\0\0" /* offset 8478 */ + "\x8d\x70\0\0" /* offset 8482 */ + "\x8d\xb3\0\0" /* offset 8486 */ + "\x8e\xab\0\0" /* offset 8490 */ + "\x8e\xca\0\0" /* offset 8494 */ + "\x8f\x9b\0\0" /* offset 8498 */ + "\x8f\xb0\0\0" /* offset 8502 */ + "\x8f\xb5\0\0" /* offset 8506 */ + "\x90\x91\0\0" /* offset 8510 */ + "\x91\x49\0\0" /* offset 8514 */ + "\x91\xc6\0\0" /* offset 8518 */ + "\x91\xcc\0\0" /* offset 8522 */ + "\x91\xd1\0\0" /* offset 8526 */ + "\x95\x77\0\0" /* offset 8530 */ + "\x95\x80\0\0" /* offset 8534 */ + "\x96\x1c\0\0" /* offset 8538 */ + "\x96\xb6\0\0" /* offset 8542 */ + "\x96\xb9\0\0" /* offset 8546 */ + "\x96\xe8\0\0" /* offset 8550 */ + "\x97\x51\0\0" /* offset 8554 */ + "\x97\x5e\0\0" /* offset 8558 */ + "\x97\x62\0\0" /* offset 8562 */ + "\x97\x69\0\0" /* offset 8566 */ + "\x97\xcb\0\0" /* offset 8570 */ + "\x97\xed\0\0" /* offset 8574 */ + "\x97\xf3\0\0" /* offset 8578 */ + "\x98\x01\0\0" /* offset 8582 */ + "\x98\xa8\0\0" /* offset 8586 */ + "\x98\xdb\0\0" /* offset 8590 */ + "\x98\xdf\0\0" /* offset 8594 */ + "\x99\x96\0\0" /* offset 8598 */ + "\x99\x99\0\0" /* offset 8602 */ + "\x99\xac\0\0" /* offset 8606 */ + "\x9a\xa8\0\0" /* offset 8610 */ + "\x9a\xd8\0\0" /* offset 8614 */ + "\x9a\xdf\0\0" /* offset 8618 */ + "\x9b\x25\0\0" /* offset 8622 */ + "\x9b\x2f\0\0" /* offset 8626 */ + "\x9b\x32\0\0" /* offset 8630 */ + "\x9b\x3c\0\0" /* offset 8634 */ + "\x9b\x5a\0\0" /* offset 8638 */ + "\x9c\xe5\0\0" /* offset 8642 */ + "\x9e\x75\0\0" /* offset 8646 */ + "\x9e\x7f\0\0" /* offset 8650 */ + "\x9e\xa5\0\0" /* offset 8654 */ + "\x9e\xbb\0\0" /* offset 8658 */ + "\x9e\xc3\0\0" /* offset 8662 */ + "\x9e\xcd\0\0" /* offset 8666 */ + "\x9e\xd1\0\0" /* offset 8670 */ + "\x9e\xf9\0\0" /* offset 8674 */ + "\x9e\xfd\0\0" /* offset 8678 */ + "\x9f\x0e\0\0" /* offset 8682 */ + "\x9f\x13\0\0" /* offset 8686 */ + "\x9f\x20\0\0" /* offset 8690 */ + "\x9f\x3b\0\0" /* offset 8694 */ + "\x9f\x4a\0\0" /* offset 8698 */ + "\x9f\x52\0\0" /* offset 8702 */ + "\x9f\x8d\0\0" /* offset 8706 */ + "\x9f\x9c\0\0" /* offset 8710 */ + "\x9f\xa0\0\0" /* offset 8714 */ + "\x30\x12\0\0" /* offset 8718 */ + "\x53\x44\0\0" /* offset 8722 */ + "\x53\x45\0\0" /* offset 8726 */ + "\x30\x4b\x30\x99\0\0" /* offset 8730 */ + "\x30\x4d\x30\x99\0\0" /* offset 8736 */ + "\x30\x4f\x30\x99\0\0" /* offset 8742 */ + "\x30\x51\x30\x99\0\0" /* offset 8748 */ + "\x30\x53\x30\x99\0\0" /* offset 8754 */ + "\x30\x55\x30\x99\0\0" /* offset 8760 */ + "\x30\x57\x30\x99\0\0" /* offset 8766 */ + "\x30\x59\x30\x99\0\0" /* offset 8772 */ + "\x30\x5b\x30\x99\0\0" /* offset 8778 */ + "\x30\x5d\x30\x99\0\0" /* offset 8784 */ + "\x30\x5f\x30\x99\0\0" /* offset 8790 */ + "\x30\x61\x30\x99\0\0" /* offset 8796 */ + "\x30\x64\x30\x99\0\0" /* offset 8802 */ + "\x30\x66\x30\x99\0\0" /* offset 8808 */ + "\x30\x68\x30\x99\0\0" /* offset 8814 */ + "\x30\x6f\x30\x99\0\0" /* offset 8820 */ + "\x30\x6f\x30\x9a\0\0" /* offset 8826 */ + "\x30\x72\x30\x99\0\0" /* offset 8832 */ + "\x30\x72\x30\x9a\0\0" /* offset 8838 */ + "\x30\x75\x30\x99\0\0" /* offset 8844 */ + "\x30\x75\x30\x9a\0\0" /* offset 8850 */ + "\x30\x78\x30\x99\0\0" /* offset 8856 */ + "\x30\x78\x30\x9a\0\0" /* offset 8862 */ + "\x30\x7b\x30\x99\0\0" /* offset 8868 */ + "\x30\x7b\x30\x9a\0\0" /* offset 8874 */ + "\x30\x46\x30\x99\0\0" /* offset 8880 */ + "\x00\x20\x30\x99\0\0" /* offset 8886 */ + "\x00\x20\x30\x9a\0\0" /* offset 8892 */ + "\x30\x9d\x30\x99\0\0" /* offset 8898 */ + "\x30\x88\x30\x8a\0\0" /* offset 8904 */ + "\x30\xab\x30\x99\0\0" /* offset 8910 */ + "\x30\xad\x30\x99\0\0" /* offset 8916 */ + "\x30\xaf\x30\x99\0\0" /* offset 8922 */ + "\x30\xb1\x30\x99\0\0" /* offset 8928 */ + "\x30\xb3\x30\x99\0\0" /* offset 8934 */ + "\x30\xb5\x30\x99\0\0" /* offset 8940 */ + "\x30\xb7\x30\x99\0\0" /* offset 8946 */ + "\x30\xb9\x30\x99\0\0" /* offset 8952 */ + "\x30\xbb\x30\x99\0\0" /* offset 8958 */ + "\x30\xbd\x30\x99\0\0" /* offset 8964 */ + "\x30\xbf\x30\x99\0\0" /* offset 8970 */ + "\x30\xc1\x30\x99\0\0" /* offset 8976 */ + "\x30\xc4\x30\x99\0\0" /* offset 8982 */ + "\x30\xc6\x30\x99\0\0" /* offset 8988 */ + "\x30\xc8\x30\x99\0\0" /* offset 8994 */ + "\x30\xcf\x30\x99\0\0" /* offset 9000 */ + "\x30\xcf\x30\x9a\0\0" /* offset 9006 */ + "\x30\xd2\x30\x99\0\0" /* offset 9012 */ + "\x30\xd2\x30\x9a\0\0" /* offset 9018 */ + "\x30\xd5\x30\x99\0\0" /* offset 9024 */ + "\x30\xd5\x30\x9a\0\0" /* offset 9030 */ + "\x30\xd8\x30\x99\0\0" /* offset 9036 */ + "\x30\xd8\x30\x9a\0\0" /* offset 9042 */ + "\x30\xdb\x30\x99\0\0" /* offset 9048 */ + "\x30\xdb\x30\x9a\0\0" /* offset 9054 */ + "\x30\xa6\x30\x99\0\0" /* offset 9060 */ + "\x30\xef\x30\x99\0\0" /* offset 9066 */ + "\x30\xf0\x30\x99\0\0" /* offset 9072 */ + "\x30\xf1\x30\x99\0\0" /* offset 9078 */ + "\x30\xf2\x30\x99\0\0" /* offset 9084 */ + "\x30\xfd\x30\x99\0\0" /* offset 9090 */ + "\x30\xb3\x30\xc8\0\0" /* offset 9096 */ + "\x11\x00\0\0" /* offset 9102 */ + "\x11\x01\0\0" /* offset 9106 */ + "\x11\xaa\0\0" /* offset 9110 */ + "\x11\x02\0\0" /* offset 9114 */ + "\x11\xac\0\0" /* offset 9118 */ + "\x11\xad\0\0" /* offset 9122 */ + "\x11\x03\0\0" /* offset 9126 */ + "\x11\x04\0\0" /* offset 9130 */ + "\x11\x05\0\0" /* offset 9134 */ + "\x11\xb0\0\0" /* offset 9138 */ + "\x11\xb1\0\0" /* offset 9142 */ + "\x11\xb2\0\0" /* offset 9146 */ + "\x11\xb3\0\0" /* offset 9150 */ + "\x11\xb4\0\0" /* offset 9154 */ + "\x11\xb5\0\0" /* offset 9158 */ + "\x11\x1a\0\0" /* offset 9162 */ + "\x11\x06\0\0" /* offset 9166 */ + "\x11\x07\0\0" /* offset 9170 */ + "\x11\x08\0\0" /* offset 9174 */ + "\x11\x21\0\0" /* offset 9178 */ + "\x11\x09\0\0" /* offset 9182 */ + "\x11\x0a\0\0" /* offset 9186 */ + "\x11\x0b\0\0" /* offset 9190 */ + "\x11\x0c\0\0" /* offset 9194 */ + "\x11\x0d\0\0" /* offset 9198 */ + "\x11\x0e\0\0" /* offset 9202 */ + "\x11\x0f\0\0" /* offset 9206 */ + "\x11\x10\0\0" /* offset 9210 */ + "\x11\x11\0\0" /* offset 9214 */ + "\x11\x12\0\0" /* offset 9218 */ + "\x11\x61\0\0" /* offset 9222 */ + "\x11\x62\0\0" /* offset 9226 */ + "\x11\x63\0\0" /* offset 9230 */ + "\x11\x64\0\0" /* offset 9234 */ + "\x11\x65\0\0" /* offset 9238 */ + "\x11\x66\0\0" /* offset 9242 */ + "\x11\x67\0\0" /* offset 9246 */ + "\x11\x68\0\0" /* offset 9250 */ + "\x11\x69\0\0" /* offset 9254 */ + "\x11\x6a\0\0" /* offset 9258 */ + "\x11\x6b\0\0" /* offset 9262 */ + "\x11\x6c\0\0" /* offset 9266 */ + "\x11\x6d\0\0" /* offset 9270 */ + "\x11\x6e\0\0" /* offset 9274 */ + "\x11\x6f\0\0" /* offset 9278 */ + "\x11\x70\0\0" /* offset 9282 */ + "\x11\x71\0\0" /* offset 9286 */ + "\x11\x72\0\0" /* offset 9290 */ + "\x11\x73\0\0" /* offset 9294 */ + "\x11\x74\0\0" /* offset 9298 */ + "\x11\x75\0\0" /* offset 9302 */ + "\x11\x60\0\0" /* offset 9306 */ + "\x11\x14\0\0" /* offset 9310 */ + "\x11\x15\0\0" /* offset 9314 */ + "\x11\xc7\0\0" /* offset 9318 */ + "\x11\xc8\0\0" /* offset 9322 */ + "\x11\xcc\0\0" /* offset 9326 */ + "\x11\xce\0\0" /* offset 9330 */ + "\x11\xd3\0\0" /* offset 9334 */ + "\x11\xd7\0\0" /* offset 9338 */ + "\x11\xd9\0\0" /* offset 9342 */ + "\x11\x1c\0\0" /* offset 9346 */ + "\x11\xdd\0\0" /* offset 9350 */ + "\x11\xdf\0\0" /* offset 9354 */ + "\x11\x1d\0\0" /* offset 9358 */ + "\x11\x1e\0\0" /* offset 9362 */ + "\x11\x20\0\0" /* offset 9366 */ + "\x11\x22\0\0" /* offset 9370 */ + "\x11\x23\0\0" /* offset 9374 */ + "\x11\x27\0\0" /* offset 9378 */ + "\x11\x29\0\0" /* offset 9382 */ + "\x11\x2b\0\0" /* offset 9386 */ + "\x11\x2c\0\0" /* offset 9390 */ + "\x11\x2d\0\0" /* offset 9394 */ + "\x11\x2e\0\0" /* offset 9398 */ + "\x11\x2f\0\0" /* offset 9402 */ + "\x11\x32\0\0" /* offset 9406 */ + "\x11\x36\0\0" /* offset 9410 */ + "\x11\x40\0\0" /* offset 9414 */ + "\x11\x47\0\0" /* offset 9418 */ + "\x11\x4c\0\0" /* offset 9422 */ + "\x11\xf1\0\0" /* offset 9426 */ + "\x11\xf2\0\0" /* offset 9430 */ + "\x11\x57\0\0" /* offset 9434 */ + "\x11\x58\0\0" /* offset 9438 */ + "\x11\x59\0\0" /* offset 9442 */ + "\x11\x84\0\0" /* offset 9446 */ + "\x11\x85\0\0" /* offset 9450 */ + "\x11\x88\0\0" /* offset 9454 */ + "\x11\x91\0\0" /* offset 9458 */ + "\x11\x92\0\0" /* offset 9462 */ + "\x11\x94\0\0" /* offset 9466 */ + "\x11\x9e\0\0" /* offset 9470 */ + "\x11\xa1\0\0" /* offset 9474 */ + "\x4e\x09\0\0" /* offset 9478 */ + "\x56\xdb\0\0" /* offset 9482 */ + "\x4e\x0a\0\0" /* offset 9486 */ + "\x4e\x2d\0\0" /* offset 9490 */ + "\x4e\x0b\0\0" /* offset 9494 */ + "\x75\x32\0\0" /* offset 9498 */ + "\x4e\x19\0\0" /* offset 9502 */ + "\x4e\x01\0\0" /* offset 9506 */ + "\x59\x29\0\0" /* offset 9510 */ + "\x57\x30\0\0" /* offset 9514 */ + "\x00\x28\x11\x00\x00\x29\0\0" /* offset 9518 */ + "\x00\x28\x11\x02\x00\x29\0\0" /* offset 9526 */ + "\x00\x28\x11\x03\x00\x29\0\0" /* offset 9534 */ + "\x00\x28\x11\x05\x00\x29\0\0" /* offset 9542 */ + "\x00\x28\x11\x06\x00\x29\0\0" /* offset 9550 */ + "\x00\x28\x11\x07\x00\x29\0\0" /* offset 9558 */ + "\x00\x28\x11\x09\x00\x29\0\0" /* offset 9566 */ + "\x00\x28\x11\x0b\x00\x29\0\0" /* offset 9574 */ + "\x00\x28\x11\x0c\x00\x29\0\0" /* offset 9582 */ + "\x00\x28\x11\x0e\x00\x29\0\0" /* offset 9590 */ + "\x00\x28\x11\x0f\x00\x29\0\0" /* offset 9598 */ + "\x00\x28\x11\x10\x00\x29\0\0" /* offset 9606 */ + "\x00\x28\x11\x11\x00\x29\0\0" /* offset 9614 */ + "\x00\x28\x11\x12\x00\x29\0\0" /* offset 9622 */ + "\x00\x28\x11\x00\x11\x61\x00\x29\0\0" /* offset 9630 */ + "\x00\x28\x11\x02\x11\x61\x00\x29\0\0" /* offset 9640 */ + "\x00\x28\x11\x03\x11\x61\x00\x29\0\0" /* offset 9650 */ + "\x00\x28\x11\x05\x11\x61\x00\x29\0\0" /* offset 9660 */ + "\x00\x28\x11\x06\x11\x61\x00\x29\0\0" /* offset 9670 */ + "\x00\x28\x11\x07\x11\x61\x00\x29\0\0" /* offset 9680 */ + "\x00\x28\x11\x09\x11\x61\x00\x29\0\0" /* offset 9690 */ + "\x00\x28\x11\x0b\x11\x61\x00\x29\0\0" /* offset 9700 */ + "\x00\x28\x11\x0c\x11\x61\x00\x29\0\0" /* offset 9710 */ + "\x00\x28\x11\x0e\x11\x61\x00\x29\0\0" /* offset 9720 */ + "\x00\x28\x11\x0f\x11\x61\x00\x29\0\0" /* offset 9730 */ + "\x00\x28\x11\x10\x11\x61\x00\x29\0\0" /* offset 9740 */ + "\x00\x28\x11\x11\x11\x61\x00\x29\0\0" /* offset 9750 */ + "\x00\x28\x11\x12\x11\x61\x00\x29\0\0" /* offset 9760 */ + "\x00\x28\x11\x0c\x11\x6e\x00\x29\0\0" /* offset 9770 */ + "\x00\x28\x4e\x00\x00\x29\0\0" /* offset 9780 */ + "\x00\x28\x4e\x8c\x00\x29\0\0" /* offset 9788 */ + "\x00\x28\x4e\x09\x00\x29\0\0" /* offset 9796 */ + "\x00\x28\x56\xdb\x00\x29\0\0" /* offset 9804 */ + "\x00\x28\x4e\x94\x00\x29\0\0" /* offset 9812 */ + "\x00\x28\x51\x6d\x00\x29\0\0" /* offset 9820 */ + "\x00\x28\x4e\x03\x00\x29\0\0" /* offset 9828 */ + "\x00\x28\x51\x6b\x00\x29\0\0" /* offset 9836 */ + "\x00\x28\x4e\x5d\x00\x29\0\0" /* offset 9844 */ + "\x00\x28\x53\x41\x00\x29\0\0" /* offset 9852 */ + "\x00\x28\x67\x08\x00\x29\0\0" /* offset 9860 */ + "\x00\x28\x70\x6b\x00\x29\0\0" /* offset 9868 */ + "\x00\x28\x6c\x34\x00\x29\0\0" /* offset 9876 */ + "\x00\x28\x67\x28\x00\x29\0\0" /* offset 9884 */ + "\x00\x28\x91\xd1\x00\x29\0\0" /* offset 9892 */ + "\x00\x28\x57\x1f\x00\x29\0\0" /* offset 9900 */ + "\x00\x28\x65\xe5\x00\x29\0\0" /* offset 9908 */ + "\x00\x28\x68\x2a\x00\x29\0\0" /* offset 9916 */ + "\x00\x28\x67\x09\x00\x29\0\0" /* offset 9924 */ + "\x00\x28\x79\x3e\x00\x29\0\0" /* offset 9932 */ + "\x00\x28\x54\x0d\x00\x29\0\0" /* offset 9940 */ + "\x00\x28\x72\x79\x00\x29\0\0" /* offset 9948 */ + "\x00\x28\x8c\xa1\x00\x29\0\0" /* offset 9956 */ + "\x00\x28\x79\x5d\x00\x29\0\0" /* offset 9964 */ + "\x00\x28\x52\xb4\x00\x29\0\0" /* offset 9972 */ + "\x00\x28\x4e\xe3\x00\x29\0\0" /* offset 9980 */ + "\x00\x28\x54\x7c\x00\x29\0\0" /* offset 9988 */ + "\x00\x28\x5b\x66\x00\x29\0\0" /* offset 9996 */ + "\x00\x28\x76\xe3\x00\x29\0\0" /* offset 10004 */ + "\x00\x28\x4f\x01\x00\x29\0\0" /* offset 10012 */ + "\x00\x28\x8c\xc7\x00\x29\0\0" /* offset 10020 */ + "\x00\x28\x53\x54\x00\x29\0\0" /* offset 10028 */ + "\x00\x28\x79\x6d\x00\x29\0\0" /* offset 10036 */ + "\x00\x28\x4f\x11\x00\x29\0\0" /* offset 10044 */ + "\x00\x28\x81\xea\x00\x29\0\0" /* offset 10052 */ + "\x00\x28\x81\xf3\x00\x29\0\0" /* offset 10060 */ + "\x00\x32\x00\x31\0\0" /* offset 10068 */ + "\x00\x32\x00\x32\0\0" /* offset 10074 */ + "\x00\x32\x00\x33\0\0" /* offset 10080 */ + "\x00\x32\x00\x34\0\0" /* offset 10086 */ + "\x00\x32\x00\x35\0\0" /* offset 10092 */ + "\x00\x32\x00\x36\0\0" /* offset 10098 */ + "\x00\x32\x00\x37\0\0" /* offset 10104 */ + "\x00\x32\x00\x38\0\0" /* offset 10110 */ + "\x00\x32\x00\x39\0\0" /* offset 10116 */ + "\x00\x33\x00\x30\0\0" /* offset 10122 */ + "\x00\x33\x00\x31\0\0" /* offset 10128 */ + "\x00\x33\x00\x32\0\0" /* offset 10134 */ + "\x00\x33\x00\x33\0\0" /* offset 10140 */ + "\x00\x33\x00\x34\0\0" /* offset 10146 */ + "\x00\x33\x00\x35\0\0" /* offset 10152 */ + "\x11\x00\x11\x61\0\0" /* offset 10158 */ + "\x11\x02\x11\x61\0\0" /* offset 10164 */ + "\x11\x03\x11\x61\0\0" /* offset 10170 */ + "\x11\x05\x11\x61\0\0" /* offset 10176 */ + "\x11\x06\x11\x61\0\0" /* offset 10182 */ + "\x11\x07\x11\x61\0\0" /* offset 10188 */ + "\x11\x09\x11\x61\0\0" /* offset 10194 */ + "\x11\x0b\x11\x61\0\0" /* offset 10200 */ + "\x11\x0c\x11\x61\0\0" /* offset 10206 */ + "\x11\x0e\x11\x61\0\0" /* offset 10212 */ + "\x11\x0f\x11\x61\0\0" /* offset 10218 */ + "\x11\x10\x11\x61\0\0" /* offset 10224 */ + "\x11\x11\x11\x61\0\0" /* offset 10230 */ + "\x11\x12\x11\x61\0\0" /* offset 10236 */ + "\x4e\x94\0\0" /* offset 10242 */ + "\x51\x6d\0\0" /* offset 10246 */ + "\x4e\x03\0\0" /* offset 10250 */ + "\x4e\x5d\0\0" /* offset 10254 */ + "\x68\x2a\0\0" /* offset 10258 */ + "\x67\x09\0\0" /* offset 10262 */ + "\x79\x3e\0\0" /* offset 10266 */ + "\x54\x0d\0\0" /* offset 10270 */ + "\x72\x79\0\0" /* offset 10274 */ + "\x8c\xa1\0\0" /* offset 10278 */ + "\x79\x5d\0\0" /* offset 10282 */ + "\x52\xb4\0\0" /* offset 10286 */ + "\x79\xd8\0\0" /* offset 10290 */ + "\x75\x37\0\0" /* offset 10294 */ + "\x90\x69\0\0" /* offset 10298 */ + "\x51\x2a\0\0" /* offset 10302 */ + "\x53\x70\0\0" /* offset 10306 */ + "\x6c\xe8\0\0" /* offset 10310 */ + "\x98\x05\0\0" /* offset 10314 */ + "\x4f\x11\0\0" /* offset 10318 */ + "\x51\x99\0\0" /* offset 10322 */ + "\x6b\x63\0\0" /* offset 10326 */ + "\x5d\xe6\0\0" /* offset 10330 */ + "\x53\xf3\0\0" /* offset 10334 */ + "\x53\x3b\0\0" /* offset 10338 */ + "\x5b\x97\0\0" /* offset 10342 */ + "\x5b\x66\0\0" /* offset 10346 */ + "\x76\xe3\0\0" /* offset 10350 */ + "\x4f\x01\0\0" /* offset 10354 */ + "\x8c\xc7\0\0" /* offset 10358 */ + "\x53\x54\0\0" /* offset 10362 */ + "\x59\x1c\0\0" /* offset 10366 */ + "\x00\x33\x00\x36\0\0" /* offset 10370 */ + "\x00\x33\x00\x37\0\0" /* offset 10376 */ + "\x00\x33\x00\x38\0\0" /* offset 10382 */ + "\x00\x33\x00\x39\0\0" /* offset 10388 */ + "\x00\x34\x00\x30\0\0" /* offset 10394 */ + "\x00\x34\x00\x31\0\0" /* offset 10400 */ + "\x00\x34\x00\x32\0\0" /* offset 10406 */ + "\x00\x34\x00\x33\0\0" /* offset 10412 */ + "\x00\x34\x00\x34\0\0" /* offset 10418 */ + "\x00\x34\x00\x35\0\0" /* offset 10424 */ + "\x00\x34\x00\x36\0\0" /* offset 10430 */ + "\x00\x34\x00\x37\0\0" /* offset 10436 */ + "\x00\x34\x00\x38\0\0" /* offset 10442 */ + "\x00\x34\x00\x39\0\0" /* offset 10448 */ + "\x00\x35\x00\x30\0\0" /* offset 10454 */ + "\x00\x31\x67\x08\0\0" /* offset 10460 */ + "\x00\x32\x67\x08\0\0" /* offset 10466 */ + "\x00\x33\x67\x08\0\0" /* offset 10472 */ + "\x00\x34\x67\x08\0\0" /* offset 10478 */ + "\x00\x35\x67\x08\0\0" /* offset 10484 */ + "\x00\x36\x67\x08\0\0" /* offset 10490 */ + "\x00\x37\x67\x08\0\0" /* offset 10496 */ + "\x00\x38\x67\x08\0\0" /* offset 10502 */ + "\x00\x39\x67\x08\0\0" /* offset 10508 */ + "\x00\x31\x00\x30\x67\x08\0\0" /* offset 10514 */ + "\x00\x31\x00\x31\x67\x08\0\0" /* offset 10522 */ + "\x00\x31\x00\x32\x67\x08\0\0" /* offset 10530 */ + "\x30\xa2\0\0" /* offset 10538 */ + "\x30\xa4\0\0" /* offset 10542 */ + "\x30\xa6\0\0" /* offset 10546 */ + "\x30\xa8\0\0" /* offset 10550 */ + "\x30\xaa\0\0" /* offset 10554 */ + "\x30\xab\0\0" /* offset 10558 */ + "\x30\xad\0\0" /* offset 10562 */ + "\x30\xaf\0\0" /* offset 10566 */ + "\x30\xb1\0\0" /* offset 10570 */ + "\x30\xb3\0\0" /* offset 10574 */ + "\x30\xb5\0\0" /* offset 10578 */ + "\x30\xb7\0\0" /* offset 10582 */ + "\x30\xb9\0\0" /* offset 10586 */ + "\x30\xbb\0\0" /* offset 10590 */ + "\x30\xbd\0\0" /* offset 10594 */ + "\x30\xbf\0\0" /* offset 10598 */ + "\x30\xc1\0\0" /* offset 10602 */ + "\x30\xc4\0\0" /* offset 10606 */ + "\x30\xc6\0\0" /* offset 10610 */ + "\x30\xc8\0\0" /* offset 10614 */ + "\x30\xca\0\0" /* offset 10618 */ + "\x30\xcb\0\0" /* offset 10622 */ + "\x30\xcc\0\0" /* offset 10626 */ + "\x30\xcd\0\0" /* offset 10630 */ + "\x30\xce\0\0" /* offset 10634 */ + "\x30\xcf\0\0" /* offset 10638 */ + "\x30\xd2\0\0" /* offset 10642 */ + "\x30\xd5\0\0" /* offset 10646 */ + "\x30\xd8\0\0" /* offset 10650 */ + "\x30\xdb\0\0" /* offset 10654 */ + "\x30\xde\0\0" /* offset 10658 */ + "\x30\xdf\0\0" /* offset 10662 */ + "\x30\xe0\0\0" /* offset 10666 */ + "\x30\xe1\0\0" /* offset 10670 */ + "\x30\xe2\0\0" /* offset 10674 */ + "\x30\xe4\0\0" /* offset 10678 */ + "\x30\xe6\0\0" /* offset 10682 */ + "\x30\xe8\0\0" /* offset 10686 */ + "\x30\xe9\0\0" /* offset 10690 */ + "\x30\xea\0\0" /* offset 10694 */ + "\x30\xeb\0\0" /* offset 10698 */ + "\x30\xec\0\0" /* offset 10702 */ + "\x30\xed\0\0" /* offset 10706 */ + "\x30\xef\0\0" /* offset 10710 */ + "\x30\xf0\0\0" /* offset 10714 */ + "\x30\xf1\0\0" /* offset 10718 */ + "\x30\xf2\0\0" /* offset 10722 */ + "\x30\xa2\x30\xcf\x30\x9a\x30\xfc\x30\xc8\0\0" /* offset 10726 */ + "\x30\xa2\x30\xeb\x30\xd5\x30\xa1\0\0" /* offset 10738 */ + "\x30\xa2\x30\xf3\x30\xd8\x30\x9a\x30\xa2\0\0" /* offset 10748 */ + "\x30\xa2\x30\xfc\x30\xeb\0\0" /* offset 10760 */ + "\x30\xa4\x30\xcb\x30\xf3\x30\xaf\x30\x99\0\0" /* offset 10768 */ + "\x30\xa4\x30\xf3\x30\xc1\0\0" /* offset 10780 */ + "\x30\xa6\x30\xa9\x30\xf3\0\0" /* offset 10788 */ + "\x30\xa8\x30\xb9\x30\xaf\x30\xfc\x30\xc8\x30\x99\0\0" /* offset 10796 */ + "\x30\xa8\x30\xfc\x30\xab\x30\xfc\0\0" /* offset 10810 */ + "\x30\xaa\x30\xf3\x30\xb9\0\0" /* offset 10820 */ + "\x30\xaa\x30\xfc\x30\xe0\0\0" /* offset 10828 */ + "\x30\xab\x30\xa4\x30\xea\0\0" /* offset 10836 */ + "\x30\xab\x30\xe9\x30\xc3\x30\xc8\0\0" /* offset 10844 */ + "\x30\xab\x30\xed\x30\xea\x30\xfc\0\0" /* offset 10854 */ + "\x30\xab\x30\x99\x30\xed\x30\xf3\0\0" /* offset 10864 */ + "\x30\xab\x30\x99\x30\xf3\x30\xde\0\0" /* offset 10874 */ + "\x30\xad\x30\x99\x30\xab\x30\x99\0\0" /* offset 10884 */ + "\x30\xad\x30\x99\x30\xcb\x30\xfc\0\0" /* offset 10894 */ + "\x30\xad\x30\xe5\x30\xea\x30\xfc\0\0" /* offset 10904 */ + "\x30\xad\x30\x99\x30\xeb\x30\xbf\x30\x99\x30\xfc\0\0" /* offset 10914 */ + "\x30\xad\x30\xed\0\0" /* offset 10928 */ + "\x30\xad\x30\xed\x30\xaf\x30\x99\x30\xe9\x30\xe0\0\0" /* offset 10934 */ + "\x30\xad\x30\xed\x30\xe1\x30\xfc\x30\xc8\x30\xeb\0\0" /* offset 10948 */ + "\x30\xad\x30\xed\x30\xef\x30\xc3\x30\xc8\0\0" /* offset 10962 */ + "\x30\xaf\x30\x99\x30\xe9\x30\xe0\0\0" /* offset 10974 */ + "\x30\xaf\x30\x99\x30\xe9\x30\xe0\x30\xc8\x30\xf3\0\0" /* offset 10984 */ + "\x30\xaf\x30\xeb\x30\xbb\x30\x99\x30\xa4\x30\xed\0\0" /* offset 10998 */ + "\x30\xaf\x30\xed\x30\xfc\x30\xcd\0\0" /* offset 11012 */ + "\x30\xb1\x30\xfc\x30\xb9\0\0" /* offset 11022 */ + "\x30\xb3\x30\xeb\x30\xca\0\0" /* offset 11030 */ + "\x30\xb3\x30\xfc\x30\xdb\x30\x9a\0\0" /* offset 11038 */ + "\x30\xb5\x30\xa4\x30\xaf\x30\xeb\0\0" /* offset 11048 */ + "\x30\xb5\x30\xf3\x30\xc1\x30\xfc\x30\xe0\0\0" /* offset 11058 */ + "\x30\xb7\x30\xea\x30\xf3\x30\xaf\x30\x99\0\0" /* offset 11070 */ + "\x30\xbb\x30\xf3\x30\xc1\0\0" /* offset 11082 */ + "\x30\xbb\x30\xf3\x30\xc8\0\0" /* offset 11090 */ + "\x30\xbf\x30\x99\x30\xfc\x30\xb9\0\0" /* offset 11098 */ + "\x30\xc6\x30\x99\x30\xb7\0\0" /* offset 11108 */ + "\x30\xc8\x30\x99\x30\xeb\0\0" /* offset 11116 */ + "\x30\xc8\x30\xf3\0\0" /* offset 11124 */ + "\x30\xca\x30\xce\0\0" /* offset 11130 */ + "\x30\xce\x30\xc3\x30\xc8\0\0" /* offset 11136 */ + "\x30\xcf\x30\xa4\x30\xc4\0\0" /* offset 11144 */ + "\x30\xcf\x30\x9a\x30\xfc\x30\xbb\x30\xf3\x30\xc8\0\0" /* offset 11152 */ + "\x30\xcf\x30\x9a\x30\xfc\x30\xc4\0\0" /* offset 11166 */ + "\x30\xcf\x30\x99\x30\xfc\x30\xec\x30\xeb\0\0" /* offset 11176 */ + "\x30\xd2\x30\x9a\x30\xa2\x30\xb9\x30\xc8\x30\xeb\0\0" /* offset 11188 */ + "\x30\xd2\x30\x9a\x30\xaf\x30\xeb\0\0" /* offset 11202 */ + "\x30\xd2\x30\x9a\x30\xb3\0\0" /* offset 11212 */ + "\x30\xd2\x30\x99\x30\xeb\0\0" /* offset 11220 */ + "\x30\xd5\x30\xa1\x30\xe9\x30\xc3\x30\xc8\x30\x99\0\0" /* offset 11228 */ + "\x30\xd5\x30\xa3\x30\xfc\x30\xc8\0\0" /* offset 11242 */ + "\x30\xd5\x30\x99\x30\xc3\x30\xb7\x30\xa7\x30\xeb\0\0" /* offset 11252 */ + "\x30\xd5\x30\xe9\x30\xf3\0\0" /* offset 11266 */ + "\x30\xd8\x30\xaf\x30\xbf\x30\xfc\x30\xeb\0\0" /* offset 11274 */ + "\x30\xd8\x30\x9a\x30\xbd\0\0" /* offset 11286 */ + "\x30\xd8\x30\x9a\x30\xcb\x30\xd2\0\0" /* offset 11294 */ + "\x30\xd8\x30\xeb\x30\xc4\0\0" /* offset 11304 */ + "\x30\xd8\x30\x9a\x30\xf3\x30\xb9\0\0" /* offset 11312 */ + "\x30\xd8\x30\x9a\x30\xfc\x30\xb7\x30\x99\0\0" /* offset 11322 */ + "\x30\xd8\x30\x99\x30\xfc\x30\xbf\0\0" /* offset 11334 */ + "\x30\xdb\x30\x9a\x30\xa4\x30\xf3\x30\xc8\0\0" /* offset 11344 */ + "\x30\xdb\x30\x99\x30\xeb\x30\xc8\0\0" /* offset 11356 */ + "\x30\xdb\x30\xf3\0\0" /* offset 11366 */ + "\x30\xdb\x30\x9a\x30\xf3\x30\xc8\x30\x99\0\0" /* offset 11372 */ + "\x30\xdb\x30\xfc\x30\xeb\0\0" /* offset 11384 */ + "\x30\xdb\x30\xfc\x30\xf3\0\0" /* offset 11392 */ + "\x30\xde\x30\xa4\x30\xaf\x30\xed\0\0" /* offset 11400 */ + "\x30\xde\x30\xa4\x30\xeb\0\0" /* offset 11410 */ + "\x30\xde\x30\xc3\x30\xcf\0\0" /* offset 11418 */ + "\x30\xde\x30\xeb\x30\xaf\0\0" /* offset 11426 */ + "\x30\xde\x30\xf3\x30\xb7\x30\xe7\x30\xf3\0\0" /* offset 11434 */ + "\x30\xdf\x30\xaf\x30\xed\x30\xf3\0\0" /* offset 11446 */ + "\x30\xdf\x30\xea\0\0" /* offset 11456 */ + "\x30\xdf\x30\xea\x30\xcf\x30\x99\x30\xfc\x30\xeb\0\0" /* offset 11462 */ + "\x30\xe1\x30\xab\x30\x99\0\0" /* offset 11476 */ + "\x30\xe1\x30\xab\x30\x99\x30\xc8\x30\xf3\0\0" /* offset 11484 */ + "\x30\xe1\x30\xfc\x30\xc8\x30\xeb\0\0" /* offset 11496 */ + "\x30\xe4\x30\xfc\x30\xc8\x30\x99\0\0" /* offset 11506 */ + "\x30\xe4\x30\xfc\x30\xeb\0\0" /* offset 11516 */ + "\x30\xe6\x30\xa2\x30\xf3\0\0" /* offset 11524 */ + "\x30\xea\x30\xc3\x30\xc8\x30\xeb\0\0" /* offset 11532 */ + "\x30\xea\x30\xe9\0\0" /* offset 11542 */ + "\x30\xeb\x30\xd2\x30\x9a\x30\xfc\0\0" /* offset 11548 */ + "\x30\xeb\x30\xfc\x30\xd5\x30\x99\x30\xeb\0\0" /* offset 11558 */ + "\x30\xec\x30\xe0\0\0" /* offset 11570 */ + "\x30\xec\x30\xf3\x30\xc8\x30\xb1\x30\x99\x30\xf3\0\0" /* offset 11576 */ + "\x30\xef\x30\xc3\x30\xc8\0\0" /* offset 11590 */ + "\x00\x30\x70\xb9\0\0" /* offset 11598 */ + "\x00\x31\x70\xb9\0\0" /* offset 11604 */ + "\x00\x32\x70\xb9\0\0" /* offset 11610 */ + "\x00\x33\x70\xb9\0\0" /* offset 11616 */ + "\x00\x34\x70\xb9\0\0" /* offset 11622 */ + "\x00\x35\x70\xb9\0\0" /* offset 11628 */ + "\x00\x36\x70\xb9\0\0" /* offset 11634 */ + "\x00\x37\x70\xb9\0\0" /* offset 11640 */ + "\x00\x38\x70\xb9\0\0" /* offset 11646 */ + "\x00\x39\x70\xb9\0\0" /* offset 11652 */ + "\x00\x31\x00\x30\x70\xb9\0\0" /* offset 11658 */ + "\x00\x31\x00\x31\x70\xb9\0\0" /* offset 11666 */ + "\x00\x31\x00\x32\x70\xb9\0\0" /* offset 11674 */ + "\x00\x31\x00\x33\x70\xb9\0\0" /* offset 11682 */ + "\x00\x31\x00\x34\x70\xb9\0\0" /* offset 11690 */ + "\x00\x31\x00\x35\x70\xb9\0\0" /* offset 11698 */ + "\x00\x31\x00\x36\x70\xb9\0\0" /* offset 11706 */ + "\x00\x31\x00\x37\x70\xb9\0\0" /* offset 11714 */ + "\x00\x31\x00\x38\x70\xb9\0\0" /* offset 11722 */ + "\x00\x31\x00\x39\x70\xb9\0\0" /* offset 11730 */ + "\x00\x32\x00\x30\x70\xb9\0\0" /* offset 11738 */ + "\x00\x32\x00\x31\x70\xb9\0\0" /* offset 11746 */ + "\x00\x32\x00\x32\x70\xb9\0\0" /* offset 11754 */ + "\x00\x32\x00\x33\x70\xb9\0\0" /* offset 11762 */ + "\x00\x32\x00\x34\x70\xb9\0\0" /* offset 11770 */ + "\x00\x68\x00\x50\x00\x61\0\0" /* offset 11778 */ + "\x00\x64\x00\x61\0\0" /* offset 11786 */ + "\x00\x41\x00\x55\0\0" /* offset 11792 */ + "\x00\x62\x00\x61\x00\x72\0\0" /* offset 11798 */ + "\x00\x6f\x00\x56\0\0" /* offset 11806 */ + "\x00\x70\x00\x63\0\0" /* offset 11812 */ + "\x5e\x73\x62\x10\0\0" /* offset 11818 */ + "\x66\x2d\x54\x8c\0\0" /* offset 11824 */ + "\x59\x27\x6b\x63\0\0" /* offset 11830 */ + "\x66\x0e\x6c\xbb\0\0" /* offset 11836 */ + "\x68\x2a\x5f\x0f\x4f\x1a\x79\x3e\0\0" /* offset 11842 */ + "\x00\x70\x00\x41\0\0" /* offset 11852 */ + "\x00\x6e\x00\x41\0\0" /* offset 11858 */ + "\x03\xbc\x00\x41\0\0" /* offset 11864 */ + "\x00\x6d\x00\x41\0\0" /* offset 11870 */ + "\x00\x6b\x00\x41\0\0" /* offset 11876 */ + "\x00\x4b\x00\x42\0\0" /* offset 11882 */ + "\x00\x4d\x00\x42\0\0" /* offset 11888 */ + "\x00\x47\x00\x42\0\0" /* offset 11894 */ + "\x00\x63\x00\x61\x00\x6c\0\0" /* offset 11900 */ + "\x00\x6b\x00\x63\x00\x61\x00\x6c\0\0" /* offset 11908 */ + "\x00\x70\x00\x46\0\0" /* offset 11918 */ + "\x00\x6e\x00\x46\0\0" /* offset 11924 */ + "\x03\xbc\x00\x46\0\0" /* offset 11930 */ + "\x03\xbc\x00\x67\0\0" /* offset 11936 */ + "\x00\x6d\x00\x67\0\0" /* offset 11942 */ + "\x00\x6b\x00\x67\0\0" /* offset 11948 */ + "\x00\x48\x00\x7a\0\0" /* offset 11954 */ + "\x00\x6b\x00\x48\x00\x7a\0\0" /* offset 11960 */ + "\x00\x4d\x00\x48\x00\x7a\0\0" /* offset 11968 */ + "\x00\x47\x00\x48\x00\x7a\0\0" /* offset 11976 */ + "\x00\x54\x00\x48\x00\x7a\0\0" /* offset 11984 */ + "\x03\xbc\x00\x6c\0\0" /* offset 11992 */ + "\x00\x6d\x00\x6c\0\0" /* offset 11998 */ + "\x00\x64\x00\x6c\0\0" /* offset 12004 */ + "\x00\x6b\x00\x6c\0\0" /* offset 12010 */ + "\x00\x66\x00\x6d\0\0" /* offset 12016 */ + "\x00\x6e\x00\x6d\0\0" /* offset 12022 */ + "\x03\xbc\x00\x6d\0\0" /* offset 12028 */ + "\x00\x6d\x00\x6d\0\0" /* offset 12034 */ + "\x00\x63\x00\x6d\0\0" /* offset 12040 */ + "\x00\x6b\x00\x6d\0\0" /* offset 12046 */ + "\x00\x6d\x00\x6d\x00\x32\0\0" /* offset 12052 */ + "\x00\x63\x00\x6d\x00\x32\0\0" /* offset 12060 */ + "\x00\x6d\x00\x32\0\0" /* offset 12068 */ + "\x00\x6b\x00\x6d\x00\x32\0\0" /* offset 12074 */ + "\x00\x6d\x00\x6d\x00\x33\0\0" /* offset 12082 */ + "\x00\x63\x00\x6d\x00\x33\0\0" /* offset 12090 */ + "\x00\x6d\x00\x33\0\0" /* offset 12098 */ + "\x00\x6b\x00\x6d\x00\x33\0\0" /* offset 12104 */ + "\x00\x6d\x22\x15\x00\x73\0\0" /* offset 12112 */ + "\x00\x6d\x22\x15\x00\x73\x00\x32\0\0" /* offset 12120 */ + "\x00\x50\x00\x61\0\0" /* offset 12130 */ + "\x00\x6b\x00\x50\x00\x61\0\0" /* offset 12136 */ + "\x00\x4d\x00\x50\x00\x61\0\0" /* offset 12144 */ + "\x00\x47\x00\x50\x00\x61\0\0" /* offset 12152 */ + "\x00\x72\x00\x61\x00\x64\0\0" /* offset 12160 */ + "\x00\x72\x00\x61\x00\x64\x22\x15\x00\x73\0\0" /* offset 12168 */ + "\x00\x72\x00\x61\x00\x64\x22\x15\x00\x73\x00\x32\0\0" /* offset 12180 */ + "\x00\x70\x00\x73\0\0" /* offset 12194 */ + "\x00\x6e\x00\x73\0\0" /* offset 12200 */ + "\x03\xbc\x00\x73\0\0" /* offset 12206 */ + "\x00\x6d\x00\x73\0\0" /* offset 12212 */ + "\x00\x70\x00\x56\0\0" /* offset 12218 */ + "\x00\x6e\x00\x56\0\0" /* offset 12224 */ + "\x03\xbc\x00\x56\0\0" /* offset 12230 */ + "\x00\x6d\x00\x56\0\0" /* offset 12236 */ + "\x00\x6b\x00\x56\0\0" /* offset 12242 */ + "\x00\x4d\x00\x56\0\0" /* offset 12248 */ + "\x00\x70\x00\x57\0\0" /* offset 12254 */ + "\x00\x6e\x00\x57\0\0" /* offset 12260 */ + "\x03\xbc\x00\x57\0\0" /* offset 12266 */ + "\x00\x6d\x00\x57\0\0" /* offset 12272 */ + "\x00\x6b\x00\x57\0\0" /* offset 12278 */ + "\x00\x4d\x00\x57\0\0" /* offset 12284 */ + "\x00\x6b\x03\xa9\0\0" /* offset 12290 */ + "\x00\x4d\x03\xa9\0\0" /* offset 12296 */ + "\x00\x61\x00\x2e\x00\x6d\x00\x2e\0\0" /* offset 12302 */ + "\x00\x42\x00\x71\0\0" /* offset 12312 */ + "\x00\x63\x00\x63\0\0" /* offset 12318 */ + "\x00\x63\x00\x64\0\0" /* offset 12324 */ + "\x00\x43\x22\x15\x00\x6b\x00\x67\0\0" /* offset 12330 */ + "\x00\x43\x00\x6f\x00\x2e\0\0" /* offset 12340 */ + "\x00\x64\x00\x42\0\0" /* offset 12348 */ + "\x00\x47\x00\x79\0\0" /* offset 12354 */ + "\x00\x68\x00\x61\0\0" /* offset 12360 */ + "\x00\x48\x00\x50\0\0" /* offset 12366 */ + "\x00\x69\x00\x6e\0\0" /* offset 12372 */ + "\x00\x4b\x00\x4b\0\0" /* offset 12378 */ + "\x00\x4b\x00\x4d\0\0" /* offset 12384 */ + "\x00\x6b\x00\x74\0\0" /* offset 12390 */ + "\x00\x6c\x00\x6d\0\0" /* offset 12396 */ + "\x00\x6c\x00\x6e\0\0" /* offset 12402 */ + "\x00\x6c\x00\x6f\x00\x67\0\0" /* offset 12408 */ + "\x00\x6c\x00\x78\0\0" /* offset 12416 */ + "\x00\x6d\x00\x62\0\0" /* offset 12422 */ + "\x00\x6d\x00\x69\x00\x6c\0\0" /* offset 12428 */ + "\x00\x6d\x00\x6f\x00\x6c\0\0" /* offset 12436 */ + "\x00\x50\x00\x48\0\0" /* offset 12444 */ + "\x00\x70\x00\x2e\x00\x6d\x00\x2e\0\0" /* offset 12450 */ + "\x00\x50\x00\x50\x00\x4d\0\0" /* offset 12460 */ + "\x00\x50\x00\x52\0\0" /* offset 12468 */ + "\x00\x73\x00\x72\0\0" /* offset 12474 */ + "\x00\x53\x00\x76\0\0" /* offset 12480 */ + "\x00\x57\x00\x62\0\0" /* offset 12486 */ + "\x00\x31\x65\xe5\0\0" /* offset 12492 */ + "\x00\x32\x65\xe5\0\0" /* offset 12498 */ + "\x00\x33\x65\xe5\0\0" /* offset 12504 */ + "\x00\x34\x65\xe5\0\0" /* offset 12510 */ + "\x00\x35\x65\xe5\0\0" /* offset 12516 */ + "\x00\x36\x65\xe5\0\0" /* offset 12522 */ + "\x00\x37\x65\xe5\0\0" /* offset 12528 */ + "\x00\x38\x65\xe5\0\0" /* offset 12534 */ + "\x00\x39\x65\xe5\0\0" /* offset 12540 */ + "\x00\x31\x00\x30\x65\xe5\0\0" /* offset 12546 */ + "\x00\x31\x00\x31\x65\xe5\0\0" /* offset 12554 */ + "\x00\x31\x00\x32\x65\xe5\0\0" /* offset 12562 */ + "\x00\x31\x00\x33\x65\xe5\0\0" /* offset 12570 */ + "\x00\x31\x00\x34\x65\xe5\0\0" /* offset 12578 */ + "\x00\x31\x00\x35\x65\xe5\0\0" /* offset 12586 */ + "\x00\x31\x00\x36\x65\xe5\0\0" /* offset 12594 */ + "\x00\x31\x00\x37\x65\xe5\0\0" /* offset 12602 */ + "\x00\x31\x00\x38\x65\xe5\0\0" /* offset 12610 */ + "\x00\x31\x00\x39\x65\xe5\0\0" /* offset 12618 */ + "\x00\x32\x00\x30\x65\xe5\0\0" /* offset 12626 */ + "\x00\x32\x00\x31\x65\xe5\0\0" /* offset 12634 */ + "\x00\x32\x00\x32\x65\xe5\0\0" /* offset 12642 */ + "\x00\x32\x00\x33\x65\xe5\0\0" /* offset 12650 */ + "\x00\x32\x00\x34\x65\xe5\0\0" /* offset 12658 */ + "\x00\x32\x00\x35\x65\xe5\0\0" /* offset 12666 */ + "\x00\x32\x00\x36\x65\xe5\0\0" /* offset 12674 */ + "\x00\x32\x00\x37\x65\xe5\0\0" /* offset 12682 */ + "\x00\x32\x00\x38\x65\xe5\0\0" /* offset 12690 */ + "\x00\x32\x00\x39\x65\xe5\0\0" /* offset 12698 */ + "\x00\x33\x00\x30\x65\xe5\0\0" /* offset 12706 */ + "\x00\x33\x00\x31\x65\xe5\0\0" /* offset 12714 */ + "\x8c\x48\0\0" /* offset 12722 */ + "\x66\xf4\0\0" /* offset 12726 */ + "\x8c\xc8\0\0" /* offset 12730 */ + "\x6e\xd1\0\0" /* offset 12734 */ + "\x4e\x32\0\0" /* offset 12738 */ + "\x53\xe5\0\0" /* offset 12742 */ + "\x59\x51\0\0" /* offset 12746 */ + "\x55\x87\0\0" /* offset 12750 */ + "\x59\x48\0\0" /* offset 12754 */ + "\x61\xf6\0\0" /* offset 12758 */ + "\x76\x69\0\0" /* offset 12762 */ + "\x7f\x85\0\0" /* offset 12766 */ + "\x86\x3f\0\0" /* offset 12770 */ + "\x87\xba\0\0" /* offset 12774 */ + "\x88\xf8\0\0" /* offset 12778 */ + "\x90\x8f\0\0" /* offset 12782 */ + "\x6a\x02\0\0" /* offset 12786 */ + "\x6d\x1b\0\0" /* offset 12790 */ + "\x70\xd9\0\0" /* offset 12794 */ + "\x73\xde\0\0" /* offset 12798 */ + "\x84\x3d\0\0" /* offset 12802 */ + "\x91\x6a\0\0" /* offset 12806 */ + "\x99\xf1\0\0" /* offset 12810 */ + "\x4e\x82\0\0" /* offset 12814 */ + "\x53\x75\0\0" /* offset 12818 */ + "\x6b\x04\0\0" /* offset 12822 */ + "\x72\x1b\0\0" /* offset 12826 */ + "\x86\x2d\0\0" /* offset 12830 */ + "\x9e\x1e\0\0" /* offset 12834 */ + "\x5d\x50\0\0" /* offset 12838 */ + "\x6f\xeb\0\0" /* offset 12842 */ + "\x85\xcd\0\0" /* offset 12846 */ + "\x89\x64\0\0" /* offset 12850 */ + "\x62\xc9\0\0" /* offset 12854 */ + "\x81\xd8\0\0" /* offset 12858 */ + "\x88\x1f\0\0" /* offset 12862 */ + "\x5e\xca\0\0" /* offset 12866 */ + "\x67\x17\0\0" /* offset 12870 */ + "\x6d\x6a\0\0" /* offset 12874 */ + "\x72\xfc\0\0" /* offset 12878 */ + "\x90\xce\0\0" /* offset 12882 */ + "\x4f\x86\0\0" /* offset 12886 */ + "\x51\xb7\0\0" /* offset 12890 */ + "\x52\xde\0\0" /* offset 12894 */ + "\x64\xc4\0\0" /* offset 12898 */ + "\x6a\xd3\0\0" /* offset 12902 */ + "\x72\x10\0\0" /* offset 12906 */ + "\x76\xe7\0\0" /* offset 12910 */ + "\x86\x06\0\0" /* offset 12914 */ + "\x86\x5c\0\0" /* offset 12918 */ + "\x8d\xef\0\0" /* offset 12922 */ + "\x97\x32\0\0" /* offset 12926 */ + "\x9b\x6f\0\0" /* offset 12930 */ + "\x9d\xfa\0\0" /* offset 12934 */ + "\x78\x8c\0\0" /* offset 12938 */ + "\x79\x7f\0\0" /* offset 12942 */ + "\x7d\xa0\0\0" /* offset 12946 */ + "\x83\xc9\0\0" /* offset 12950 */ + "\x93\x04\0\0" /* offset 12954 */ + "\x8a\xd6\0\0" /* offset 12958 */ + "\x58\xdf\0\0" /* offset 12962 */ + "\x5f\x04\0\0" /* offset 12966 */ + "\x7c\x60\0\0" /* offset 12970 */ + "\x80\x7e\0\0" /* offset 12974 */ + "\x72\x62\0\0" /* offset 12978 */ + "\x78\xca\0\0" /* offset 12982 */ + "\x8c\xc2\0\0" /* offset 12986 */ + "\x96\xf7\0\0" /* offset 12990 */ + "\x58\xd8\0\0" /* offset 12994 */ + "\x5c\x62\0\0" /* offset 12998 */ + "\x6a\x13\0\0" /* offset 13002 */ + "\x6d\xda\0\0" /* offset 13006 */ + "\x6f\x0f\0\0" /* offset 13010 */ + "\x7d\x2f\0\0" /* offset 13014 */ + "\x7e\x37\0\0" /* offset 13018 */ + "\x96\x4b\0\0" /* offset 13022 */ + "\x52\xd2\0\0" /* offset 13026 */ + "\x80\x8b\0\0" /* offset 13030 */ + "\x51\xdc\0\0" /* offset 13034 */ + "\x51\xcc\0\0" /* offset 13038 */ + "\x7a\x1c\0\0" /* offset 13042 */ + "\x7d\xbe\0\0" /* offset 13046 */ + "\x83\xf1\0\0" /* offset 13050 */ + "\x96\x75\0\0" /* offset 13054 */ + "\x8b\x80\0\0" /* offset 13058 */ + "\x62\xcf\0\0" /* offset 13062 */ + "\x8a\xfe\0\0" /* offset 13066 */ + "\x4e\x39\0\0" /* offset 13070 */ + "\x5b\xe7\0\0" /* offset 13074 */ + "\x60\x12\0\0" /* offset 13078 */ + "\x73\x87\0\0" /* offset 13082 */ + "\x75\x70\0\0" /* offset 13086 */ + "\x53\x17\0\0" /* offset 13090 */ + "\x78\xfb\0\0" /* offset 13094 */ + "\x4f\xbf\0\0" /* offset 13098 */ + "\x5f\xa9\0\0" /* offset 13102 */ + "\x4e\x0d\0\0" /* offset 13106 */ + "\x6c\xcc\0\0" /* offset 13110 */ + "\x65\x78\0\0" /* offset 13114 */ + "\x7d\x22\0\0" /* offset 13118 */ + "\x53\xc3\0\0" /* offset 13122 */ + "\x58\x5e\0\0" /* offset 13126 */ + "\x77\x01\0\0" /* offset 13130 */ + "\x84\x49\0\0" /* offset 13134 */ + "\x8a\xaa\0\0" /* offset 13138 */ + "\x6b\xba\0\0" /* offset 13142 */ + "\x6c\x88\0\0" /* offset 13146 */ + "\x62\xfe\0\0" /* offset 13150 */ + "\x82\xe5\0\0" /* offset 13154 */ + "\x63\xa0\0\0" /* offset 13158 */ + "\x75\x65\0\0" /* offset 13162 */ + "\x4e\xae\0\0" /* offset 13166 */ + "\x51\x69\0\0" /* offset 13170 */ + "\x51\xc9\0\0" /* offset 13174 */ + "\x68\x81\0\0" /* offset 13178 */ + "\x7c\xe7\0\0" /* offset 13182 */ + "\x82\x6f\0\0" /* offset 13186 */ + "\x8a\xd2\0\0" /* offset 13190 */ + "\x91\xcf\0\0" /* offset 13194 */ + "\x52\xf5\0\0" /* offset 13198 */ + "\x54\x42\0\0" /* offset 13202 */ + "\x5e\xec\0\0" /* offset 13206 */ + "\x65\xc5\0\0" /* offset 13210 */ + "\x6f\xfe\0\0" /* offset 13214 */ + "\x79\x2a\0\0" /* offset 13218 */ + "\x95\xad\0\0" /* offset 13222 */ + "\x9a\x6a\0\0" /* offset 13226 */ + "\x9e\x97\0\0" /* offset 13230 */ + "\x9e\xce\0\0" /* offset 13234 */ + "\x66\xc6\0\0" /* offset 13238 */ + "\x6b\x77\0\0" /* offset 13242 */ + "\x8f\x62\0\0" /* offset 13246 */ + "\x5e\x74\0\0" /* offset 13250 */ + "\x61\x90\0\0" /* offset 13254 */ + "\x62\x00\0\0" /* offset 13258 */ + "\x64\x9a\0\0" /* offset 13262 */ + "\x6f\x23\0\0" /* offset 13266 */ + "\x71\x49\0\0" /* offset 13270 */ + "\x74\x89\0\0" /* offset 13274 */ + "\x79\xca\0\0" /* offset 13278 */ + "\x7d\xf4\0\0" /* offset 13282 */ + "\x80\x6f\0\0" /* offset 13286 */ + "\x8f\x26\0\0" /* offset 13290 */ + "\x84\xee\0\0" /* offset 13294 */ + "\x90\x23\0\0" /* offset 13298 */ + "\x93\x4a\0\0" /* offset 13302 */ + "\x52\x17\0\0" /* offset 13306 */ + "\x52\xa3\0\0" /* offset 13310 */ + "\x54\xbd\0\0" /* offset 13314 */ + "\x70\xc8\0\0" /* offset 13318 */ + "\x88\xc2\0\0" /* offset 13322 */ + "\x5e\xc9\0\0" /* offset 13326 */ + "\x5f\xf5\0\0" /* offset 13330 */ + "\x63\x7b\0\0" /* offset 13334 */ + "\x6b\xae\0\0" /* offset 13338 */ + "\x7c\x3e\0\0" /* offset 13342 */ + "\x73\x75\0\0" /* offset 13346 */ + "\x4e\xe4\0\0" /* offset 13350 */ + "\x56\xf9\0\0" /* offset 13354 */ + "\x5d\xba\0\0" /* offset 13358 */ + "\x60\x1c\0\0" /* offset 13362 */ + "\x73\xb2\0\0" /* offset 13366 */ + "\x74\x69\0\0" /* offset 13370 */ + "\x7f\x9a\0\0" /* offset 13374 */ + "\x80\x46\0\0" /* offset 13378 */ + "\x92\x34\0\0" /* offset 13382 */ + "\x96\xf6\0\0" /* offset 13386 */ + "\x97\x48\0\0" /* offset 13390 */ + "\x98\x18\0\0" /* offset 13394 */ + "\x4f\x8b\0\0" /* offset 13398 */ + "\x79\xae\0\0" /* offset 13402 */ + "\x91\xb4\0\0" /* offset 13406 */ + "\x96\xb8\0\0" /* offset 13410 */ + "\x60\xe1\0\0" /* offset 13414 */ + "\x4e\x86\0\0" /* offset 13418 */ + "\x50\xda\0\0" /* offset 13422 */ + "\x5b\xee\0\0" /* offset 13426 */ + "\x5c\x3f\0\0" /* offset 13430 */ + "\x65\x99\0\0" /* offset 13434 */ + "\x71\xce\0\0" /* offset 13438 */ + "\x76\x42\0\0" /* offset 13442 */ + "\x84\xfc\0\0" /* offset 13446 */ + "\x90\x7c\0\0" /* offset 13450 */ + "\x66\x88\0\0" /* offset 13454 */ + "\x96\x2e\0\0" /* offset 13458 */ + "\x52\x89\0\0" /* offset 13462 */ + "\x67\x7b\0\0" /* offset 13466 */ + "\x67\xf3\0\0" /* offset 13470 */ + "\x6d\x41\0\0" /* offset 13474 */ + "\x6e\x9c\0\0" /* offset 13478 */ + "\x74\x09\0\0" /* offset 13482 */ + "\x75\x59\0\0" /* offset 13486 */ + "\x78\x6b\0\0" /* offset 13490 */ + "\x7d\x10\0\0" /* offset 13494 */ + "\x98\x5e\0\0" /* offset 13498 */ + "\x62\x2e\0\0" /* offset 13502 */ + "\x96\x78\0\0" /* offset 13506 */ + "\x50\x2b\0\0" /* offset 13510 */ + "\x5d\x19\0\0" /* offset 13514 */ + "\x6d\xea\0\0" /* offset 13518 */ + "\x8f\x2a\0\0" /* offset 13522 */ + "\x5f\x8b\0\0" /* offset 13526 */ + "\x61\x44\0\0" /* offset 13530 */ + "\x68\x17\0\0" /* offset 13534 */ + "\x96\x86\0\0" /* offset 13538 */ + "\x52\x29\0\0" /* offset 13542 */ + "\x54\x0f\0\0" /* offset 13546 */ + "\x5c\x65\0\0" /* offset 13550 */ + "\x66\x13\0\0" /* offset 13554 */ + "\x67\x4e\0\0" /* offset 13558 */ + "\x68\xa8\0\0" /* offset 13562 */ + "\x6c\xe5\0\0" /* offset 13566 */ + "\x74\x06\0\0" /* offset 13570 */ + "\x75\xe2\0\0" /* offset 13574 */ + "\x7f\x79\0\0" /* offset 13578 */ + "\x88\xcf\0\0" /* offset 13582 */ + "\x88\xe1\0\0" /* offset 13586 */ + "\x96\xe2\0\0" /* offset 13590 */ + "\x53\x3f\0\0" /* offset 13594 */ + "\x6e\xba\0\0" /* offset 13598 */ + "\x54\x1d\0\0" /* offset 13602 */ + "\x71\xd0\0\0" /* offset 13606 */ + "\x74\x98\0\0" /* offset 13610 */ + "\x85\xfa\0\0" /* offset 13614 */ + "\x96\xa3\0\0" /* offset 13618 */ + "\x9c\x57\0\0" /* offset 13622 */ + "\x9e\x9f\0\0" /* offset 13626 */ + "\x67\x97\0\0" /* offset 13630 */ + "\x6d\xcb\0\0" /* offset 13634 */ + "\x81\xe8\0\0" /* offset 13638 */ + "\x7b\x20\0\0" /* offset 13642 */ + "\x7c\x92\0\0" /* offset 13646 */ + "\x72\xc0\0\0" /* offset 13650 */ + "\x70\x99\0\0" /* offset 13654 */ + "\x8b\x58\0\0" /* offset 13658 */ + "\x4e\xc0\0\0" /* offset 13662 */ + "\x83\x36\0\0" /* offset 13666 */ + "\x52\x3a\0\0" /* offset 13670 */ + "\x52\x07\0\0" /* offset 13674 */ + "\x5e\xa6\0\0" /* offset 13678 */ + "\x62\xd3\0\0" /* offset 13682 */ + "\x7c\xd6\0\0" /* offset 13686 */ + "\x5b\x85\0\0" /* offset 13690 */ + "\x6d\x1e\0\0" /* offset 13694 */ + "\x66\xb4\0\0" /* offset 13698 */ + "\x8f\x3b\0\0" /* offset 13702 */ + "\x96\x4d\0\0" /* offset 13706 */ + "\x5e\xd3\0\0" /* offset 13710 */ + "\x51\x40\0\0" /* offset 13714 */ + "\x55\xc0\0\0" /* offset 13718 */ + "\x58\x5a\0\0" /* offset 13722 */ + "\x66\x74\0\0" /* offset 13726 */ + "\x51\xde\0\0" /* offset 13730 */ + "\x73\x2a\0\0" /* offset 13734 */ + "\x76\xca\0\0" /* offset 13738 */ + "\x79\x3c\0\0" /* offset 13742 */ + "\x79\x5e\0\0" /* offset 13746 */ + "\x79\x65\0\0" /* offset 13750 */ + "\x79\x8f\0\0" /* offset 13754 */ + "\x97\x56\0\0" /* offset 13758 */ + "\x7c\xbe\0\0" /* offset 13762 */ + "\x86\x12\0\0" /* offset 13766 */ + "\x8a\xf8\0\0" /* offset 13770 */ + "\x90\x38\0\0" /* offset 13774 */ + "\x90\xfd\0\0" /* offset 13778 */ + "\x98\xef\0\0" /* offset 13782 */ + "\x98\xfc\0\0" /* offset 13786 */ + "\x99\x28\0\0" /* offset 13790 */ + "\x9d\xb4\0\0" /* offset 13794 */ + "\x4f\xae\0\0" /* offset 13798 */ + "\x50\xe7\0\0" /* offset 13802 */ + "\x51\x4d\0\0" /* offset 13806 */ + "\x52\xc9\0\0" /* offset 13810 */ + "\x52\xe4\0\0" /* offset 13814 */ + "\x53\x51\0\0" /* offset 13818 */ + "\x55\x9d\0\0" /* offset 13822 */ + "\x56\x06\0\0" /* offset 13826 */ + "\x56\x68\0\0" /* offset 13830 */ + "\x58\x40\0\0" /* offset 13834 */ + "\x58\xa8\0\0" /* offset 13838 */ + "\x5c\x64\0\0" /* offset 13842 */ + "\x60\x94\0\0" /* offset 13846 */ + "\x61\x68\0\0" /* offset 13850 */ + "\x61\x8e\0\0" /* offset 13854 */ + "\x61\xf2\0\0" /* offset 13858 */ + "\x65\x4f\0\0" /* offset 13862 */ + "\x65\xe2\0\0" /* offset 13866 */ + "\x66\x91\0\0" /* offset 13870 */ + "\x68\x85\0\0" /* offset 13874 */ + "\x6d\x77\0\0" /* offset 13878 */ + "\x6e\x1a\0\0" /* offset 13882 */ + "\x6f\x22\0\0" /* offset 13886 */ + "\x71\x6e\0\0" /* offset 13890 */ + "\x72\x2b\0\0" /* offset 13894 */ + "\x74\x22\0\0" /* offset 13898 */ + "\x78\x91\0\0" /* offset 13902 */ + "\x79\x49\0\0" /* offset 13906 */ + "\x79\x48\0\0" /* offset 13910 */ + "\x79\x50\0\0" /* offset 13914 */ + "\x79\x56\0\0" /* offset 13918 */ + "\x79\x8d\0\0" /* offset 13922 */ + "\x79\x8e\0\0" /* offset 13926 */ + "\x7a\x40\0\0" /* offset 13930 */ + "\x7a\x81\0\0" /* offset 13934 */ + "\x7b\xc0\0\0" /* offset 13938 */ + "\x7e\x09\0\0" /* offset 13942 */ + "\x7e\x41\0\0" /* offset 13946 */ + "\x7f\x72\0\0" /* offset 13950 */ + "\x80\x05\0\0" /* offset 13954 */ + "\x81\xed\0\0" /* offset 13958 */ + "\x82\x79\0\0" /* offset 13962 */ + "\x84\x57\0\0" /* offset 13966 */ + "\x89\x10\0\0" /* offset 13970 */ + "\x89\x96\0\0" /* offset 13974 */ + "\x8b\x01\0\0" /* offset 13978 */ + "\x8b\x39\0\0" /* offset 13982 */ + "\x8c\xd3\0\0" /* offset 13986 */ + "\x8d\x08\0\0" /* offset 13990 */ + "\x8f\xb6\0\0" /* offset 13994 */ + "\x96\xe3\0\0" /* offset 13998 */ + "\x97\xff\0\0" /* offset 14002 */ + "\x98\x3b\0\0" /* offset 14006 */ + "\x00\x66\x00\x66\0\0" /* offset 14010 */ + "\x00\x66\x00\x69\0\0" /* offset 14016 */ + "\x00\x66\x00\x6c\0\0" /* offset 14022 */ + "\x00\x66\x00\x66\x00\x69\0\0" /* offset 14028 */ + "\x00\x66\x00\x66\x00\x6c\0\0" /* offset 14036 */ + "\x00\x73\x00\x74\0\0" /* offset 14044 */ + "\x05\x74\x05\x76\0\0" /* offset 14050 */ + "\x05\x74\x05\x65\0\0" /* offset 14056 */ + "\x05\x74\x05\x6b\0\0" /* offset 14062 */ + "\x05\x7e\x05\x76\0\0" /* offset 14068 */ + "\x05\x74\x05\x6d\0\0" /* offset 14074 */ + "\x05\xd9\x05\xb4\0\0" /* offset 14080 */ + "\x05\xf2\x05\xb7\0\0" /* offset 14086 */ + "\x05\xe2\0\0" /* offset 14092 */ + "\x05\xd4\0\0" /* offset 14096 */ + "\x05\xdb\0\0" /* offset 14100 */ + "\x05\xdc\0\0" /* offset 14104 */ + "\x05\xdd\0\0" /* offset 14108 */ + "\x05\xe8\0\0" /* offset 14112 */ + "\x05\xea\0\0" /* offset 14116 */ + "\x05\xe9\x05\xc1\0\0" /* offset 14120 */ + "\x05\xe9\x05\xc2\0\0" /* offset 14126 */ + "\x05\xe9\x05\xbc\x05\xc1\0\0" /* offset 14132 */ + "\x05\xe9\x05\xbc\x05\xc2\0\0" /* offset 14140 */ + "\x05\xd0\x05\xb7\0\0" /* offset 14148 */ + "\x05\xd0\x05\xb8\0\0" /* offset 14154 */ + "\x05\xd0\x05\xbc\0\0" /* offset 14160 */ + "\x05\xd1\x05\xbc\0\0" /* offset 14166 */ + "\x05\xd2\x05\xbc\0\0" /* offset 14172 */ + "\x05\xd3\x05\xbc\0\0" /* offset 14178 */ + "\x05\xd4\x05\xbc\0\0" /* offset 14184 */ + "\x05\xd5\x05\xbc\0\0" /* offset 14190 */ + "\x05\xd6\x05\xbc\0\0" /* offset 14196 */ + "\x05\xd8\x05\xbc\0\0" /* offset 14202 */ + "\x05\xd9\x05\xbc\0\0" /* offset 14208 */ + "\x05\xda\x05\xbc\0\0" /* offset 14214 */ + "\x05\xdb\x05\xbc\0\0" /* offset 14220 */ + "\x05\xdc\x05\xbc\0\0" /* offset 14226 */ + "\x05\xde\x05\xbc\0\0" /* offset 14232 */ + "\x05\xe0\x05\xbc\0\0" /* offset 14238 */ + "\x05\xe1\x05\xbc\0\0" /* offset 14244 */ + "\x05\xe3\x05\xbc\0\0" /* offset 14250 */ + "\x05\xe4\x05\xbc\0\0" /* offset 14256 */ + "\x05\xe6\x05\xbc\0\0" /* offset 14262 */ + "\x05\xe7\x05\xbc\0\0" /* offset 14268 */ + "\x05\xe8\x05\xbc\0\0" /* offset 14274 */ + "\x05\xe9\x05\xbc\0\0" /* offset 14280 */ + "\x05\xea\x05\xbc\0\0" /* offset 14286 */ + "\x05\xd5\x05\xb9\0\0" /* offset 14292 */ + "\x05\xd1\x05\xbf\0\0" /* offset 14298 */ + "\x05\xdb\x05\xbf\0\0" /* offset 14304 */ + "\x05\xe4\x05\xbf\0\0" /* offset 14310 */ + "\x05\xd0\x05\xdc\0\0" /* offset 14316 */ + "\x06\x71\0\0" /* offset 14322 */ + "\x06\x7b\0\0" /* offset 14326 */ + "\x06\x7e\0\0" /* offset 14330 */ + "\x06\x80\0\0" /* offset 14334 */ + "\x06\x7a\0\0" /* offset 14338 */ + "\x06\x7f\0\0" /* offset 14342 */ + "\x06\x79\0\0" /* offset 14346 */ + "\x06\xa4\0\0" /* offset 14350 */ + "\x06\xa6\0\0" /* offset 14354 */ + "\x06\x84\0\0" /* offset 14358 */ + "\x06\x83\0\0" /* offset 14362 */ + "\x06\x86\0\0" /* offset 14366 */ + "\x06\x87\0\0" /* offset 14370 */ + "\x06\x8d\0\0" /* offset 14374 */ + "\x06\x8c\0\0" /* offset 14378 */ + "\x06\x8e\0\0" /* offset 14382 */ + "\x06\x88\0\0" /* offset 14386 */ + "\x06\x98\0\0" /* offset 14390 */ + "\x06\x91\0\0" /* offset 14394 */ + "\x06\xa9\0\0" /* offset 14398 */ + "\x06\xaf\0\0" /* offset 14402 */ + "\x06\xb3\0\0" /* offset 14406 */ + "\x06\xb1\0\0" /* offset 14410 */ + "\x06\xba\0\0" /* offset 14414 */ + "\x06\xbb\0\0" /* offset 14418 */ + "\x06\xc1\0\0" /* offset 14422 */ + "\x06\xbe\0\0" /* offset 14426 */ + "\x06\xd2\0\0" /* offset 14430 */ + "\x06\xad\0\0" /* offset 14434 */ + "\x06\xc7\0\0" /* offset 14438 */ + "\x06\xc6\0\0" /* offset 14442 */ + "\x06\xc8\0\0" /* offset 14446 */ + "\x06\xcb\0\0" /* offset 14450 */ + "\x06\xc5\0\0" /* offset 14454 */ + "\x06\xc9\0\0" /* offset 14458 */ + "\x06\xd0\0\0" /* offset 14462 */ + "\x06\x49\0\0" /* offset 14466 */ + "\x06\x4a\x06\x54\x06\x27\0\0" /* offset 14470 */ + "\x06\x4a\x06\x54\x06\xd5\0\0" /* offset 14478 */ + "\x06\x4a\x06\x54\x06\x48\0\0" /* offset 14486 */ + "\x06\x4a\x06\x54\x06\xc7\0\0" /* offset 14494 */ + "\x06\x4a\x06\x54\x06\xc6\0\0" /* offset 14502 */ + "\x06\x4a\x06\x54\x06\xc8\0\0" /* offset 14510 */ + "\x06\x4a\x06\x54\x06\xd0\0\0" /* offset 14518 */ + "\x06\x4a\x06\x54\x06\x49\0\0" /* offset 14526 */ + "\x06\xcc\0\0" /* offset 14534 */ + "\x06\x4a\x06\x54\x06\x2c\0\0" /* offset 14538 */ + "\x06\x4a\x06\x54\x06\x2d\0\0" /* offset 14546 */ + "\x06\x4a\x06\x54\x06\x45\0\0" /* offset 14554 */ + "\x06\x4a\x06\x54\x06\x4a\0\0" /* offset 14562 */ + "\x06\x28\x06\x2c\0\0" /* offset 14570 */ + "\x06\x28\x06\x2d\0\0" /* offset 14576 */ + "\x06\x28\x06\x2e\0\0" /* offset 14582 */ + "\x06\x28\x06\x45\0\0" /* offset 14588 */ + "\x06\x28\x06\x49\0\0" /* offset 14594 */ + "\x06\x28\x06\x4a\0\0" /* offset 14600 */ + "\x06\x2a\x06\x2c\0\0" /* offset 14606 */ + "\x06\x2a\x06\x2d\0\0" /* offset 14612 */ + "\x06\x2a\x06\x2e\0\0" /* offset 14618 */ + "\x06\x2a\x06\x45\0\0" /* offset 14624 */ + "\x06\x2a\x06\x49\0\0" /* offset 14630 */ + "\x06\x2a\x06\x4a\0\0" /* offset 14636 */ + "\x06\x2b\x06\x2c\0\0" /* offset 14642 */ + "\x06\x2b\x06\x45\0\0" /* offset 14648 */ + "\x06\x2b\x06\x49\0\0" /* offset 14654 */ + "\x06\x2b\x06\x4a\0\0" /* offset 14660 */ + "\x06\x2c\x06\x2d\0\0" /* offset 14666 */ + "\x06\x2c\x06\x45\0\0" /* offset 14672 */ + "\x06\x2d\x06\x2c\0\0" /* offset 14678 */ + "\x06\x2d\x06\x45\0\0" /* offset 14684 */ + "\x06\x2e\x06\x2c\0\0" /* offset 14690 */ + "\x06\x2e\x06\x2d\0\0" /* offset 14696 */ + "\x06\x2e\x06\x45\0\0" /* offset 14702 */ + "\x06\x33\x06\x2c\0\0" /* offset 14708 */ + "\x06\x33\x06\x2d\0\0" /* offset 14714 */ + "\x06\x33\x06\x2e\0\0" /* offset 14720 */ + "\x06\x33\x06\x45\0\0" /* offset 14726 */ + "\x06\x35\x06\x2d\0\0" /* offset 14732 */ + "\x06\x35\x06\x45\0\0" /* offset 14738 */ + "\x06\x36\x06\x2c\0\0" /* offset 14744 */ + "\x06\x36\x06\x2d\0\0" /* offset 14750 */ + "\x06\x36\x06\x2e\0\0" /* offset 14756 */ + "\x06\x36\x06\x45\0\0" /* offset 14762 */ + "\x06\x37\x06\x2d\0\0" /* offset 14768 */ + "\x06\x37\x06\x45\0\0" /* offset 14774 */ + "\x06\x38\x06\x45\0\0" /* offset 14780 */ + "\x06\x39\x06\x2c\0\0" /* offset 14786 */ + "\x06\x39\x06\x45\0\0" /* offset 14792 */ + "\x06\x3a\x06\x2c\0\0" /* offset 14798 */ + "\x06\x3a\x06\x45\0\0" /* offset 14804 */ + "\x06\x41\x06\x2c\0\0" /* offset 14810 */ + "\x06\x41\x06\x2d\0\0" /* offset 14816 */ + "\x06\x41\x06\x2e\0\0" /* offset 14822 */ + "\x06\x41\x06\x45\0\0" /* offset 14828 */ + "\x06\x41\x06\x49\0\0" /* offset 14834 */ + "\x06\x41\x06\x4a\0\0" /* offset 14840 */ + "\x06\x42\x06\x2d\0\0" /* offset 14846 */ + "\x06\x42\x06\x45\0\0" /* offset 14852 */ + "\x06\x42\x06\x49\0\0" /* offset 14858 */ + "\x06\x42\x06\x4a\0\0" /* offset 14864 */ + "\x06\x43\x06\x27\0\0" /* offset 14870 */ + "\x06\x43\x06\x2c\0\0" /* offset 14876 */ + "\x06\x43\x06\x2d\0\0" /* offset 14882 */ + "\x06\x43\x06\x2e\0\0" /* offset 14888 */ + "\x06\x43\x06\x44\0\0" /* offset 14894 */ + "\x06\x43\x06\x45\0\0" /* offset 14900 */ + "\x06\x43\x06\x49\0\0" /* offset 14906 */ + "\x06\x43\x06\x4a\0\0" /* offset 14912 */ + "\x06\x44\x06\x2c\0\0" /* offset 14918 */ + "\x06\x44\x06\x2d\0\0" /* offset 14924 */ + "\x06\x44\x06\x2e\0\0" /* offset 14930 */ + "\x06\x44\x06\x45\0\0" /* offset 14936 */ + "\x06\x44\x06\x49\0\0" /* offset 14942 */ + "\x06\x44\x06\x4a\0\0" /* offset 14948 */ + "\x06\x45\x06\x2c\0\0" /* offset 14954 */ + "\x06\x45\x06\x2d\0\0" /* offset 14960 */ + "\x06\x45\x06\x2e\0\0" /* offset 14966 */ + "\x06\x45\x06\x45\0\0" /* offset 14972 */ + "\x06\x45\x06\x49\0\0" /* offset 14978 */ + "\x06\x45\x06\x4a\0\0" /* offset 14984 */ + "\x06\x46\x06\x2c\0\0" /* offset 14990 */ + "\x06\x46\x06\x2d\0\0" /* offset 14996 */ + "\x06\x46\x06\x2e\0\0" /* offset 15002 */ + "\x06\x46\x06\x45\0\0" /* offset 15008 */ + "\x06\x46\x06\x49\0\0" /* offset 15014 */ + "\x06\x46\x06\x4a\0\0" /* offset 15020 */ + "\x06\x47\x06\x2c\0\0" /* offset 15026 */ + "\x06\x47\x06\x45\0\0" /* offset 15032 */ + "\x06\x47\x06\x49\0\0" /* offset 15038 */ + "\x06\x47\x06\x4a\0\0" /* offset 15044 */ + "\x06\x4a\x06\x2c\0\0" /* offset 15050 */ + "\x06\x4a\x06\x2d\0\0" /* offset 15056 */ + "\x06\x4a\x06\x2e\0\0" /* offset 15062 */ + "\x06\x4a\x06\x45\0\0" /* offset 15068 */ + "\x06\x4a\x06\x49\0\0" /* offset 15074 */ + "\x06\x4a\x06\x4a\0\0" /* offset 15080 */ + "\x06\x30\x06\x70\0\0" /* offset 15086 */ + "\x06\x31\x06\x70\0\0" /* offset 15092 */ + "\x06\x49\x06\x70\0\0" /* offset 15098 */ + "\x00\x20\x06\x4c\x06\x51\0\0" /* offset 15104 */ + "\x00\x20\x06\x4d\x06\x51\0\0" /* offset 15112 */ + "\x00\x20\x06\x4e\x06\x51\0\0" /* offset 15120 */ + "\x00\x20\x06\x4f\x06\x51\0\0" /* offset 15128 */ + "\x00\x20\x06\x50\x06\x51\0\0" /* offset 15136 */ + "\x00\x20\x06\x51\x06\x70\0\0" /* offset 15144 */ + "\x06\x4a\x06\x54\x06\x31\0\0" /* offset 15152 */ + "\x06\x4a\x06\x54\x06\x32\0\0" /* offset 15160 */ + "\x06\x4a\x06\x54\x06\x46\0\0" /* offset 15168 */ + "\x06\x28\x06\x31\0\0" /* offset 15176 */ + "\x06\x28\x06\x32\0\0" /* offset 15182 */ + "\x06\x28\x06\x46\0\0" /* offset 15188 */ + "\x06\x2a\x06\x31\0\0" /* offset 15194 */ + "\x06\x2a\x06\x32\0\0" /* offset 15200 */ + "\x06\x2a\x06\x46\0\0" /* offset 15206 */ + "\x06\x2b\x06\x31\0\0" /* offset 15212 */ + "\x06\x2b\x06\x32\0\0" /* offset 15218 */ + "\x06\x2b\x06\x46\0\0" /* offset 15224 */ + "\x06\x45\x06\x27\0\0" /* offset 15230 */ + "\x06\x46\x06\x31\0\0" /* offset 15236 */ + "\x06\x46\x06\x32\0\0" /* offset 15242 */ + "\x06\x46\x06\x46\0\0" /* offset 15248 */ + "\x06\x4a\x06\x31\0\0" /* offset 15254 */ + "\x06\x4a\x06\x32\0\0" /* offset 15260 */ + "\x06\x4a\x06\x46\0\0" /* offset 15266 */ + "\x06\x4a\x06\x54\x06\x2e\0\0" /* offset 15272 */ + "\x06\x4a\x06\x54\x06\x47\0\0" /* offset 15280 */ + "\x06\x28\x06\x47\0\0" /* offset 15288 */ + "\x06\x2a\x06\x47\0\0" /* offset 15294 */ + "\x06\x35\x06\x2e\0\0" /* offset 15300 */ + "\x06\x44\x06\x47\0\0" /* offset 15306 */ + "\x06\x46\x06\x47\0\0" /* offset 15312 */ + "\x06\x47\x06\x70\0\0" /* offset 15318 */ + "\x06\x4a\x06\x47\0\0" /* offset 15324 */ + "\x06\x2b\x06\x47\0\0" /* offset 15330 */ + "\x06\x33\x06\x47\0\0" /* offset 15336 */ + "\x06\x34\x06\x45\0\0" /* offset 15342 */ + "\x06\x34\x06\x47\0\0" /* offset 15348 */ + "\x06\x40\x06\x4e\x06\x51\0\0" /* offset 15354 */ + "\x06\x40\x06\x4f\x06\x51\0\0" /* offset 15362 */ + "\x06\x40\x06\x50\x06\x51\0\0" /* offset 15370 */ + "\x06\x37\x06\x49\0\0" /* offset 15378 */ + "\x06\x37\x06\x4a\0\0" /* offset 15384 */ + "\x06\x39\x06\x49\0\0" /* offset 15390 */ + "\x06\x39\x06\x4a\0\0" /* offset 15396 */ + "\x06\x3a\x06\x49\0\0" /* offset 15402 */ + "\x06\x3a\x06\x4a\0\0" /* offset 15408 */ + "\x06\x33\x06\x49\0\0" /* offset 15414 */ + "\x06\x33\x06\x4a\0\0" /* offset 15420 */ + "\x06\x34\x06\x49\0\0" /* offset 15426 */ + "\x06\x34\x06\x4a\0\0" /* offset 15432 */ + "\x06\x2d\x06\x49\0\0" /* offset 15438 */ + "\x06\x2d\x06\x4a\0\0" /* offset 15444 */ + "\x06\x2c\x06\x49\0\0" /* offset 15450 */ + "\x06\x2c\x06\x4a\0\0" /* offset 15456 */ + "\x06\x2e\x06\x49\0\0" /* offset 15462 */ + "\x06\x2e\x06\x4a\0\0" /* offset 15468 */ + "\x06\x35\x06\x49\0\0" /* offset 15474 */ + "\x06\x35\x06\x4a\0\0" /* offset 15480 */ + "\x06\x36\x06\x49\0\0" /* offset 15486 */ + "\x06\x36\x06\x4a\0\0" /* offset 15492 */ + "\x06\x34\x06\x2c\0\0" /* offset 15498 */ + "\x06\x34\x06\x2d\0\0" /* offset 15504 */ + "\x06\x34\x06\x2e\0\0" /* offset 15510 */ + "\x06\x34\x06\x31\0\0" /* offset 15516 */ + "\x06\x33\x06\x31\0\0" /* offset 15522 */ + "\x06\x35\x06\x31\0\0" /* offset 15528 */ + "\x06\x36\x06\x31\0\0" /* offset 15534 */ + "\x06\x27\x06\x4b\0\0" /* offset 15540 */ + "\x06\x2a\x06\x2c\x06\x45\0\0" /* offset 15546 */ + "\x06\x2a\x06\x2d\x06\x2c\0\0" /* offset 15554 */ + "\x06\x2a\x06\x2d\x06\x45\0\0" /* offset 15562 */ + "\x06\x2a\x06\x2e\x06\x45\0\0" /* offset 15570 */ + "\x06\x2a\x06\x45\x06\x2c\0\0" /* offset 15578 */ + "\x06\x2a\x06\x45\x06\x2d\0\0" /* offset 15586 */ + "\x06\x2a\x06\x45\x06\x2e\0\0" /* offset 15594 */ + "\x06\x2c\x06\x45\x06\x2d\0\0" /* offset 15602 */ + "\x06\x2d\x06\x45\x06\x4a\0\0" /* offset 15610 */ + "\x06\x2d\x06\x45\x06\x49\0\0" /* offset 15618 */ + "\x06\x33\x06\x2d\x06\x2c\0\0" /* offset 15626 */ + "\x06\x33\x06\x2c\x06\x2d\0\0" /* offset 15634 */ + "\x06\x33\x06\x2c\x06\x49\0\0" /* offset 15642 */ + "\x06\x33\x06\x45\x06\x2d\0\0" /* offset 15650 */ + "\x06\x33\x06\x45\x06\x2c\0\0" /* offset 15658 */ + "\x06\x33\x06\x45\x06\x45\0\0" /* offset 15666 */ + "\x06\x35\x06\x2d\x06\x2d\0\0" /* offset 15674 */ + "\x06\x35\x06\x45\x06\x45\0\0" /* offset 15682 */ + "\x06\x34\x06\x2d\x06\x45\0\0" /* offset 15690 */ + "\x06\x34\x06\x2c\x06\x4a\0\0" /* offset 15698 */ + "\x06\x34\x06\x45\x06\x2e\0\0" /* offset 15706 */ + "\x06\x34\x06\x45\x06\x45\0\0" /* offset 15714 */ + "\x06\x36\x06\x2d\x06\x49\0\0" /* offset 15722 */ + "\x06\x36\x06\x2e\x06\x45\0\0" /* offset 15730 */ + "\x06\x37\x06\x45\x06\x2d\0\0" /* offset 15738 */ + "\x06\x37\x06\x45\x06\x45\0\0" /* offset 15746 */ + "\x06\x37\x06\x45\x06\x4a\0\0" /* offset 15754 */ + "\x06\x39\x06\x2c\x06\x45\0\0" /* offset 15762 */ + "\x06\x39\x06\x45\x06\x45\0\0" /* offset 15770 */ + "\x06\x39\x06\x45\x06\x49\0\0" /* offset 15778 */ + "\x06\x3a\x06\x45\x06\x45\0\0" /* offset 15786 */ + "\x06\x3a\x06\x45\x06\x4a\0\0" /* offset 15794 */ + "\x06\x3a\x06\x45\x06\x49\0\0" /* offset 15802 */ + "\x06\x41\x06\x2e\x06\x45\0\0" /* offset 15810 */ + "\x06\x42\x06\x45\x06\x2d\0\0" /* offset 15818 */ + "\x06\x42\x06\x45\x06\x45\0\0" /* offset 15826 */ + "\x06\x44\x06\x2d\x06\x45\0\0" /* offset 15834 */ + "\x06\x44\x06\x2d\x06\x4a\0\0" /* offset 15842 */ + "\x06\x44\x06\x2d\x06\x49\0\0" /* offset 15850 */ + "\x06\x44\x06\x2c\x06\x2c\0\0" /* offset 15858 */ + "\x06\x44\x06\x2e\x06\x45\0\0" /* offset 15866 */ + "\x06\x44\x06\x45\x06\x2d\0\0" /* offset 15874 */ + "\x06\x45\x06\x2d\x06\x2c\0\0" /* offset 15882 */ + "\x06\x45\x06\x2d\x06\x45\0\0" /* offset 15890 */ + "\x06\x45\x06\x2d\x06\x4a\0\0" /* offset 15898 */ + "\x06\x45\x06\x2c\x06\x2d\0\0" /* offset 15906 */ + "\x06\x45\x06\x2c\x06\x45\0\0" /* offset 15914 */ + "\x06\x45\x06\x2e\x06\x2c\0\0" /* offset 15922 */ + "\x06\x45\x06\x2e\x06\x45\0\0" /* offset 15930 */ + "\x06\x45\x06\x2c\x06\x2e\0\0" /* offset 15938 */ + "\x06\x47\x06\x45\x06\x2c\0\0" /* offset 15946 */ + "\x06\x47\x06\x45\x06\x45\0\0" /* offset 15954 */ + "\x06\x46\x06\x2d\x06\x45\0\0" /* offset 15962 */ + "\x06\x46\x06\x2d\x06\x49\0\0" /* offset 15970 */ + "\x06\x46\x06\x2c\x06\x45\0\0" /* offset 15978 */ + "\x06\x46\x06\x2c\x06\x49\0\0" /* offset 15986 */ + "\x06\x46\x06\x45\x06\x4a\0\0" /* offset 15994 */ + "\x06\x46\x06\x45\x06\x49\0\0" /* offset 16002 */ + "\x06\x4a\x06\x45\x06\x45\0\0" /* offset 16010 */ + "\x06\x28\x06\x2e\x06\x4a\0\0" /* offset 16018 */ + "\x06\x2a\x06\x2c\x06\x4a\0\0" /* offset 16026 */ + "\x06\x2a\x06\x2c\x06\x49\0\0" /* offset 16034 */ + "\x06\x2a\x06\x2e\x06\x4a\0\0" /* offset 16042 */ + "\x06\x2a\x06\x2e\x06\x49\0\0" /* offset 16050 */ + "\x06\x2a\x06\x45\x06\x4a\0\0" /* offset 16058 */ + "\x06\x2a\x06\x45\x06\x49\0\0" /* offset 16066 */ + "\x06\x2c\x06\x45\x06\x4a\0\0" /* offset 16074 */ + "\x06\x2c\x06\x2d\x06\x49\0\0" /* offset 16082 */ + "\x06\x2c\x06\x45\x06\x49\0\0" /* offset 16090 */ + "\x06\x33\x06\x2e\x06\x49\0\0" /* offset 16098 */ + "\x06\x35\x06\x2d\x06\x4a\0\0" /* offset 16106 */ + "\x06\x34\x06\x2d\x06\x4a\0\0" /* offset 16114 */ + "\x06\x36\x06\x2d\x06\x4a\0\0" /* offset 16122 */ + "\x06\x44\x06\x2c\x06\x4a\0\0" /* offset 16130 */ + "\x06\x44\x06\x45\x06\x4a\0\0" /* offset 16138 */ + "\x06\x4a\x06\x2d\x06\x4a\0\0" /* offset 16146 */ + "\x06\x4a\x06\x2c\x06\x4a\0\0" /* offset 16154 */ + "\x06\x4a\x06\x45\x06\x4a\0\0" /* offset 16162 */ + "\x06\x45\x06\x45\x06\x4a\0\0" /* offset 16170 */ + "\x06\x42\x06\x45\x06\x4a\0\0" /* offset 16178 */ + "\x06\x46\x06\x2d\x06\x4a\0\0" /* offset 16186 */ + "\x06\x39\x06\x45\x06\x4a\0\0" /* offset 16194 */ + "\x06\x43\x06\x45\x06\x4a\0\0" /* offset 16202 */ + "\x06\x46\x06\x2c\x06\x2d\0\0" /* offset 16210 */ + "\x06\x45\x06\x2e\x06\x4a\0\0" /* offset 16218 */ + "\x06\x44\x06\x2c\x06\x45\0\0" /* offset 16226 */ + "\x06\x43\x06\x45\x06\x45\0\0" /* offset 16234 */ + "\x06\x2c\x06\x2d\x06\x4a\0\0" /* offset 16242 */ + "\x06\x2d\x06\x2c\x06\x4a\0\0" /* offset 16250 */ + "\x06\x45\x06\x2c\x06\x4a\0\0" /* offset 16258 */ + "\x06\x41\x06\x45\x06\x4a\0\0" /* offset 16266 */ + "\x06\x28\x06\x2d\x06\x4a\0\0" /* offset 16274 */ + "\x06\x33\x06\x2e\x06\x4a\0\0" /* offset 16282 */ + "\x06\x46\x06\x2c\x06\x4a\0\0" /* offset 16290 */ + "\x06\x35\x06\x44\x06\xd2\0\0" /* offset 16298 */ + "\x06\x42\x06\x44\x06\xd2\0\0" /* offset 16306 */ + "\x06\x27\x06\x44\x06\x44\x06\x47\0\0" /* offset 16314 */ + "\x06\x27\x06\x43\x06\x28\x06\x31\0\0" /* offset 16324 */ + "\x06\x45\x06\x2d\x06\x45\x06\x2f\0\0" /* offset 16334 */ + "\x06\x35\x06\x44\x06\x39\x06\x45\0\0" /* offset 16344 */ + "\x06\x31\x06\x33\x06\x48\x06\x44\0\0" /* offset 16354 */ + "\x06\x39\x06\x44\x06\x4a\x06\x47\0\0" /* offset 16364 */ + "\x06\x48\x06\x33\x06\x44\x06\x45\0\0" /* offset 16374 */ + "\x06\x35\x06\x44\x06\x49\0\0" /* offset 16384 */ + "\x06\x35\x06\x44\x06\x49\x00\x20\x06\x27\x06\x44\x06\x44\x06\x47\x00\x20\x06\x39\x06\x44\x06\x4a\x06\x47\x00\x20\x06\x48\x06\x33\x06\x44\x06\x45\0\0" /* offset 16392 */ + "\x06\x2c\x06\x44\x00\x20\x06\x2c\x06\x44\x06\x27\x06\x44\x06\x47\0\0" /* offset 16430 */ + "\x06\x31\x06\xcc\x06\x27\x06\x44\0\0" /* offset 16448 */ + "\x20\x14\0\0" /* offset 16458 */ + "\x20\x13\0\0" /* offset 16462 */ + "\x00\x5f\0\0" /* offset 16466 */ + "\x00\x7b\0\0" /* offset 16470 */ + "\x00\x7d\0\0" /* offset 16474 */ + "\x30\x14\0\0" /* offset 16478 */ + "\x30\x15\0\0" /* offset 16482 */ + "\x30\x10\0\0" /* offset 16486 */ + "\x30\x11\0\0" /* offset 16490 */ + "\x30\x0a\0\0" /* offset 16494 */ + "\x30\x0b\0\0" /* offset 16498 */ + "\x30\x0c\0\0" /* offset 16502 */ + "\x30\x0d\0\0" /* offset 16506 */ + "\x30\x0e\0\0" /* offset 16510 */ + "\x30\x0f\0\0" /* offset 16514 */ + "\x00\x2c\0\0" /* offset 16518 */ + "\x30\x01\0\0" /* offset 16522 */ + "\x00\x3a\0\0" /* offset 16526 */ + "\x00\x3f\0\0" /* offset 16530 */ + "\x00\x21\0\0" /* offset 16534 */ + "\x00\x23\0\0" /* offset 16538 */ + "\x00\x26\0\0" /* offset 16542 */ + "\x00\x2a\0\0" /* offset 16546 */ + "\x00\x2d\0\0" /* offset 16550 */ + "\x00\x3c\0\0" /* offset 16554 */ + "\x00\x3e\0\0" /* offset 16558 */ + "\x00\x5c\0\0" /* offset 16562 */ + "\x00\x24\0\0" /* offset 16566 */ + "\x00\x25\0\0" /* offset 16570 */ + "\x00\x40\0\0" /* offset 16574 */ + "\x00\x20\x06\x4b\0\0" /* offset 16578 */ + "\x06\x40\x06\x4b\0\0" /* offset 16584 */ + "\x00\x20\x06\x4c\0\0" /* offset 16590 */ + "\x00\x20\x06\x4d\0\0" /* offset 16596 */ + "\x00\x20\x06\x4e\0\0" /* offset 16602 */ + "\x06\x40\x06\x4e\0\0" /* offset 16608 */ + "\x00\x20\x06\x4f\0\0" /* offset 16614 */ + "\x06\x40\x06\x4f\0\0" /* offset 16620 */ + "\x00\x20\x06\x50\0\0" /* offset 16626 */ + "\x06\x40\x06\x50\0\0" /* offset 16632 */ + "\x00\x20\x06\x51\0\0" /* offset 16638 */ + "\x06\x40\x06\x51\0\0" /* offset 16644 */ + "\x00\x20\x06\x52\0\0" /* offset 16650 */ + "\x06\x40\x06\x52\0\0" /* offset 16656 */ + "\x06\x21\0\0" /* offset 16662 */ + "\x06\x27\0\0" /* offset 16666 */ + "\x06\x28\0\0" /* offset 16670 */ + "\x06\x29\0\0" /* offset 16674 */ + "\x06\x2a\0\0" /* offset 16678 */ + "\x06\x2b\0\0" /* offset 16682 */ + "\x06\x2c\0\0" /* offset 16686 */ + "\x06\x2d\0\0" /* offset 16690 */ + "\x06\x2e\0\0" /* offset 16694 */ + "\x06\x2f\0\0" /* offset 16698 */ + "\x06\x30\0\0" /* offset 16702 */ + "\x06\x31\0\0" /* offset 16706 */ + "\x06\x32\0\0" /* offset 16710 */ + "\x06\x33\0\0" /* offset 16714 */ + "\x06\x34\0\0" /* offset 16718 */ + "\x06\x35\0\0" /* offset 16722 */ + "\x06\x36\0\0" /* offset 16726 */ + "\x06\x37\0\0" /* offset 16730 */ + "\x06\x38\0\0" /* offset 16734 */ + "\x06\x39\0\0" /* offset 16738 */ + "\x06\x3a\0\0" /* offset 16742 */ + "\x06\x41\0\0" /* offset 16746 */ + "\x06\x42\0\0" /* offset 16750 */ + "\x06\x43\0\0" /* offset 16754 */ + "\x06\x44\0\0" /* offset 16758 */ + "\x06\x45\0\0" /* offset 16762 */ + "\x06\x46\0\0" /* offset 16766 */ + "\x06\x47\0\0" /* offset 16770 */ + "\x06\x48\0\0" /* offset 16774 */ + "\x06\x4a\0\0" /* offset 16778 */ + "\x06\x44\x06\x27\x06\x53\0\0" /* offset 16782 */ + "\x06\x44\x06\x27\x06\x54\0\0" /* offset 16790 */ + "\x06\x44\x06\x27\x06\x55\0\0" /* offset 16798 */ + "\x06\x44\x06\x27\0\0" /* offset 16806 */ + "\x00\x22\0\0" /* offset 16812 */ + "\x00\x27\0\0" /* offset 16816 */ + "\x00\x2f\0\0" /* offset 16820 */ + "\x00\x5b\0\0" /* offset 16824 */ + "\x00\x5d\0\0" /* offset 16828 */ + "\x00\x5e\0\0" /* offset 16832 */ + "\x00\x7c\0\0" /* offset 16836 */ + "\x00\x7e\0\0" /* offset 16840 */ + "\x29\x85\0\0" /* offset 16844 */ + "\x29\x86\0\0" /* offset 16848 */ + "\x30\x02\0\0" /* offset 16852 */ + "\x30\xfb\0\0" /* offset 16856 */ + "\x30\xa1\0\0" /* offset 16860 */ + "\x30\xa3\0\0" /* offset 16864 */ + "\x30\xa5\0\0" /* offset 16868 */ + "\x30\xa7\0\0" /* offset 16872 */ + "\x30\xa9\0\0" /* offset 16876 */ + "\x30\xe3\0\0" /* offset 16880 */ + "\x30\xe5\0\0" /* offset 16884 */ + "\x30\xe7\0\0" /* offset 16888 */ + "\x30\xc3\0\0" /* offset 16892 */ + "\x30\xfc\0\0" /* offset 16896 */ + "\x30\xf3\0\0" /* offset 16900 */ + "\x30\x99\0\0" /* offset 16904 */ + "\x30\x9a\0\0" /* offset 16908 */ + "\x00\xa2\0\0" /* offset 16912 */ + "\x00\xa3\0\0" /* offset 16916 */ + "\x00\xac\0\0" /* offset 16920 */ + "\x00\xa6\0\0" /* offset 16924 */ + "\x00\xa5\0\0" /* offset 16928 */ + "\x20\xa9\0\0" /* offset 16932 */ + "\x25\x02\0\0" /* offset 16936 */ + "\x21\x90\0\0" /* offset 16940 */ + "\x21\x91\0\0" /* offset 16944 */ + "\x21\x92\0\0" /* offset 16948 */ + "\x21\x93\0\0" /* offset 16952 */ + "\x25\xa0\0\0" /* offset 16956 */ + "\x25\xcb\0\0" /* offset 16960 */; + +#endif /* DECOMP_H */ diff --git a/lib/hexdump.c b/lib/hexdump.c new file mode 100644 index 0000000..1714d27 --- /dev/null +++ b/lib/hexdump.c @@ -0,0 +1,42 @@ +/* hexdump.c hexdump buffer + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" + +/** + * gsasl_hexdump: + * @fh: file handle + * @buffer: input byte array + * @len: size of input byte array + * + * Print a byte array to given file handle, mostly for debugging purposes. + **/ +void +gsasl_hexdump (FILE *fh, const char *buffer, size_t len) +{ + int i; + + for (i=0; i < len; i++) + { + fprintf(fh, _("%d: hex %02X dec %d ascii %c\n"), + i, buffer[i], buffer[i], buffer[i]); + } +} diff --git a/lib/init.c b/lib/init.c new file mode 100644 index 0000000..fc62397 --- /dev/null +++ b/lib/init.c @@ -0,0 +1,120 @@ +/* init.c entry point for libgsasl + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" + +#if ENABLE_NLS +char * +_gsasl_gettext (const char *str) +{ + return dgettext (PACKAGE, str); +} + +void +_gsasl_gettext_init () +{ + bindtextdomain(PACKAGE, LOCALEDIR); +#ifdef HAVE_BIND_TEXTDOMAIN_CODESET + bind_textdomain_codeset (PACKAGE, "UTF-8"); +#endif + textdomain (PACKAGE); +} +#endif /* ENABLE_NLS */ + +/** + * gsasl_init: + * @ctx: pointer to libgsasl handle. + * + * This functions initializes libgsasl. The handle pointed to by ctx + * is valid for use with other libgsasl functions iff this function is + * successful. + * + * Return value: GSASL_OK iff successful, otherwise GSASL_MALLOC_ERROR. + **/ +int +gsasl_init (Gsasl_ctx **ctx) +{ + int i; + +#if ENABLE_NLS + _gsasl_gettext_init(); +#endif + + *ctx = (Gsasl_ctx*) malloc(sizeof(**ctx)); + if (*ctx == NULL) + return GSASL_MALLOC_ERROR; + + memset(*ctx, 0, sizeof(**ctx)); + + i = 0; + while (_gsasl_all_mechanisms[i].name) + { + if (_gsasl_all_mechanisms[i].client.init && + _gsasl_all_mechanisms[i].client.init(*ctx) == GSASL_OK) + { + if ((*ctx)->client_mechs) + (*ctx)->client_mechs = (_Gsasl_mechanism*) + realloc ((*ctx)->client_mechs, + sizeof(*(*ctx)->client_mechs) * + ((*ctx)->n_client_mechs + 1)); + else + (*ctx)->client_mechs = (_Gsasl_mechanism*) + malloc (sizeof(*(*ctx)->client_mechs)); + + if ((*ctx)->client_mechs == NULL) + { + gsasl_done(*ctx); + return GSASL_MALLOC_ERROR; + } + + (*ctx)->client_mechs[(*ctx)->n_client_mechs] = + _gsasl_all_mechanisms[i]; + (*ctx)->n_client_mechs++; + } + + if (_gsasl_all_mechanisms[i].server.init && + _gsasl_all_mechanisms[i].server.init(*ctx) == GSASL_OK) + { + if ((*ctx)->server_mechs) + (*ctx)->server_mechs = (_Gsasl_mechanism*) + realloc ((*ctx)->server_mechs, + sizeof(*(*ctx)->server_mechs) * + ((*ctx)->n_server_mechs + 1)); + else + (*ctx)->server_mechs = (_Gsasl_mechanism*) + malloc (sizeof(*(*ctx)->server_mechs)); + + if ((*ctx)->server_mechs == NULL) + { + gsasl_done(*ctx); + return GSASL_MALLOC_ERROR; + } + + (*ctx)->server_mechs[(*ctx)->n_server_mechs] = + _gsasl_all_mechanisms[i]; + (*ctx)->n_server_mechs++; + } + + i++; + } + + return GSASL_OK; +} diff --git a/lib/internal.h b/lib/internal.h new file mode 100644 index 0000000..4b418be --- /dev/null +++ b/lib/internal.h @@ -0,0 +1,105 @@ +/* internal.h internal header file for libgsasl + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _INTERNAL_H +#define _INTERNAL_H + +#include <stdlib.h> +#include <ctype.h> +#include <string.h> + +#include "config.h" +#include "gsasl.h" +#include "gettext.h" + +#ifdef ENABLE_NLS +extern char *_gsasl_gettext (const char *str); +#define _(String) _gsasl_gettext (String) +#define gettext_noop(String) String +#define N_(String) gettext_noop (String) +#endif + +#define HEXCHAR(c) ((c & 0x0F) > 9 ? 'a' + (c & 0x0F) - 10 : '0' + (c & 0x0F)) +#define MIN(a,b) ((a) < (b) ? (a) : (b)) + +struct _Gsasl_mechanism_functions { + int (*init) (Gsasl_ctx *ctx); + void (*done) (Gsasl_ctx *ctx); + int (*start) (Gsasl_session_ctx *cctx, + void **mech_data); + int (*step) (Gsasl_session_ctx *cctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len); + int (*finish) (Gsasl_session_ctx *cctx, + void *mech_data); +}; + +struct _Gsasl_mechanism { + char *name; + + struct _Gsasl_mechanism_functions client; + struct _Gsasl_mechanism_functions server; +}; +typedef struct _Gsasl_mechanism _Gsasl_mechanism; + +extern _Gsasl_mechanism _gsasl_all_mechanisms[]; + +struct Gsasl_ctx { + size_t n_client_mechs; + _Gsasl_mechanism *client_mechs; + size_t n_server_mechs; + _Gsasl_mechanism *server_mechs; + void *application_data; + Gsasl_client_callback_authorization_id cbc_authorization_id; + Gsasl_client_callback_authentication_id cbc_authentication_id; + Gsasl_client_callback_password cbc_password; + Gsasl_client_callback_passcode cbc_passcode; + Gsasl_client_callback_pin cbc_pin; + Gsasl_client_callback_anonymous cbc_anonymous; + Gsasl_client_callback_qop cbc_qop; + Gsasl_client_callback_maxbuf cbc_maxbuf; + Gsasl_client_callback_service cbc_service; + Gsasl_server_callback_validate cbs_validate; + Gsasl_server_callback_securid cbs_securid; + Gsasl_server_callback_retrieve cbs_retrieve; + Gsasl_server_callback_cram_md5 cbs_cram_md5; + Gsasl_server_callback_digest_md5 cbs_digest_md5; + Gsasl_server_callback_external cbs_external; + Gsasl_server_callback_anonymous cbs_anonymous; + Gsasl_server_callback_realm cbs_realm; + Gsasl_server_callback_qop cbs_qop; + Gsasl_server_callback_maxbuf cbs_maxbuf; + Gsasl_server_callback_cipher cbs_cipher; + Gsasl_server_callback_service cbs_service; + Gsasl_server_callback_gssapi cbs_gssapi; +}; + +struct Gsasl_session_ctx { + Gsasl_ctx *ctx; + _Gsasl_mechanism *mech; + void *application_data; + void *mech_data; +}; + +#endif /* _INTERNAL_H */ diff --git a/lib/listmech.c b/lib/listmech.c new file mode 100644 index 0000000..03006b4 --- /dev/null +++ b/lib/listmech.c @@ -0,0 +1,107 @@ +/* listmech.c list active client and server mechanisms + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" + +static int +_gsasl_listmech (Gsasl_ctx *ctx, + _Gsasl_mechanism *mechs, + size_t n_mechs, + char *out, + size_t *outlen, + int clientp) +{ + Gsasl_session_ctx *xctx; + void *mech_data; + int i = 0; + + if (out == NULL) + { + *outlen = n_mechs * GSASL_MAX_MECHANISM_SIZE; + return GSASL_OK; + } + + if (outlen == NULL || *outlen == 0) + return GSASL_TOO_SMALL_BUFFER; + + *out = '\0'; + for (i = 0; i < n_mechs; i++) + { + if ((clientp && + gsasl_client_start (ctx, mechs[i].name, &xctx) == GSASL_OK) || + (!clientp && + gsasl_server_start (ctx, mechs[i].name, &xctx) == GSASL_OK)) + { + if (clientp) + gsasl_client_finish (xctx); + else + gsasl_server_finish (xctx); + + if (strlen(out) + strlen(mechs[i].name) + strlen(" ") >= *outlen) + return GSASL_TOO_SMALL_BUFFER; + + strcat(out, mechs[i].name); + strcat(out, " "); + } + } + + return GSASL_OK; +} + +/** + * gsasl_client_listmech: + * @ctx: libgsasl handle. + * @out: output character array. + * @outlen: input maximum size of output character array, on output + * contains actual length of output array. + * + * Write SASL names, separated by space, of mechanisms supported by + * the libgsasl client to the output array. To find out how large the + * output array must be, call this function with out=NULL. + * + * Return value: Returns GSASL_OK if successful, or error code. + **/ +int +gsasl_client_listmech (Gsasl_ctx *ctx, char *out, size_t *outlen) +{ + return _gsasl_listmech (ctx, ctx->client_mechs, ctx->n_client_mechs, + out, outlen, 1); +} + +/** + * gsasl_server_listmech: + * @ctx: libgsasl handle. + * @out: output character array. + * @outlen: input maximum size of output character array, on output + * contains actual length of output array. + * + * Write SASL names, separated by space, of mechanisms supported by + * the libgsasl server to the output array. To find out how large the + * output array must be, call this function with out=NULL. + * + * Return value: Returns GSASL_OK if successful, or error code. + **/ +int +gsasl_server_listmech (Gsasl_ctx *ctx, char *out, size_t *outlen) +{ + return _gsasl_listmech (ctx, ctx->server_mechs, ctx->n_server_mechs, + out, outlen, 0); +} diff --git a/lib/login.c b/lib/login.c new file mode 100644 index 0000000..d5a3cd1 --- /dev/null +++ b/lib/login.c @@ -0,0 +1,335 @@ +/* login.c implementation of non-standard SASL mechanism LOGIN + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" + +#ifdef USE_LOGIN + +int +_gsasl_login_client_init (Gsasl_ctx *ctx) +{ + return GSASL_OK; +} + +void +_gsasl_login_client_done (Gsasl_ctx *ctx) +{ + return; +} + +int +_gsasl_login_client_start (Gsasl_session_ctx *cctx, + void **mech_data) +{ + int *step; + Gsasl_ctx *ctx; + + ctx = gsasl_client_ctx_get (cctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + if (gsasl_client_callback_authentication_id_get (ctx) == NULL) + return GSASL_NEED_CLIENT_AUTHENTICATION_ID_CALLBACK; + + if (gsasl_client_callback_password_get (ctx) == NULL) + return GSASL_NEED_CLIENT_PASSWORD_CALLBACK; + + step = (int*) malloc(sizeof(*step)); + if (step == NULL) + return GSASL_MALLOC_ERROR; + + *step = 0; + + *mech_data = step; + + return GSASL_OK; +} + +int +_gsasl_login_client_step (Gsasl_session_ctx *cctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len) +{ + int *step = mech_data; + Gsasl_client_callback_authentication_id cb_authentication_id; + Gsasl_client_callback_password cb_password; + Gsasl_ctx *ctx; + char *tmp; + int res; + + ctx = gsasl_client_ctx_get (cctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + cb_authentication_id = gsasl_client_callback_authentication_id_get (ctx); + if (cb_authentication_id == NULL) + return GSASL_NEED_CLIENT_AUTHENTICATION_ID_CALLBACK; + + cb_password = gsasl_client_callback_password_get (ctx); + if (cb_password == NULL) + return GSASL_NEED_CLIENT_PASSWORD_CALLBACK; + + switch (*step) + { + case 0: + if (input_len == 0) + { + *output_len = 0; + return GSASL_NEEDS_MORE; + } + res = cb_authentication_id (cctx, output, output_len); + if (res != GSASL_OK) + return res; + tmp = gsasl_utf8_nfkc_normalize (output, *output_len); + if (tmp == NULL) + return GSASL_UNICODE_NORMALIZATION_ERROR; + if (*output_len < strlen(tmp)) + return GSASL_TOO_SMALL_BUFFER; + memcpy(output, tmp, strlen(tmp)); + *output_len += strlen(tmp); + free(tmp); + (*step)++; + res = GSASL_NEEDS_MORE; + break; + + case 1: + res = cb_password (cctx, output, output_len); + if (res != GSASL_OK) + return res; + tmp = gsasl_utf8_nfkc_normalize (output, *output_len); + if (tmp == NULL) + return GSASL_UNICODE_NORMALIZATION_ERROR; + if (*output_len < strlen(tmp)) + return GSASL_TOO_SMALL_BUFFER; + memcpy(output, tmp, strlen(tmp)); + *output_len += strlen(tmp); + free(tmp); + (*step)++; + res = GSASL_NEEDS_MORE; + break; + + case 2: + res = GSASL_OK; + (*step)++; + break; + + default: + res = GSASL_MECHANISM_CALLED_TOO_MANY_TIMES; + break; + } + + return res; +} + +int +_gsasl_login_client_finish (Gsasl_session_ctx *cctx, + void *mech_data) +{ + int *step = mech_data; + + free(step); + + return GSASL_OK; +} + +/* Server */ + +struct _Gsasl_login_state { + int step; + char *username; +}; +typedef struct _Gsasl_login_state _Gsasl_login_state; + +#define CHALLENGE_USERNAME "User Name" +#define CHALLENGE_PASSWORD "Password" + +int +_gsasl_login_server_init (Gsasl_ctx *ctx) +{ + return GSASL_OK; +} + +void +_gsasl_login_server_done (Gsasl_ctx *ctx) +{ + return; +} + +int +_gsasl_login_server_start (Gsasl_session_ctx *sctx, + void **mech_data) +{ + _Gsasl_login_state *state; + Gsasl_ctx *ctx; + + ctx = gsasl_server_ctx_get (sctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + if (gsasl_server_callback_validate_get (ctx) == NULL && + gsasl_server_callback_retrieve_get (ctx) == NULL) + return GSASL_NEED_SERVER_VALIDATE_CALLBACK; + + state = (_Gsasl_login_state*) malloc(sizeof(*state)); + if (state == NULL) + return GSASL_MALLOC_ERROR; + + state->step = 0; + state->username = NULL; + + *mech_data = state; + + return GSASL_OK; +} + +int +_gsasl_login_server_step (Gsasl_session_ctx *sctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len) +{ + _Gsasl_login_state *state = mech_data; + Gsasl_server_callback_validate cb_validate; + Gsasl_server_callback_retrieve cb_retrieve; + Gsasl_ctx *ctx; + char *password; + int res; + + ctx = gsasl_server_ctx_get (sctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + cb_validate = gsasl_server_callback_validate_get (ctx); + cb_retrieve = gsasl_server_callback_retrieve_get (ctx); + if (cb_validate == NULL && cb_retrieve == NULL) + return GSASL_NEED_SERVER_VALIDATE_CALLBACK; + + switch (state->step) + { + case 0: + if (*output_len < strlen(CHALLENGE_USERNAME)) + return GSASL_TOO_SMALL_BUFFER; + + memcpy(output, CHALLENGE_USERNAME, strlen(CHALLENGE_USERNAME)); + *output_len = strlen(CHALLENGE_USERNAME); + + state->step++; + res = GSASL_NEEDS_MORE; + break; + + case 1: + if (input_len == 0) + return GSASL_MECHANISM_PARSE_ERROR; + + if (*output_len < strlen(CHALLENGE_PASSWORD)) + return GSASL_TOO_SMALL_BUFFER; + + state->username = malloc(input_len + 1); + if (state->username == NULL) + return GSASL_MALLOC_ERROR; + + memcpy(state->username, input, input_len); + state->username[input_len] = '\0'; + + memcpy(output, CHALLENGE_PASSWORD, strlen(CHALLENGE_PASSWORD)); + *output_len = strlen(CHALLENGE_PASSWORD); + + state->step++; + res = GSASL_NEEDS_MORE; + break; + + case 2: + if (input_len == 0) + return GSASL_MECHANISM_PARSE_ERROR; + + password = malloc(input_len + 1); + if (password == NULL) + return GSASL_MALLOC_ERROR; + + memcpy(password, input, input_len); + password[input_len] = '\0'; + + if (cb_validate) + { + res = cb_validate(sctx, state->username, NULL, password); + } + else + { + size_t keylen; + char *key; + char *normkey; + + res = cb_retrieve(sctx, state->username, NULL, NULL, NULL, &keylen); + if (res != GSASL_OK) + return res; + key = malloc(keylen); + if (key == NULL) + return GSASL_MALLOC_ERROR; + res = cb_retrieve(sctx, state->username, NULL, NULL, key, &keylen); + if (res != GSASL_OK) + { + free(key); + return res; + } + normkey = gsasl_utf8_nfkc_normalize (key, keylen); + free(key); + if (normkey == NULL) + return GSASL_UNICODE_NORMALIZATION_ERROR; + if (strlen(password) == strlen(normkey) && + memcmp(normkey, password, strlen(normkey)) == 0) + res = GSASL_OK; + else + res = GSASL_AUTHENTICATION_ERROR; + free(normkey); + } + + free(password); + + state->step++; + break; + + default: + res = GSASL_MECHANISM_CALLED_TOO_MANY_TIMES; + break; + } + + return res; +} + +int +_gsasl_login_server_finish (Gsasl_session_ctx *sctx, + void *mech_data) +{ + _Gsasl_login_state *state = mech_data; + + if (state->username) + free(state->username); + free(state); + + return GSASL_OK; +} + +#endif /* USE_LOGIN */ diff --git a/lib/login.h b/lib/login.h new file mode 100644 index 0000000..c7cafb4 --- /dev/null +++ b/lib/login.h @@ -0,0 +1,53 @@ +/* login.h header file for non-standard SASL mechanism LOGIN + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _LOGIN_H +#define _LOGIN_H + +#define _GSASL_LOGIN_NAME "LOGIN" + +extern int _gsasl_login_client_init (Gsasl_ctx *ctx); +extern void _gsasl_login_client_done (Gsasl_ctx *ctx); +extern int _gsasl_login_client_start (Gsasl_session_ctx *cctx, + void **mech_data); +extern int _gsasl_login_client_step (Gsasl_session_ctx *cctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len); +extern int _gsasl_login_client_finish (Gsasl_session_ctx *cctx, + void *mech_data); + +extern int _gsasl_login_server_init (Gsasl_ctx *ctx); +extern void _gsasl_login_server_done (Gsasl_ctx *ctx); +extern int _gsasl_login_server_start (Gsasl_session_ctx *sctx, + void **mech_data); +extern int _gsasl_login_server_step (Gsasl_session_ctx *sctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len); +extern int _gsasl_login_server_finish (Gsasl_session_ctx *sctx, + void *mech_data); + +#endif /* _LOGIN_H */ diff --git a/lib/md5pwd.c b/lib/md5pwd.c new file mode 100644 index 0000000..f25e2ea --- /dev/null +++ b/lib/md5pwd.c @@ -0,0 +1,98 @@ +/* md5pwd.c find passwords in UoW imapd MD5 type password files + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" + +/** + * gsasl_md5pwd_get_password: + * @filename: filename of file containing passwords. + * @username: username string. + * @key: output character array. + * @keylen: input maximum size of output character array, on output + * contains actual length of output array. + * + * Retrieve password for user from specified file. To find out how + * large the output array must be, call this function with out=NULL. + * + * The file should be on the UoW "MD5 Based Authentication" format, + * which means it is in text format with comments denoted by # first + * on the line, with user entries looking as username\tpassword. This + * function removes \r and \n at the end of lines before processing. + * + * Return value: Return GSASL_OK if output buffer contains the + * password, GSASL_AUTHENTICATION_ERROR if the user could not be + * found, or other error code. + **/ +int +gsasl_md5pwd_get_password (const char *filename, + const char *username, + char *key, + size_t *keylen) +{ + char matchbuf[BUFSIZ]; + char line[BUFSIZ]; + FILE *fh; + + fh = fopen(filename, "r"); + if (fh == NULL) + return GSASL_FOPEN_ERROR; + + sprintf(matchbuf, "%s\t", username); + + while (!feof(fh)) + { + if (fgets(line, BUFSIZ, fh) == NULL) + break; + + if (line[0] == '#') + continue; + + while (strlen(line) > 0 && (line[strlen(line)-1] == '\n' || + line[strlen(line)-1] == '\r')) + line[strlen(line)-1] = '\0'; + + if (strlen(line) <= strlen(matchbuf)) + continue; + + if (strncmp(matchbuf, line, strlen(matchbuf)) == 0) + { + if (*keylen < strlen(line) - strlen(matchbuf)) + { + fclose(fh); + return GSASL_TOO_SMALL_BUFFER; + } + + *keylen = strlen(line) - strlen(matchbuf); + + if (key) + memcpy(key, &line[strlen(matchbuf)], *keylen); + + fclose(fh); + + return GSASL_OK; + } + } + + if (fclose(fh) != 0) + return GSASL_FCLOSE_ERROR; + + return GSASL_AUTHENTICATION_ERROR; +} diff --git a/lib/ntlm.c b/lib/ntlm.c new file mode 100644 index 0000000..6bc91a8 --- /dev/null +++ b/lib/ntlm.c @@ -0,0 +1,197 @@ +/* ntlm.c implementation of non-standard SASL mechanism NTLM + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" + +#ifdef USE_NTLM + +#include <ntlm.h> + +struct _Gsasl_ntlm_state { + int step; + char *username; +}; +typedef struct _Gsasl_ntlm_state _Gsasl_ntlm_state; + +int +_gsasl_ntlm_client_init (Gsasl_ctx *ctx) +{ + return GSASL_OK; +} + +void +_gsasl_ntlm_client_done (Gsasl_ctx *ctx) +{ + return; +} + +int +_gsasl_ntlm_client_start (Gsasl_session_ctx *cctx, + void **mech_data) +{ + _Gsasl_ntlm_state *state; + Gsasl_ctx *ctx; + + ctx = gsasl_client_ctx_get (cctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + if (gsasl_client_callback_authorization_id_get (ctx) == NULL) + return GSASL_NEED_CLIENT_AUTHORIZATION_ID_CALLBACK; + + if (gsasl_client_callback_password_get (ctx) == NULL) + return GSASL_NEED_CLIENT_PASSWORD_CALLBACK; + + state = (_Gsasl_ntlm_state*) malloc(sizeof(*state)); + if (state == NULL) + return GSASL_MALLOC_ERROR; + + state->step = 0; + state->username = NULL; + + *mech_data = state; + + return GSASL_OK; +} + +int +_gsasl_ntlm_client_step (Gsasl_session_ctx *cctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len) +{ + _Gsasl_ntlm_state *state = mech_data; + tSmbNtlmAuthRequest request; + tSmbNtlmAuthChallenge challenge; + tSmbNtlmAuthResponse response; + Gsasl_client_callback_authorization_id cb_authorization_id; + Gsasl_client_callback_password cb_password; + Gsasl_ctx *ctx; + /* XXX create callback for domain? Doesn't seem to be needed by servers */ + char *domain = NULL; + int res; + + ctx = gsasl_client_ctx_get (cctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + cb_authorization_id = gsasl_client_callback_authorization_id_get (ctx); + if (cb_authorization_id == NULL) + return GSASL_NEED_CLIENT_AUTHORIZATION_ID_CALLBACK; + + cb_password = gsasl_client_callback_password_get (ctx); + if (cb_password == NULL) + return GSASL_NEED_CLIENT_PASSWORD_CALLBACK; + + switch(state->step) + { + case 0: + if (input_len == 0) + { + /* Initial client response */ + *output_len = 0; + return GSASL_NEEDS_MORE; + } + + if (input_len != 1 && *input != '+') + return GSASL_MECHANISM_PARSE_ERROR; + + res = cb_authorization_id (cctx, output, *output_len); + if (res != GSASL_OK) + return res; + + state->username = strdup(output); + + buildSmbNtlmAuthRequest(&request, state->username, domain); + + if (*output_len < SmbLength(&request)) + return GSASL_TOO_SMALL_BUFFER; + + *output_len = SmbLength(&request); + memcpy(output, &request, *output_len); + + /* dumpSmbNtlmAuthRequest(stdout, &request); */ + + state->step++; + + res = GSASL_NEEDS_MORE; + break; + + case 1: + if (input_len > sizeof(challenge)) + return GSASL_MECHANISM_PARSE_ERROR; + + /* Hand crafted challenge for parser testing: + TlRMTVNTUAAAAAAAAAAAAAAAAAAAAGFiY2RlZmdoMDEyMzQ1Njc4ODY2NDQwMTIz */ + + memcpy(&challenge, input, input_len); + + /* XXX? password stored in callee's output buffer */ + res = cb_password (cctx, output, *output_len); + if (res != GSASL_OK) + return res; + + buildSmbNtlmAuthResponse(&challenge, &response, state->username, output); + + if (*output_len < SmbLength(&response)) + return GSASL_TOO_SMALL_BUFFER; + + *output_len = SmbLength(&response); + memcpy(output, &response, *output_len); + + /* dumpSmbNtlmAuthResponse(stdout, &response); */ + + state->step++; + + res = GSASL_NEEDS_MORE; + break; + + case 2: + state->step++; + + res = GSASL_OK; + break; + + default: + res = GSASL_MECHANISM_CALLED_TOO_MANY_TIMES; + break; + } + + return res; +} + +int +_gsasl_ntlm_client_finish (Gsasl_session_ctx *cctx, + void *mech_data) +{ + _Gsasl_ntlm_state *state = mech_data; + + if (state->username) + free(state->username); + + free(state); + + return GSASL_OK; +} + +#endif /* USE_NTLM */ diff --git a/lib/plain.c b/lib/plain.c new file mode 100644 index 0000000..970c83c --- /dev/null +++ b/lib/plain.c @@ -0,0 +1,298 @@ +/* plain.c implementation of SASL mechanism PLAIN as defined in RFC 2595 + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" + +#ifdef USE_PLAIN + +int +_gsasl_plain_client_init (Gsasl_ctx *ctx) +{ + return GSASL_OK; +} + +void +_gsasl_plain_client_done (Gsasl_ctx *ctx) +{ + return; +} + +int +_gsasl_plain_client_start (Gsasl_session_ctx *cctx, + void **mech_data) +{ + Gsasl_ctx *ctx; + int *step; + + ctx = gsasl_client_ctx_get (cctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + if (gsasl_client_callback_authorization_id_get (ctx) == NULL) + return GSASL_NEED_CLIENT_AUTHORIZATION_ID_CALLBACK; + + if (gsasl_client_callback_authentication_id_get (ctx) == NULL) + return GSASL_NEED_CLIENT_AUTHENTICATION_ID_CALLBACK; + + if (gsasl_client_callback_password_get (ctx) == NULL) + return GSASL_NEED_CLIENT_PASSWORD_CALLBACK; + + step = (int*) malloc(sizeof(*step)); + if (step == NULL) + return GSASL_MALLOC_ERROR; + + *step = 0; + + *mech_data = step; + + return GSASL_OK; +} + +int +_gsasl_plain_client_step (Gsasl_session_ctx *cctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len) +{ + int *step = mech_data; + Gsasl_client_callback_authentication_id cb_authentication_id; + Gsasl_client_callback_authorization_id cb_authorization_id; + Gsasl_client_callback_password cb_password; + Gsasl_ctx *ctx; + char *tmp, *tmp2; + size_t len; + int res; + + if (*step > 0) + return GSASL_OK; + + ctx = gsasl_client_ctx_get (cctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + cb_authorization_id = gsasl_client_callback_authorization_id_get (ctx); + if (cb_authorization_id == NULL) + return GSASL_NEED_CLIENT_AUTHORIZATION_ID_CALLBACK; + + cb_authentication_id = gsasl_client_callback_authentication_id_get (ctx); + if (cb_authentication_id == NULL) + return GSASL_NEED_CLIENT_AUTHENTICATION_ID_CALLBACK; + + cb_password = gsasl_client_callback_password_get (ctx); + if (cb_password == NULL) + return GSASL_NEED_CLIENT_PASSWORD_CALLBACK; + + tmp = output; + + len = *output_len - (tmp - output); + res = cb_authorization_id (cctx, tmp, &len); + if (res != GSASL_OK) + return res; + tmp2 = gsasl_utf8_nfkc_normalize (tmp, len); + if (tmp2 == NULL) + return GSASL_UNICODE_NORMALIZATION_ERROR; + if (*output_len <= tmp - output + strlen(tmp2)) + return GSASL_TOO_SMALL_BUFFER; + memcpy(tmp, tmp2, strlen(tmp2)); + tmp += strlen(tmp2); + free(tmp2); + *tmp++ = '\0'; + + len = *output_len - (tmp - output); + res = cb_authentication_id (cctx, tmp, &len); + if (res != GSASL_OK) + return res; + tmp2 = gsasl_utf8_nfkc_normalize (tmp, len); + if (tmp2 == NULL) + return GSASL_UNICODE_NORMALIZATION_ERROR; + if (*output_len <= tmp - output + strlen(tmp2)) + return GSASL_TOO_SMALL_BUFFER; + memcpy(tmp, tmp2, strlen(tmp2)); + tmp += strlen(tmp2); + free(tmp2); + *tmp++ = '\0'; + + len = *output_len - (tmp - output); + res = cb_password (cctx, tmp, &len); + if (res != GSASL_OK) + return res; + tmp2 = gsasl_utf8_nfkc_normalize (tmp, len); + if (tmp2 == NULL) + return GSASL_UNICODE_NORMALIZATION_ERROR; + if (*output_len <= tmp - output + strlen(tmp2)) + return GSASL_TOO_SMALL_BUFFER; + memcpy(tmp, tmp2, strlen(tmp2)); + tmp += strlen(tmp2); + free(tmp2); + + *output_len = tmp - output; + + (*step)++; + + return GSASL_NEEDS_MORE; +} + +int +_gsasl_plain_client_finish (Gsasl_session_ctx *cctx, + void *mech_data) +{ + int *step = mech_data; + + free(step); + + return GSASL_OK; +} + +/* Server */ + +int +_gsasl_plain_server_init (Gsasl_ctx *ctx) +{ + return GSASL_OK; +} + +void +_gsasl_plain_server_done (Gsasl_ctx *ctx) +{ + return; +} + +int +_gsasl_plain_server_start (Gsasl_session_ctx *sctx, + void **mech_data) +{ + Gsasl_ctx *ctx; + + ctx = gsasl_server_ctx_get (sctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + if (gsasl_server_callback_validate_get (ctx) == NULL && + gsasl_server_callback_retrieve_get (ctx) == NULL) + return GSASL_NEED_SERVER_VALIDATE_CALLBACK; + + return GSASL_OK; +} + +int +_gsasl_plain_server_step (Gsasl_session_ctx *sctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len) +{ + Gsasl_server_callback_validate cb_validate; + Gsasl_server_callback_retrieve cb_retrieve; + char *authorization_id = NULL; + char *authentication_id = NULL; + char *passwordptr = NULL; + char *password = NULL; + Gsasl_ctx *ctx; + int res; + + if (input_len == 0) + { + *output_len = 0; + return GSASL_NEEDS_MORE; + } + + authorization_id = input; + authentication_id = memchr(input, 0, input_len); + if (authentication_id) + { + authentication_id++; + passwordptr = memchr(authentication_id, 0, + input_len - strlen(authorization_id) - 1); + if (passwordptr != NULL) + passwordptr++; + } + + if (passwordptr == NULL) + return GSASL_MECHANISM_PARSE_ERROR; + + password = malloc(input_len - (passwordptr - input) + 1); + if (password == NULL) + return GSASL_MALLOC_ERROR; + memcpy(password, passwordptr, input_len - (passwordptr - input)); + password[input_len - (passwordptr - input)] = '\0'; + + ctx = gsasl_server_ctx_get (sctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + cb_validate = gsasl_server_callback_validate_get (ctx); + cb_retrieve = gsasl_server_callback_retrieve_get (ctx); + if (cb_validate == NULL && cb_retrieve == NULL) + return GSASL_NEED_SERVER_VALIDATE_CALLBACK; + + if (cb_validate) + { + res = cb_validate(sctx, authorization_id, authentication_id, password); + } + else + { + size_t keylen; + char *key; + char *normkey; + + res = cb_retrieve(sctx, authentication_id, authorization_id, NULL, + NULL, &keylen); + if (res != GSASL_OK) + return res; + key = malloc(keylen); + if (key == NULL) + return GSASL_MALLOC_ERROR; + res = cb_retrieve(sctx, authentication_id, authorization_id, NULL, + key, &keylen); + if (res != GSASL_OK) + { + free(key); + return res; + } + normkey = gsasl_utf8_nfkc_normalize (key, keylen); + free(key); + if (normkey == NULL) + { + free(normkey); + return GSASL_UNICODE_NORMALIZATION_ERROR; + } + if (strlen(password) == strlen(normkey) && + memcmp(normkey, password, strlen(normkey)) == 0) + res = GSASL_OK; + else + res = GSASL_AUTHENTICATION_ERROR; + free(normkey); + } + + return res; +} + +int +_gsasl_plain_server_finish (Gsasl_session_ctx *sctx, + void *mech_data) +{ + return GSASL_OK; +} + +#endif /* USE_PLAIN */ diff --git a/lib/plain.h b/lib/plain.h new file mode 100644 index 0000000..6c67433 --- /dev/null +++ b/lib/plain.h @@ -0,0 +1,53 @@ +/* plain.h header file for SASL mechanism PLAIN as defined in RFC 2595 + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _PLAIN_H +#define _PLAIN_H + +#define _GSASL_PLAIN_NAME "PLAIN" + +extern int _gsasl_plain_client_init (Gsasl_ctx *ctx); +extern void _gsasl_plain_client_done (Gsasl_ctx *ctx); +extern int _gsasl_plain_client_start (Gsasl_session_ctx *cctx, + void **mech_data); +extern int _gsasl_plain_client_step (Gsasl_session_ctx *cctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len); +extern int _gsasl_plain_client_finish (Gsasl_session_ctx *cctx, + void *mech_data); + +extern int _gsasl_plain_server_init (Gsasl_ctx *ctx); +extern void _gsasl_plain_server_done (Gsasl_ctx *ctx); +extern int _gsasl_plain_server_start (Gsasl_session_ctx *sctx, + void **mech_data); +extern int _gsasl_plain_server_step (Gsasl_session_ctx *sctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len); +extern int _gsasl_plain_server_finish (Gsasl_session_ctx *sctx, + void *mech_data); + +#endif /* _PLAIN_H */ diff --git a/lib/securid.c b/lib/securid.c new file mode 100644 index 0000000..f95d7dc --- /dev/null +++ b/lib/securid.c @@ -0,0 +1,310 @@ +/* securid.c implementation of SASL mechanism SECURID as defined in RFC 2808 + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" + +#ifdef USE_SECURID + +int +_gsasl_securid_client_init (Gsasl_ctx *ctx) +{ + return GSASL_OK; +} + +void +_gsasl_securid_client_done (Gsasl_ctx *ctx) +{ + return; +} + +int +_gsasl_securid_client_start (Gsasl_session_ctx *cctx, + void **mech_data) +{ + Gsasl_ctx *ctx; + int *step; + + ctx = gsasl_client_ctx_get (cctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + if (gsasl_client_callback_authorization_id_get (ctx) == NULL) + return GSASL_NEED_CLIENT_AUTHORIZATION_ID_CALLBACK; + + if (gsasl_client_callback_authentication_id_get (ctx) == NULL) + return GSASL_NEED_CLIENT_AUTHENTICATION_ID_CALLBACK; + + if (gsasl_client_callback_passcode_get (ctx) == NULL) + return GSASL_NEED_CLIENT_PASSCODE_CALLBACK; + + step = (int*) malloc(sizeof(*step)); + if (step == NULL) + return GSASL_MALLOC_ERROR; + + *step = 0; + + *mech_data = step; + + return GSASL_OK; +} + +#define PASSCODE "passcode" +#define PIN "pin" + +int +_gsasl_securid_client_step (Gsasl_session_ctx *cctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len) +{ + int *step = mech_data; + Gsasl_client_callback_authorization_id cb_authorization_id; + Gsasl_client_callback_authentication_id cb_authentication_id; + Gsasl_client_callback_passcode cb_passcode; + Gsasl_client_callback_pin cb_pin; + Gsasl_ctx *ctx; + int do_pin = 0; + char *pin; + char *tmp; + int res; + size_t len; + + ctx = gsasl_client_ctx_get (cctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + cb_authorization_id = gsasl_client_callback_authorization_id_get (ctx); + if (cb_authorization_id == NULL) + return GSASL_NEED_CLIENT_AUTHORIZATION_ID_CALLBACK; + + cb_authentication_id = gsasl_client_callback_authentication_id_get (ctx); + if (cb_authentication_id == NULL) + return GSASL_NEED_CLIENT_AUTHENTICATION_ID_CALLBACK; + + cb_passcode = gsasl_client_callback_passcode_get (ctx); + if (cb_passcode == NULL) + return GSASL_NEED_CLIENT_PASSCODE_CALLBACK; + + cb_pin = gsasl_client_callback_pin_get (ctx); + + switch (*step) + { + case 1: + if (input_len > strlen(PASSCODE) && + memcmp(input, PASSCODE, strlen(PASSCODE)+1) == 0) + { + *step = 0; + } + else if (input_len > strlen(PIN) && + memcmp(input, PIN, strlen(PIN)+1) == 0) + { + if (cb_pin == NULL) + return GSASL_NEED_CLIENT_PIN_CALLBACK; + *step = 0; + } + else + { + res = GSASL_OK; + break; + } + /* fall through */ + + case 0: + tmp = output; + len = *output_len - (tmp-output); + res = cb_authorization_id (cctx, output, &len); + if (res != GSASL_OK) + return res; + tmp[len] = '\0'; + tmp = tmp + len + 1; + len = *output_len - (tmp-output); + res = cb_authentication_id (cctx, tmp, &len); + if (res != GSASL_OK) + return res; + tmp[len] = '\0'; + tmp = tmp + len + 1; + len = *output_len - (tmp-output); + res = cb_passcode (cctx, tmp, &len); + if (res != GSASL_OK) + return res; + tmp[len] = '\0'; + tmp = tmp + len + 1; + if (do_pin) + { + len = *output_len - (tmp-output); + if (input_len > strlen(PIN)+1) + res = cb_pin(cctx, &input[strlen(PIN)+1], tmp, &len); + else + res = cb_pin(cctx, NULL, tmp, &len); + if (res != GSASL_OK) + return res; + tmp[len] = '\0'; + tmp = tmp + len + 1; + } + + *output_len = (tmp-output); + (*step)++; + res = GSASL_NEEDS_MORE; + break; + + case 2: + *output_len = 0; + (*step)++; + res = GSASL_OK; + break; + + default: + res = GSASL_MECHANISM_CALLED_TOO_MANY_TIMES; + break; + } + + return res; +} + +int +_gsasl_securid_client_finish (Gsasl_session_ctx *cctx, + void *mech_data) +{ + int *step = mech_data; + + free(step); + + return GSASL_OK; +} + +/* Server */ + +int +_gsasl_securid_server_init (Gsasl_ctx *ctx) +{ + return GSASL_OK; +} + +void +_gsasl_securid_server_done (Gsasl_ctx *ctx) +{ + return; +} + +int +_gsasl_securid_server_start (Gsasl_session_ctx *sctx, + void **mech_data) +{ + Gsasl_ctx *ctx; + + ctx = gsasl_server_ctx_get (sctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + if (gsasl_server_callback_securid_get (ctx) == NULL) + return GSASL_NEED_SERVER_SECURID_CALLBACK; + + return GSASL_OK; +} + +int +_gsasl_securid_server_step (Gsasl_session_ctx *sctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len) +{ + Gsasl_server_callback_securid cb_securid; + const char *authorization_id = NULL; + const char *authentication_id = NULL; + const char *passcode = NULL; + const char *pin = NULL; + Gsasl_ctx *ctx; + int res; + size_t len; + + if (input_len == 0) + { + *output_len = 0; + return GSASL_NEEDS_MORE; + } + + authorization_id = input; + authentication_id = memchr(input, '\0', input_len); + if (authentication_id) + { + authentication_id++; + passcode = memchr(authentication_id, '\0', + input_len - strlen(authorization_id) - 1); + if (passcode) + { + passcode++; + pin = memchr(passcode, '\0', input_len - + strlen(authorization_id) - strlen(passcode) - 1); + if (pin) + pin++; + } + } + + if (passcode == NULL) + return GSASL_MECHANISM_PARSE_ERROR; + + ctx = gsasl_server_ctx_get (sctx); + if (ctx == NULL) + return GSASL_CANNOT_GET_CTX; + + cb_securid = gsasl_server_callback_securid_get (ctx); + if (cb_securid == NULL) + return GSASL_NEED_SERVER_SECURID_CALLBACK; + + len = *output_len; + res = cb_securid(ctx, authorization_id, authentication_id, + passcode, pin, output, &len); + switch (res) + { + case GSASL_SECURID_SERVER_NEED_ADDITIONAL_PASSCODE: + if (*output_len < strlen(PASSCODE) + 1) + return GSASL_TOO_SMALL_BUFFER; + strcpy(output, PASSCODE); + *output_len = strlen(PASSCODE) + 1; + res = GSASL_NEEDS_MORE; + break; + + case GSASL_SECURID_SERVER_NEED_NEW_PIN: + memmove(output + strlen(PIN) + 1, output, len); + strcpy(output, PIN); + *output_len = len + strlen(PIN) + 1; + res = GSASL_NEEDS_MORE; + break; + + default: + break; + } + + return res; +} + +int +_gsasl_securid_server_finish (Gsasl_session_ctx *sctx, + void *mech_data) +{ + return GSASL_OK; +} + +#endif /* USE_SECURID */ diff --git a/lib/securid.h b/lib/securid.h new file mode 100644 index 0000000..eb491d2 --- /dev/null +++ b/lib/securid.h @@ -0,0 +1,53 @@ +/* securid.h header file for SASL mechanism SECURID as defined in RFC 2808 + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _SECURID_H +#define _SECURID_H + +#define _GSASL_SECURID_NAME "SECURID" + +extern int _gsasl_securid_client_init (Gsasl_ctx *ctx); +extern void _gsasl_securid_client_done (Gsasl_ctx *ctx); +extern int _gsasl_securid_client_start (Gsasl_session_ctx *cctx, + void **mech_data); +extern int _gsasl_securid_client_step (Gsasl_session_ctx *cctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len); +extern int _gsasl_securid_client_finish (Gsasl_session_ctx *cctx, + void *mech_data); + +extern int _gsasl_securid_server_init (Gsasl_ctx *ctx); +extern void _gsasl_securid_server_done (Gsasl_ctx *ctx); +extern int _gsasl_securid_server_start (Gsasl_session_ctx *sctx, + void **mech_data); +extern int _gsasl_securid_server_step (Gsasl_session_ctx *sctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len); +extern int _gsasl_securid_server_finish (Gsasl_session_ctx *sctx, + void *mech_data); + +#endif /* _SECURID_H */ diff --git a/lib/suggest.c b/lib/suggest.c new file mode 100644 index 0000000..1008ee9 --- /dev/null +++ b/lib/suggest.c @@ -0,0 +1,54 @@ +/* suggest.c suggest client and server mechanism in a set of mechanisms + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" + +/** + * gsasl_client_suggest_mechanism: + * @ctx: libgsasl handle. + * @mechlist: input character array with SASL mechanism names, + * separated by invalid characters (e.g. SPC). + * + * Return value: Returns name of "best" SASL mechanism supported by + * the libgsasl client which is present in the input string. + **/ +const char * +gsasl_client_suggest_mechanism (Gsasl_ctx *ctx, const char *mechlist) +{ + /* XXX parse mechlist */ + return ctx->client_mechs[0].name; +} + +/** + * gsasl_server_suggest_mechanism: + * @ctx: libgsasl handle. + * @mechlist: input character array with SASL mechanism names, + * separated by invalid characters (e.g. SPC). + * + * Return value: Returns name of "best" SASL mechanism supported by + * the libgsasl server which is present in the input string. + **/ +const char * +gsasl_server_suggest_mechanism (Gsasl_ctx *ctx, const char *mechlist) +{ + /* XXX parse mechlist */ + return ctx->server_mechs[0].name; +} diff --git a/lib/supportp.c b/lib/supportp.c new file mode 100644 index 0000000..d34664d --- /dev/null +++ b/lib/supportp.c @@ -0,0 +1,62 @@ +/* supportp.c tell if a specific mechanism is support by the client or server + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" + +static int +_gsasl_support_p (_Gsasl_mechanism *mechs, size_t n_mechs, const char *name) +{ + int i; + + for (i = 0; i < n_mechs; i++) + if (name && strcmp(name, mechs[i].name) == 0) + return 1; + + return 0; +} + +/** + * gsasl_client_support_p: + * @ctx: libgsasl handle. + * @name: name of SASL mechanism. + * + * Return value: Returns 1 if the libgsasl client supports the named + * mechanism, otherwise 0. + **/ +int +gsasl_client_support_p (Gsasl_ctx *ctx, const char *name) +{ + return _gsasl_support_p (ctx->client_mechs, ctx->n_client_mechs, name); +} + +/** + * gsasl_server_support_p: + * @ctx: libgsasl handle. + * @name: name of SASL mechanism. + * + * Return value: Returns 1 if the libgsasl server supports the named + * mechanism, otherwise 0. + **/ +int +gsasl_server_support_p (Gsasl_ctx *ctx, const char *name) +{ + return _gsasl_support_p (ctx->server_mechs, ctx->n_server_mechs, name); +} diff --git a/lib/unicode.c b/lib/unicode.c new file mode 100644 index 0000000..e769348 --- /dev/null +++ b/lib/unicode.c @@ -0,0 +1,667 @@ +/* unicode.c unicode normalization utilities + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" + +/* This file contains functions from GLIB including gutf8.c and + * gunidecomp.c, all with the following license. + * + * Copyright (C) 1999, 2000 Tom Tromey + * Copyright 2000 Red Hat, Inc. + * + * The Gnome 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. + * + * The Gnome 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 the Gnome Library; see the file COPYING.LIB. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include <config.h> + +typedef char gchar; +typedef short gshort; +typedef long glong; +typedef int gint; +typedef gint gboolean; + +typedef unsigned char guchar; +typedef unsigned short gushort; +typedef unsigned long gulong; +typedef unsigned int guint; + +typedef enum { + G_NORMALIZE_DEFAULT, + G_NORMALIZE_NFD = G_NORMALIZE_DEFAULT, + G_NORMALIZE_DEFAULT_COMPOSE, + G_NORMALIZE_NFC = G_NORMALIZE_DEFAULT_COMPOSE, + G_NORMALIZE_ALL, + G_NORMALIZE_NFKD = G_NORMALIZE_ALL, + G_NORMALIZE_ALL_COMPOSE, + G_NORMALIZE_NFKC = G_NORMALIZE_ALL_COMPOSE +} GNormalizeMode; + +#include "gunidecomp.h" +#include "gunicomp.h" + +#include <stdlib.h> + +typedef signed char gint8; +typedef unsigned char guint8; +typedef signed short gint16; +typedef unsigned short guint16; +typedef signed int gint32; +typedef unsigned int guint32; + +typedef guint32 gunichar; +typedef guint16 gunichar2; + +typedef signed int gssize; +typedef unsigned int gsize; + +#define G_N_ELEMENTS(arr) (sizeof (arr) / sizeof ((arr)[0])) + +#define FALSE 0 +#define TRUE 1 + +#define UTF8_COMPUTE(Char, Mask, Len) \ + if (Char < 128) \ + { \ + Len = 1; \ + Mask = 0x7f; \ + } \ + else if ((Char & 0xe0) == 0xc0) \ + { \ + Len = 2; \ + Mask = 0x1f; \ + } \ + else if ((Char & 0xf0) == 0xe0) \ + { \ + Len = 3; \ + Mask = 0x0f; \ + } \ + else if ((Char & 0xf8) == 0xf0) \ + { \ + Len = 4; \ + Mask = 0x07; \ + } \ + else if ((Char & 0xfc) == 0xf8) \ + { \ + Len = 5; \ + Mask = 0x03; \ + } \ + else if ((Char & 0xfe) == 0xfc) \ + { \ + Len = 6; \ + Mask = 0x01; \ + } \ + else \ + Len = -1; + +#define UTF8_LENGTH(Char) \ + ((Char) < 0x80 ? 1 : \ + ((Char) < 0x800 ? 2 : \ + ((Char) < 0x10000 ? 3 : \ + ((Char) < 0x200000 ? 4 : \ + ((Char) < 0x4000000 ? 5 : 6))))) + + +#define UTF8_GET(Result, Chars, Count, Mask, Len) \ + (Result) = (Chars)[0] & (Mask); \ + for ((Count) = 1; (Count) < (Len); ++(Count)) \ + { \ + if (((Chars)[(Count)] & 0xc0) != 0x80) \ + { \ + (Result) = -1; \ + break; \ + } \ + (Result) <<= 6; \ + (Result) |= ((Chars)[(Count)] & 0x3f); \ + } + +#define UNICODE_VALID(Char) \ + ((Char) < 0x110000 && \ + ((Char) < 0xD800 || (Char) >= 0xE000) && \ + (Char) != 0xFFFE && (Char) != 0xFFFF) + +static const gchar utf8_skip_data[256] = { + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1 +}; +static const gchar * const g_utf8_skip = utf8_skip_data; + +#define g_utf8_next_char(p) (char *)((p) + g_utf8_skip[*(guchar *)(p)]) + +#define g_malloc malloc +#define g_free free + +#define g_new(struct_type, n_structs) \ + ((struct_type *) g_malloc (((gsize) sizeof (struct_type)) * ((gsize) (n_structs)))) + +/** + * g_utf8_get_char: + * @p: a pointer to Unicode character encoded as UTF-8 + * + * Converts a sequence of bytes encoded as UTF-8 to a Unicode character. + * If @p does not point to a valid UTF-8 encoded character, results are + * undefined. If you are not sure that the bytes are complete + * valid Unicode characters, you should use g_utf8_get_char_validated() + * instead. + * + * Return value: the resulting character + **/ +static gunichar +g_utf8_get_char (const gchar *p) +{ + int i, mask = 0, len; + gunichar result; + unsigned char c = (unsigned char) *p; + + UTF8_COMPUTE (c, mask, len); + if (len == -1) + return (gunichar)-1; + UTF8_GET (result, p, i, mask, len); + + return result; +} + +#define CC(Page, Char) \ + ((combining_class_table[Page] >= G_UNICODE_MAX_TABLE_INDEX) \ + ? (combining_class_table[Page] - G_UNICODE_MAX_TABLE_INDEX) \ + : (cclass_data[combining_class_table[Page]][Char])) + +#define COMBINING_CLASS(Char) \ + (((Char) > (G_UNICODE_LAST_CHAR)) ? 0 : CC((Char) >> 8, (Char) & 0xff)) + +/** + * g_unicode_canonical_ordering: + * @string: a UCS-4 encoded string. + * @len: the maximum length of @string to use. + * + * Computes the canonical ordering of a string in-place. + * This rearranges decomposed characters in the string + * according to their combining classes. See the Unicode + * manual for more information. + **/ +static void +g_unicode_canonical_ordering (gunichar *string, + gsize len) +{ + gsize i; + int swap = 1; + + while (swap) + { + int last; + swap = 0; + last = COMBINING_CLASS (string[0]); + for (i = 0; i < len - 1; ++i) + { + int next = COMBINING_CLASS (string[i + 1]); + if (next != 0 && last > next) + { + gsize j; + /* Percolate item leftward through string. */ + for (j = i; j > 0; --j) + { + gunichar t; + if (COMBINING_CLASS (string[j]) <= next) + break; + t = string[j + 1]; + string[j + 1] = string[j]; + string[j] = t; + swap = 1; + } + /* We're re-entering the loop looking at the old + character again. */ + next = last; + } + last = next; + } + } +} + +static const guchar * +find_decomposition (gunichar ch, + gboolean compat) +{ + int start = 0; + int end = G_N_ELEMENTS (decomp_table); + + if (ch >= decomp_table[start].ch && + ch <= decomp_table[end - 1].ch) + { + while (TRUE) + { + int half = (start + end) / 2; + if (ch == decomp_table[half].ch) + { + int offset; + + if (compat) + { + offset = decomp_table[half].compat_offset; + if (offset == 0xff) + offset = decomp_table[half].canon_offset; + } + else + { + offset = decomp_table[half].canon_offset; + if (offset == 0xff) + return NULL; + } + + return &(decomp_expansion_string[decomp_table[half].expansion_offset + offset]); + } + else if (half == start) + break; + else if (ch > decomp_table[half].ch) + start = half; + else + end = half; + } + } + + return NULL; +} + +#define CI(Page, Char) \ + ((compose_table[Page] >= G_UNICODE_MAX_TABLE_INDEX) \ + ? (compose_table[Page] - G_UNICODE_MAX_TABLE_INDEX) \ + : (compose_data[compose_table[Page]][Char])) + +#define COMPOSE_INDEX(Char) \ + (((Char) > (G_UNICODE_LAST_CHAR)) ? 0 : CI((Char) >> 8, (Char) & 0xff)) + +static gboolean +combine (gunichar a, + gunichar b, + gunichar *result) +{ + gushort index_a, index_b; + + index_a = COMPOSE_INDEX(a); + if (index_a >= COMPOSE_FIRST_SINGLE_START && index_a < COMPOSE_SECOND_START) + { + if (b == compose_first_single[index_a - COMPOSE_FIRST_SINGLE_START][0]) + { + *result = compose_first_single[index_a - COMPOSE_FIRST_SINGLE_START][1]; + return TRUE; + } + else + return FALSE; + } + + index_b = COMPOSE_INDEX(b); + if (index_b >= COMPOSE_SECOND_SINGLE_START) + { + if (a == compose_second_single[index_b - COMPOSE_SECOND_SINGLE_START][0]) + { + *result = compose_second_single[index_b - COMPOSE_SECOND_SINGLE_START][1]; + return TRUE; + } + else + return FALSE; + } + + if (index_a >= COMPOSE_FIRST_START && index_a < COMPOSE_FIRST_SINGLE_START && + index_b >= COMPOSE_SECOND_START && index_a < COMPOSE_SECOND_SINGLE_START) + { + gunichar res = compose_array[index_a - COMPOSE_FIRST_START][index_b - COMPOSE_SECOND_START]; + + if (res) + { + *result = res; + return TRUE; + } + } + + return FALSE; +} + +static gunichar * +_g_utf8_normalize_wc (const gchar *str, + gssize max_len, + GNormalizeMode mode) +{ + gsize n_wc; + gunichar *wc_buffer; + const char *p; + gsize last_start; + gboolean do_compat = (mode == G_NORMALIZE_NFKC || + mode == G_NORMALIZE_NFKD); + gboolean do_compose = (mode == G_NORMALIZE_NFC || + mode == G_NORMALIZE_NFKC); + + n_wc = 0; + p = str; + while ((max_len < 0 || p < str + max_len) && *p) + { + gunichar wc = g_utf8_get_char (p); + + const guchar *decomp = find_decomposition (wc, do_compat); + + if (decomp) + { + int len; + /* We store as a double-nul terminated string. */ + for (len = 0; (decomp[len] || decomp[len + 1]); + len += 2) + ; + n_wc += len / 2; + } + else + n_wc++; + + p = g_utf8_next_char (p); + } + + wc_buffer = g_new (gunichar, n_wc + 1); + + last_start = 0; + n_wc = 0; + p = str; + while ((max_len < 0 || p < str + max_len) && *p) + { + gunichar wc = g_utf8_get_char (p); + const guchar *decomp; + int cc; + gsize old_n_wc = n_wc; + + decomp = find_decomposition (wc, do_compat); + + if (decomp) + { + int len; + /* We store as a double-nul terminated string. */ + for (len = 0; (decomp[len] || decomp[len + 1]); + len += 2) + wc_buffer[n_wc++] = (decomp[len] << 8 | decomp[len + 1]); + } + else + wc_buffer[n_wc++] = wc; + + if (n_wc > 0) + { + cc = COMBINING_CLASS (wc_buffer[old_n_wc]); + + if (cc == 0) + { + g_unicode_canonical_ordering (wc_buffer + last_start, n_wc - last_start); + last_start = old_n_wc; + } + } + + p = g_utf8_next_char (p); + } + + if (n_wc > 0) + { + g_unicode_canonical_ordering (wc_buffer + last_start, n_wc - last_start); + last_start = n_wc; + } + + wc_buffer[n_wc] = 0; + + /* All decomposed and reordered */ + + + if (do_compose && n_wc > 0) + { + gsize i, j; + int last_cc = 0; + last_start = 0; + + for (i = 0; i < n_wc; i++) + { + int cc = COMBINING_CLASS (wc_buffer[i]); + + if (i > 0 && + (last_cc == 0 || last_cc != cc) && + combine (wc_buffer[last_start], wc_buffer[i], + &wc_buffer[last_start])) + { + for (j = i + 1; j < n_wc; j++) + wc_buffer[j-1] = wc_buffer[j]; + n_wc--; + i--; + + if (i == last_start) + last_cc = 0; + else + last_cc = COMBINING_CLASS (wc_buffer[i-1]); + + continue; + } + + if (cc == 0) + last_start = i; + + last_cc = cc; + } + } + + wc_buffer[n_wc] = 0; + + return wc_buffer; +} + +/** + * g_unichar_to_utf8: + * @c: a ISO10646 character code + * @outbuf: output buffer, must have at least 6 bytes of space. + * If %NULL, the length will be computed and returned + * and nothing will be written to @outbuf. + * + * Converts a single character to UTF-8. + * + * Return value: number of bytes written + **/ +static int +g_unichar_to_utf8 (gunichar c, + gchar *outbuf) +{ + guint len = 0; + int first; + int i; + + if (c < 0x80) + { + first = 0; + len = 1; + } + else if (c < 0x800) + { + first = 0xc0; + len = 2; + } + else if (c < 0x10000) + { + first = 0xe0; + len = 3; + } + else if (c < 0x200000) + { + first = 0xf0; + len = 4; + } + else if (c < 0x4000000) + { + first = 0xf8; + len = 5; + } + else + { + first = 0xfc; + len = 6; + } + + if (outbuf) + { + for (i = len - 1; i > 0; --i) + { + outbuf[i] = (c & 0x3f) | 0x80; + c >>= 6; + } + outbuf[0] = c | first; + } + + return len; +} + +/** + * g_ucs4_to_utf8: + * @str: a UCS-4 encoded string + * @len: the maximum length of @str to use. If @len < 0, then + * the string is terminated with a 0 character. + * @items_read: location to store number of characters read read, or %NULL. + * @items_written: location to store number of bytes written or %NULL. + * The value here stored does not include the trailing 0 + * byte. + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError other than + * %G_CONVERT_ERROR_NO_CONVERSION may occur. + * + * Convert a string from a 32-bit fixed width representation as UCS-4. + * to UTF-8. The result will be terminated with a 0 byte. + * + * Return value: a pointer to a newly allocated UTF-8 string. + * This value must be freed with g_free(). If an + * error occurs, %NULL will be returned and + * @error set. + **/ +static gchar * +g_ucs4_to_utf8 (const gunichar *str, + glong len, + glong *items_read, + glong *items_written) +{ + gint result_length; + gchar *result = NULL; + gchar *p; + gint i; + + result_length = 0; + for (i = 0; len < 0 || i < len ; i++) + { + if (!str[i]) + break; + + if (str[i] >= 0x80000000) + { + if (items_read) + *items_read = i; + + goto err_out; + } + + result_length += UTF8_LENGTH (str[i]); + } + + result = g_malloc (result_length + 1); + p = result; + + i = 0; + while (p < result + result_length) + p += g_unichar_to_utf8 (str[i++], p); + + *p = '\0'; + + if (items_written) + *items_written = p - result; + + err_out: + if (items_read) + *items_read = i; + + return result; +} + +/** + * g_utf8_normalize: + * @str: a UTF-8 encoded string. + * @len: length of @str, in bytes, or -1 if @str is nul-terminated. + * @mode: the type of normalization to perform. + * + * Converts a string into canonical form, standardizing + * such issues as whether a character with an accent + * is represented as a base character and combining + * accent or as a single precomposed character. You + * should generally call g_utf8_normalize() before + * comparing two Unicode strings. + * + * The normalization mode %G_NORMALIZE_DEFAULT only + * standardizes differences that do not affect the + * text content, such as the above-mentioned accent + * representation. %G_NORMALIZE_ALL also standardizes + * the "compatibility" characters in Unicode, such + * as SUPERSCRIPT THREE to the standard forms + * (in this case DIGIT THREE). Formatting information + * may be lost but for most text operations such + * characters should be considered the same. + * For example, g_utf8_collate() normalizes + * with %G_NORMALIZE_ALL as its first step. + * + * %G_NORMALIZE_DEFAULT_COMPOSE and %G_NORMALIZE_ALL_COMPOSE + * are like %G_NORMALIZE_DEFAULT and %G_NORMALIZE_ALL, + * but returned a result with composed forms rather + * than a maximally decomposed form. This is often + * useful if you intend to convert the string to + * a legacy encoding or pass it to a system with + * less capable Unicode handling. + * + * Return value: a newly allocated string, that is the + * normalized form of @str. + **/ +static gchar * +g_utf8_normalize (const gchar *str, + gssize len, + GNormalizeMode mode) +{ + gunichar *result_wc = _g_utf8_normalize_wc (str, len, mode); + gchar *result; + + result = g_ucs4_to_utf8 (result_wc, -1, NULL, NULL); + g_free (result_wc); + + return result; +} + +char * +gsasl_utf8_nfkc_normalize (const char *str, + int len) +{ + return g_utf8_normalize (str, len, G_NORMALIZE_NFKC); +} diff --git a/lib/version.c b/lib/version.c new file mode 100644 index 0000000..4f8ad9d --- /dev/null +++ b/lib/version.c @@ -0,0 +1,103 @@ +/* version.c version handling + * Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/* This file is based on src/global.c in libgcrypt */ + +#include "internal.h" + +static const char* +_gsasl_parse_version_number( const char *s, int *number ) +{ + int val = 0; + + if( *s == '0' && isdigit(s[1]) ) + return NULL; /* leading zeros are not allowed */ + for ( ; isdigit(*s); s++ ) { + val *= 10; + val += *s - '0'; + } + *number = val; + return val < 0? NULL : s; +} + + +static const char * +_gsasl_parse_version_string( const char *s, int *major, int *minor, int *micro ) +{ + s = _gsasl_parse_version_number( s, major ); + if( !s || *s != '.' ) + return NULL; + s++; + s = _gsasl_parse_version_number( s, minor ); + if( !s || *s != '.' ) + return NULL; + s++; + s = _gsasl_parse_version_number( s, micro ); + if( !s ) + return NULL; + return s; /* patchlevel */ +} + +/** + * gsasl_check_version: + * @req_version: version string to compare with, or NULL + * + * Check that the the version of the library is at minimum the one + * given as a string in @var{req_version} and return the actual + * version string of the library; return NULL if the condition is not + * met. If @code{NULL} is passed to this function no check is done + * and only the version string is returned. It is a pretty good idea + * to run this function as soon as possible, because it may also + * intializes some subsystems. In a multithreaded environment if + * should be called before any more threads are created. + **/ +const char * +gsasl_check_version (const char *req_version) +{ + const char *ver = VERSION; + int my_major, my_minor, my_micro; + int rq_major, rq_minor, rq_micro; + const char *my_plvl, *rq_plvl; + + if ( !req_version ) + return ver; + + my_plvl = _gsasl_parse_version_string( ver, + &my_major, &my_minor, &my_micro ); + if ( !my_plvl ) + return NULL; /* very strange our own version is bogus */ + rq_plvl = _gsasl_parse_version_string( req_version, &rq_major, &rq_minor, + &rq_micro ); + if ( !rq_plvl ) + return NULL; /* req version string is invalid */ + + if ( my_major > rq_major + || (my_major == rq_major && my_minor > rq_minor) + || (my_major == rq_major && my_minor == rq_minor + && my_micro > rq_micro) + || (my_major == rq_major && my_minor == rq_minor + && my_micro == rq_micro + && strcmp( my_plvl, rq_plvl ) >= 0) ) { + return ver; + } + return NULL; +} diff --git a/lib/x-gssapi.h b/lib/x-gssapi.h new file mode 100644 index 0000000..9ba3bfd --- /dev/null +++ b/lib/x-gssapi.h @@ -0,0 +1,53 @@ +/* gssapi.h header file for SASL mechanism GSSAPI as defined in RFC 2222 + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _GSSAPI_H +#define _GSSAPI_H + +#define _GSASL_GSSAPI_NAME "GSSAPI" + +extern int _gsasl_gssapi_client_init (Gsasl_ctx *ctx); +extern void _gsasl_gssapi_client_done (Gsasl_ctx *ctx); +extern int _gsasl_gssapi_client_start (Gsasl_session_ctx *cctx, + void **mech_data); +extern int _gsasl_gssapi_client_step (Gsasl_session_ctx *cctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len); +extern int _gsasl_gssapi_client_finish (Gsasl_session_ctx *cctx, + void *mech_data); + +extern int _gsasl_gssapi_server_init (Gsasl_ctx *ctx); +extern void _gsasl_gssapi_server_done (Gsasl_ctx *ctx); +extern int _gsasl_gssapi_server_start (Gsasl_session_ctx *sctx, + void **mech_data); +extern int _gsasl_gssapi_server_step (Gsasl_session_ctx *sctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len); +extern int _gsasl_gssapi_server_finish (Gsasl_session_ctx *sctx, + void *mech_data); + +#endif /* _GSSAPI_H */ diff --git a/lib/x-ntlm.h b/lib/x-ntlm.h new file mode 100644 index 0000000..a1552e6 --- /dev/null +++ b/lib/x-ntlm.h @@ -0,0 +1,56 @@ +/* sasl-ntlm.h header file for non-standard SASL mechanism NTLM + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _SASL_NTLM_H +#define _SASL_NTLM_H + +#ifdef USE_NTLM + +#define _GSASL_NTLM_NAME "NTLM" + +extern int _gsasl_ntlm_client_init (Gsasl_ctx *ctx); +extern void _gsasl_ntlm_client_done (Gsasl_ctx *ctx); +extern int _gsasl_ntlm_client_start (Gsasl_session_ctx *cctx, + void **mech_data); +extern int _gsasl_ntlm_client_step (Gsasl_session_ctx *cctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len); +extern int _gsasl_ntlm_client_finish (Gsasl_session_ctx *cctx, + void *mech_data); + +extern int _gsasl_ntlm_server_init (Gsasl_ctx *ctx); +extern void _gsasl_ntlm_server_done (Gsasl_ctx *ctx); +extern int _gsasl_ntlm_server_start (Gsasl_session_ctx *sctx, + void **mech_data); +extern int _gsasl_ntlm_server_step (Gsasl_session_ctx *sctx, + void *mech_data, + const char *input, + size_t input_len, + char *output, + size_t *output_len); +extern int _gsasl_ntlm_server_finish (Gsasl_session_ctx *sctx, + void *mech_data); +#endif /* USE_NTLM */ + +#endif /* _SASL_NTLM_H */ diff --git a/lib/xfinish.c b/lib/xfinish.c new file mode 100644 index 0000000..7040eeb --- /dev/null +++ b/lib/xfinish.c @@ -0,0 +1,52 @@ +/* xfinish.c finish libgsasl session + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" + +/** + * gsasl_client_finish: + * @xctx: libgsasl client handle. + * + * Destroy a libgsasl client handle. The handle must not be used with + * other libgsasl functions after this call. + **/ +void +gsasl_client_finish (Gsasl_session_ctx *xctx) +{ + xctx->mech->client.finish (xctx, xctx->mech_data); + + free(xctx); +} + +/** + * gsasl_server_finish: + * @xctx: libgsasl server handle. + * + * Destroy a libgsasl server handle. The handle must not be used with + * other libgsasl functions after this call. + **/ +void +gsasl_server_finish (Gsasl_session_ctx *xctx) +{ + xctx->mech->server.finish (xctx, xctx->mech_data); + + free(xctx); +} diff --git a/lib/xstart.c b/lib/xstart.c new file mode 100644 index 0000000..25261e6 --- /dev/null +++ b/lib/xstart.c @@ -0,0 +1,114 @@ +/* xstart.c start session + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" + +static int +_gsasl_session_start (Gsasl_ctx *ctx, + const char *mech, + Gsasl_session_ctx **xctx, + int clientp) +{ + int i = 0; + int res; + + *xctx = (Gsasl_session_ctx*) malloc(sizeof(**xctx)); + if (*xctx == NULL) + return GSASL_MALLOC_ERROR; + + memset(*xctx, 0, sizeof(**xctx)); + + for (i = 0; i < (clientp ? ctx->n_client_mechs : ctx->n_server_mechs); i++) + { + if (mech && ((clientp && strcmp(mech, ctx->client_mechs[i].name) == 0) || + (!clientp && strcmp(mech, ctx->server_mechs[i].name) == 0))) + { + if (clientp) + (*xctx)->mech = &ctx->client_mechs[i]; + else + (*xctx)->mech = &ctx->server_mechs[i]; + break; + } + } + + if ((*xctx)->mech == NULL) + { + free(*xctx); + *xctx = NULL; + return GSASL_UNKNOWN_MECHANISM; + } + + (*xctx)->ctx = ctx; + (*xctx)->mech_data = NULL; + if (clientp) + res = (*xctx)->mech->client.start(*xctx, &(*xctx)->mech_data); + else + res = (*xctx)->mech->server.start(*xctx, &(*xctx)->mech_data); + + if (res != GSASL_OK) + { + free(*xctx); + *xctx = NULL; + return res; + } + + return GSASL_OK; +} + +/** + * gsasl_client_start: + * @ctx: libgsasl handle. + * @mech: name of SASL mechanism. + * @xctx: pointer to client handle. + * + * This functions initiates a client SASL authentication. This + * function must be called before any other gsasl_client_*() function + * is called. + * + * Return value: Returns GSASL_OK if successful, or error code. + **/ +int +gsasl_client_start (Gsasl_ctx *ctx, + const char *mech, + Gsasl_session_ctx **xctx) +{ + return _gsasl_session_start (ctx, mech, xctx, 1); +} + +/** + * gsasl_server_start: + * @ctx: libgsasl handle. + * @mech: name of SASL mechanism. + * @xctx: pointer to server handle. + * + * This functions initiates a server SASL authentication. This + * function must be called before any other gsasl_server_*() function + * is called. + * + * Return value: Returns GSASL_OK if successful, or error code. + **/ +int +gsasl_server_start (Gsasl_ctx *ctx, + const char *mech, + Gsasl_session_ctx **xctx) +{ + return _gsasl_session_start (ctx, mech, xctx, 0); +} diff --git a/lib/xstep.c b/lib/xstep.c new file mode 100644 index 0000000..e826780 --- /dev/null +++ b/lib/xstep.c @@ -0,0 +1,195 @@ +/* Xstep.c perform one SASL authentication step in the X + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libgsasl 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 libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" + +/** + * gsasl_client_step: + * @xctx: libgsasl client handle. + * @input: input byte array. + * @input_len: size of input byte array. + * @output: output byte array. + * @output_len: size of output byte array. + * + * Perform one step of SASL authentication in client. This reads data + * from server (specified with input and input_len), processes it + * (potentially invoking callbacks to the application), and writes + * data to server (into variables output and output_len). + * + * The contents of the output buffer is unspecified if this functions + * returns anything other than GSASL_NEEDS_MORE. + * + * Return value: Returns GSASL_OK if authenticated terminated + * successfully, GSASL_NEEDS_MORE if more data is needed, or error + * code. + **/ +int +gsasl_client_step (Gsasl_session_ctx *xctx, + const char *input, + size_t input_len, + char *output, + size_t *output_len) +{ + return xctx->mech->client.step(xctx, xctx->mech_data, + input, input_len, + output, output_len); + +} + +/** + * gsasl_server_step: + * @xctx: libgsasl server handle. + * @input: input byte array. + * @input_len: size of input byte array. + * @output: output byte array. + * @output_len: size of output byte array. + * + * Perform one step of SASL authentication in server. This reads data + * from client (specified with input and input_len), processes it + * (potentially invoking callbacks to the application), and writes + * data to client (into variables output and output_len). + * + * The contents of the output buffer is unspecified if this functions + * returns anything other than GSASL_NEEDS_MORE. + * + * Return value: Returns GSASL_OK if authenticated terminated + * successfully, GSASL_NEEDS_MORE if more data is needed, or error + * code. + **/ +int +gsasl_server_step (Gsasl_session_ctx *xctx, + const char *input, + size_t input_len, + char *output, + size_t *output_len) +{ + return xctx->mech->server.step(xctx, xctx->mech_data, + input, input_len, + output, output_len); +} + +static int +_gsasl_session_step_base64 (Gsasl_session_ctx *xctx, + const char *b64input, + char *b64output, + size_t b64output_len, + int clientp) +{ + size_t input_len, output_len; + char *input, *output; + int res; + + if (b64input && strlen(b64input) > 0) + { + input_len = strlen(b64input) + 1; + input = (char*) malloc(input_len); + + input_len = gsasl_base64_decode(b64input, input, input_len); + if (input_len == -1) + { + free(input); + return GSASL_BASE64_ERROR; + } + } + else + { + input = NULL; + input_len = 0; + } + + if (b64output && b64output_len > 0) + { + *b64output = '\0'; + output_len = b64output_len; /* As good guess as any */ + output = (char*) malloc(output_len); + } + else + { + output = NULL; + output_len = 0; + } + + if (clientp) + res = gsasl_client_step (xctx, input, input_len, output, &output_len); + else + res = gsasl_server_step (xctx, input, input_len, output, &output_len); + + if (res == GSASL_NEEDS_MORE && output && output_len > 0) + { + output_len = gsasl_base64_encode(output, output_len, + b64output, b64output_len); + if (output_len == -1) + { + free(output); + free(input); + return GSASL_BASE64_ERROR; + } + } + + free(output); + free(input); + + return res; +} + +/** + * gsasl_client_step_base64: + * @xctx: libgsasl client handle. + * @b64input: input base64 encoded byte array. + * @b64output: output base64 encoded byte array. + * @b64output_len: size of output base64 encoded byte array. + * + * This is a simple wrapper around gsasl_client_step() that base64 + * decodes the input and base64 encodes the output. + * + * Return value: See gsasl_client_step(). + **/ +int +gsasl_client_step_base64 (Gsasl_session_ctx *xctx, + const char *b64input, + char *b64output, + size_t b64output_len) +{ + return _gsasl_session_step_base64 (xctx, b64input, b64output, + b64output_len, 1); +} + +/** + * gsasl_server_step_base64: + * @xctx: libgsasl server handle. + * @b64input: input base64 encoded byte array. + * @b64output: output base64 encoded byte array. + * @b64output_len: size of output base64 encoded byte array. + * + * This is a simple wrapper around gsasl_server_step() that base64 + * decodes the input and base64 encodes the output. + * + * Return value: See gsasl_server_step(). + **/ +int +gsasl_server_step_base64 (Gsasl_session_ctx *xctx, + const char *b64input, + char *b64output, + size_t b64output_len) +{ + return _gsasl_session_step_base64 (xctx, b64input, b64output, + b64output_len, 0); +} diff --git a/m4/ChangeLog b/m4/ChangeLog new file mode 100644 index 0000000..9ac85f1 --- /dev/null +++ b/m4/ChangeLog @@ -0,0 +1,21 @@ +2002-10-07 gettextize <bug-gnu-gettext@gnu.org> + + * codeset.m4: New file, from gettext-0.11.5. + * gettext.m4: New file, from gettext-0.11.5. + * glibc21.m4: New file, from gettext-0.11.5. + * iconv.m4: New file, from gettext-0.11.5. + * intdiv0.m4: New file, from gettext-0.11.5. + * inttypes.m4: New file, from gettext-0.11.5. + * inttypes_h.m4: New file, from gettext-0.11.5. + * inttypes-pri.m4: New file, from gettext-0.11.5. + * isc-posix.m4: New file, from gettext-0.11.5. + * lcmessage.m4: New file, from gettext-0.11.5. + * lib-ld.m4: New file, from gettext-0.11.5. + * lib-link.m4: New file, from gettext-0.11.5. + * lib-prefix.m4: New file, from gettext-0.11.5. + * progtest.m4: New file, from gettext-0.11.5. + * stdint_h.m4: New file, from gettext-0.11.5. + * uintmax_t.m4: New file, from gettext-0.11.5. + * ulonglong.m4: New file, from gettext-0.11.5. + * Makefile.am: New file. + diff --git a/m4/Makefile.am b/m4/Makefile.am new file mode 100644 index 0000000..aff6d90 --- /dev/null +++ b/m4/Makefile.am @@ -0,0 +1 @@ +EXTRA_DIST = codeset.m4 gettext.m4 glibc21.m4 iconv.m4 intdiv0.m4 inttypes.m4 inttypes_h.m4 inttypes-pri.m4 isc-posix.m4 lcmessage.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 progtest.m4 stdint_h.m4 uintmax_t.m4 ulonglong.m4 libgcrypt.m4 libntlm.m4 diff --git a/m4/codeset.m4 b/m4/codeset.m4 new file mode 100644 index 0000000..59535eb --- /dev/null +++ b/m4/codeset.m4 @@ -0,0 +1,23 @@ +# codeset.m4 serial AM1 (gettext-0.10.40) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([AM_LANGINFO_CODESET], +[ + AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, + [AC_TRY_LINK([#include <langinfo.h>], + [char* cs = nl_langinfo(CODESET);], + am_cv_langinfo_codeset=yes, + am_cv_langinfo_codeset=no) + ]) + if test $am_cv_langinfo_codeset = yes; then + AC_DEFINE(HAVE_LANGINFO_CODESET, 1, + [Define if you have <langinfo.h> and nl_langinfo(CODESET).]) + fi +]) diff --git a/m4/gettext.m4 b/m4/gettext.m4 new file mode 100644 index 0000000..45cad85 --- /dev/null +++ b/m4/gettext.m4 @@ -0,0 +1,587 @@ +# gettext.m4 serial 17 (gettext-0.11.5) +dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000. +dnl Bruno Haible <haible@clisp.cons.org>, 2000-2002. + +dnl Macro to add for using GNU gettext. + +dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). +dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The +dnl default (if it is not specified or empty) is 'no-libtool'. +dnl INTLSYMBOL should be 'external' for packages with no intl directory, +dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. +dnl If INTLSYMBOL is 'use-libtool', then a libtool library +dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, +dnl depending on --{enable,disable}-{shared,static} and on the presence of +dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library +dnl $(top_builddir)/intl/libintl.a will be created. +dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext +dnl implementations (in libc or libintl) without the ngettext() function +dnl will be ignored. If NEEDSYMBOL is specified and is +dnl 'need-formatstring-macros', then GNU gettext implementations that don't +dnl support the ISO C 99 <inttypes.h> formatstring macros will be ignored. +dnl INTLDIR is used to find the intl libraries. If empty, +dnl the value `$(top_builddir)/intl/' is used. +dnl +dnl The result of the configuration is one of three cases: +dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled +dnl and used. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 2) GNU gettext has been found in the system's C library. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 3) No internationalization, always use English msgid. +dnl Catalog format: none +dnl Catalog extension: none +dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. +dnl The use of .gmo is historical (it was needed to avoid overwriting the +dnl GNU format catalogs when building on a platform with an X/Open gettext), +dnl but we keep it in order not to force irrelevant filename changes on the +dnl maintainers. +dnl +AC_DEFUN([AM_GNU_GETTEXT], +[ + dnl Argument checking. + ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , + [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT +])])])])]) + ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , + [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT +])])])]) + define(gt_included_intl, ifelse([$1], [external], [no], [yes])) + define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], [])) + + AC_REQUIRE([AM_PO_SUBDIRS])dnl + ifelse(gt_included_intl, yes, [ + AC_REQUIRE([AM_INTL_SUBDIR])dnl + ]) + + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Sometimes libintl requires libiconv, so first search for libiconv. + dnl Ideally we would do this search only after the + dnl if test "$USE_NLS" = "yes"; then + dnl if test "$gt_cv_func_gnugettext_libc" != "yes"; then + dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT + dnl the configure script would need to contain the same shell code + dnl again, outside any 'if'. There are two solutions: + dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. + dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. + dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not + dnl documented, we avoid it. + ifelse(gt_included_intl, yes, , [ + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + ]) + + AC_MSG_CHECKING([whether NLS is requested]) + dnl Default is enabled NLS + AC_ARG_ENABLE(nls, + [ --disable-nls do not use Native Language Support], + USE_NLS=$enableval, USE_NLS=yes) + AC_MSG_RESULT($USE_NLS) + AC_SUBST(USE_NLS) + + ifelse(gt_included_intl, yes, [ + BUILD_INCLUDED_LIBINTL=no + USE_INCLUDED_LIBINTL=no + ]) + LIBINTL= + LTLIBINTL= + POSUB= + + dnl If we use NLS figure out what method + if test "$USE_NLS" = "yes"; then + gt_use_preinstalled_gnugettext=no + ifelse(gt_included_intl, yes, [ + AC_MSG_CHECKING([whether included gettext is requested]) + AC_ARG_WITH(included-gettext, + [ --with-included-gettext use the GNU gettext library included here], + nls_cv_force_use_gnu_gettext=$withval, + nls_cv_force_use_gnu_gettext=no) + AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) + + nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" + if test "$nls_cv_force_use_gnu_gettext" != "yes"; then + ]) + dnl User does not insist on using GNU NLS library. Figure out what + dnl to use. If GNU gettext is available we use this. Else we have + dnl to fall back to GNU NLS library. + + dnl Add a version number to the cache macros. + define([gt_api_version], ifelse([$2], [need-formatstring-macros], 3, ifelse([$2], [need-ngettext], 2, 1))) + define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc]) + define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl]) + + AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc, + [AC_TRY_LINK([#include <libintl.h> +]ifelse([$2], [need-formatstring-macros], +[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +], [])[extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings;], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings], + gt_cv_func_gnugettext_libc=yes, + gt_cv_func_gnugettext_libc=no)]) + + if test "$gt_cv_func_gnugettext_libc" != "yes"; then + dnl Sometimes libintl requires libiconv, so first search for libiconv. + ifelse(gt_included_intl, yes, , [ + AM_ICONV_LINK + ]) + dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL + dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) + dnl because that would add "-liconv" to LIBINTL and LTLIBINTL + dnl even if libiconv doesn't exist. + AC_LIB_LINKFLAGS_BODY([intl]) + AC_CACHE_CHECK([for GNU gettext in libintl], + gt_cv_func_gnugettext_libintl, + [gt_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCINTL" + gt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBINTL" + dnl Now see whether libintl exists and does not depend on libiconv. + AC_TRY_LINK([#include <libintl.h> +]ifelse([$2], [need-formatstring-macros], +[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +], [])[extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias ();], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], + gt_cv_func_gnugettext_libintl=yes, + gt_cv_func_gnugettext_libintl=no) + dnl Now see whether libintl exists and depends on libiconv. + if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include <libintl.h> +]ifelse([$2], [need-formatstring-macros], +[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +], [])[extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias ();], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], + [LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + gt_cv_func_gnugettext_libintl=yes + ]) + fi + CPPFLAGS="$gt_save_CPPFLAGS" + LIBS="$gt_save_LIBS"]) + fi + + dnl If an already present or preinstalled GNU gettext() is found, + dnl use it. But if this macro is used in GNU gettext, and GNU + dnl gettext is already preinstalled in libintl, we update this + dnl libintl. (Cf. the install rule in intl/Makefile.in.) + if test "$gt_cv_func_gnugettext_libc" = "yes" \ + || { test "$gt_cv_func_gnugettext_libintl" = "yes" \ + && test "$PACKAGE" != gettext; }; then + gt_use_preinstalled_gnugettext=yes + else + dnl Reset the values set by searching for libintl. + LIBINTL= + LTLIBINTL= + INCINTL= + fi + + ifelse(gt_included_intl, yes, [ + if test "$gt_use_preinstalled_gnugettext" != "yes"; then + dnl GNU gettext is not found in the C library. + dnl Fall back on included GNU gettext library. + nls_cv_use_gnu_gettext=yes + fi + fi + + if test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions used to generate GNU NLS library. + INTLOBJS="\$(GETTOBJS)" + BUILD_INCLUDED_LIBINTL=yes + USE_INCLUDED_LIBINTL=yes + LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV" + LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV" + LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` + fi + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions to use GNU gettext tools. + CATOBJEXT=.gmo + fi + ]) + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + AC_DEFINE(ENABLE_NLS, 1, + [Define to 1 if translation of program messages to the user's native language + is requested.]) + else + USE_NLS=no + fi + fi + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext_libintl" = "yes"; then + AC_MSG_CHECKING([how to link with libintl]) + AC_MSG_RESULT([$LIBINTL]) + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) + fi + + dnl For backward compatibility. Some packages may be using this. + AC_DEFINE(HAVE_GETTEXT, 1, + [Define if the GNU gettext() function is already present or preinstalled.]) + AC_DEFINE(HAVE_DCGETTEXT, 1, + [Define if the GNU dcgettext() function is already present or preinstalled.]) + fi + + dnl We need to process the po/ directory. + POSUB=po + fi + + ifelse(gt_included_intl, yes, [ + dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL + dnl to 'yes' because some of the testsuite requires it. + if test "$PACKAGE" = gettext; then + BUILD_INCLUDED_LIBINTL=yes + fi + + dnl Make all variables we use known to autoconf. + AC_SUBST(BUILD_INCLUDED_LIBINTL) + AC_SUBST(USE_INCLUDED_LIBINTL) + AC_SUBST(CATOBJEXT) + AC_SUBST(INTLOBJS) + + dnl For backward compatibility. Some configure.ins may be using this. + nls_cv_header_intl= + nls_cv_header_libgt= + + dnl For backward compatibility. Some Makefiles may be using this. + DATADIRNAME=share + AC_SUBST(DATADIRNAME) + + dnl For backward compatibility. Some Makefiles may be using this. + INSTOBJEXT=.mo + AC_SUBST(INSTOBJEXT) + + dnl For backward compatibility. Some Makefiles may be using this. + GENCAT=gencat + AC_SUBST(GENCAT) + + dnl Enable libtool support if the surrounding package wishes it. + INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix + AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) + ]) + + dnl For backward compatibility. Some Makefiles may be using this. + INTLLIBS="$LIBINTL" + AC_SUBST(INTLLIBS) + + dnl Make all documented variables known to autoconf. + AC_SUBST(LIBINTL) + AC_SUBST(LTLIBINTL) + AC_SUBST(POSUB) +]) + + +dnl Checks for all prerequisites of the po subdirectory, +dnl except for USE_NLS. +AC_DEFUN([AM_PO_SUBDIRS], +[ + AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_MKINSTALLDIRS])dnl + + dnl Perform the following tests also if --disable-nls has been given, + dnl because they are needed for "make dist" to work. + + dnl Search for GNU msgfmt in the PATH. + dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. + dnl The second test excludes FreeBSD msgfmt. + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + + dnl Search for GNU xgettext 0.11 or newer in the PATH. + dnl The first test excludes Solaris xgettext and early GNU xgettext versions. + dnl The second test excludes FreeBSD xgettext. + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [$ac_dir/$ac_word --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + dnl Remove leftover from FreeBSD xgettext call. + rm -f messages.po + + dnl Search for GNU msgmerge 0.11 or newer in the PATH. + AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, + [$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1], :) + + dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. + dnl Test whether we really found GNU msgfmt. + if test "$GMSGFMT" != ":"; then + dnl If it is no GNU msgfmt we define it as : so that the + dnl Makefiles still can work. + if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && + (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` + AC_MSG_RESULT( + [found $GMSGFMT program is not GNU msgfmt; ignore it]) + GMSGFMT=":" + fi + fi + + dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is no GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && + (if $XGETTEXT --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + AC_MSG_RESULT( + [found xgettext program is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + dnl Remove leftover from FreeBSD xgettext call. + rm -f messages.po + fi + + AC_OUTPUT_COMMANDS([ + for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" + # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES depend + # on $ac_dir but don't depend on user-specified configuration + # parameters. + if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then + # The LINGUAS file contains the set of available languages. + if test -n "$ALL_LINGUAS"; then + test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" + fi + ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + fi + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + GMOFILES= + UPDATEPOFILES= + DUMMYPOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + done + # CATALOGS depends on both $ac_dir and the user's LINGUAS + # environment variable. + INST_LINGUAS= + if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done + fi + CATALOGS= + if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + done + fi + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do + if test -f "$f"; then + case "$f" in + *.orig | *.bak | *~) ;; + *) cat "$f" >> "$ac_dir/Makefile" ;; + esac + fi + done + fi + ;; + esac + done], + [# Capture the value of obsolete ALL_LINGUAS because we need it to compute + # POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it + # from automake. + eval 'ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + ]) +]) + + +dnl Checks for all prerequisites of the intl subdirectory, +dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS, +dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL. +AC_DEFUN([AM_INTL_SUBDIR], +[ + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_MKINSTALLDIRS])dnl + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_CANONICAL_HOST])dnl + AC_REQUIRE([AC_PROG_RANLIB])dnl + AC_REQUIRE([AC_ISC_POSIX])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + AC_REQUIRE([AC_C_CONST])dnl + AC_REQUIRE([AC_C_INLINE])dnl + AC_REQUIRE([AC_TYPE_OFF_T])dnl + AC_REQUIRE([AC_TYPE_SIZE_T])dnl + AC_REQUIRE([AC_FUNC_ALLOCA])dnl + AC_REQUIRE([AC_FUNC_MMAP])dnl + AC_REQUIRE([jm_GLIBC21])dnl + AC_REQUIRE([gt_INTDIV0])dnl + AC_REQUIRE([jm_AC_TYPE_UINTMAX_T])dnl + AC_REQUIRE([gt_HEADER_INTTYPES_H])dnl + AC_REQUIRE([gt_INTTYPES_PRI])dnl + + AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ +stdlib.h string.h unistd.h sys/param.h]) + AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \ +geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \ +strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next]) + + AM_ICONV + AM_LANGINFO_CODESET + if test $ac_cv_header_locale_h = yes; then + AM_LC_MESSAGES + fi + + dnl intl/plural.c is generated from intl/plural.y. It requires bison, + dnl because plural.y uses bison specific features. It requires at least + dnl bison-1.26 because earlier versions generate a plural.c that doesn't + dnl compile. + dnl bison is only needed for the maintainer (who touches plural.y). But in + dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put + dnl the rule in general Makefile. Now, some people carelessly touch the + dnl files or have a broken "make" program, hence the plural.c rule will + dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not + dnl present or too old. + AC_CHECK_PROGS([INTLBISON], [bison]) + if test -z "$INTLBISON"; then + ac_verc_fail=yes + else + dnl Found it, now check the version. + AC_MSG_CHECKING([version of bison]) +changequote(<<,>>)dnl + ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` + case $ac_prog_version in + '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; + 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) +changequote([,])dnl + ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; + *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; + esac + AC_MSG_RESULT([$ac_prog_version]) + fi + if test $ac_verc_fail = yes; then + INTLBISON=: + fi +]) + + +AC_DEFUN([AM_MKINSTALLDIRS], +[ + dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly + dnl find the mkinstalldirs script in another subdir but $(top_srcdir). + dnl Try to locate is. + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + AC_SUBST(MKINSTALLDIRS) +]) + + +dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) +AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) diff --git a/m4/glibc21.m4 b/m4/glibc21.m4 new file mode 100644 index 0000000..9c9f3db --- /dev/null +++ b/m4/glibc21.m4 @@ -0,0 +1,32 @@ +# glibc21.m4 serial 2 (fileutils-4.1.3, gettext-0.10.40) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +# Test for the GNU C Library, version 2.1 or newer. +# From Bruno Haible. + +AC_DEFUN([jm_GLIBC21], + [ + AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer, + ac_cv_gnu_library_2_1, + [AC_EGREP_CPP([Lucky GNU user], + [ +#include <features.h> +#ifdef __GNU_LIBRARY__ + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) + Lucky GNU user + #endif +#endif + ], + ac_cv_gnu_library_2_1=yes, + ac_cv_gnu_library_2_1=no) + ] + ) + AC_SUBST(GLIBC21) + GLIBC21="$ac_cv_gnu_library_2_1" + ] +) diff --git a/m4/iconv.m4 b/m4/iconv.m4 new file mode 100644 index 0000000..c5f3579 --- /dev/null +++ b/m4/iconv.m4 @@ -0,0 +1,103 @@ +# iconv.m4 serial AM4 (gettext-0.11.3) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], +[ + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([iconv]) +]) + +AC_DEFUN([AM_ICONV_LINK], +[ + dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and + dnl those with the standalone portable GNU libiconv installed). + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + + dnl Add $INCICONV to CPPFLAGS before performing the following checks, + dnl because if the user has installed libiconv and not disabled its use + dnl via --without-libiconv-prefix, he wants to use it. The first + dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. + am_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) + + AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + AC_TRY_LINK([#include <stdlib.h> +#include <iconv.h>], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_func_iconv=yes) + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include <stdlib.h> +#include <iconv.h>], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_lib_iconv=yes + am_cv_func_iconv=yes) + LIBS="$am_save_LIBS" + fi + ]) + if test "$am_cv_func_iconv" = yes; then + AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) + fi + if test "$am_cv_lib_iconv" = yes; then + AC_MSG_CHECKING([how to link with libiconv]) + AC_MSG_RESULT([$LIBICONV]) + else + dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV + dnl either. + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + AC_SUBST(LIBICONV) + AC_SUBST(LTLIBICONV) +]) + +AC_DEFUN([AM_ICONV], +[ + AM_ICONV_LINK + if test "$am_cv_func_iconv" = yes; then + AC_MSG_CHECKING([for iconv declaration]) + AC_CACHE_VAL(am_cv_proto_iconv, [ + AC_TRY_COMPILE([ +#include <stdlib.h> +#include <iconv.h> +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif +], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) + am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + AC_MSG_RESULT([$]{ac_t:- + }[$]am_cv_proto_iconv) + AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, + [Define as const if the declaration of iconv() needs const.]) + fi +]) diff --git a/m4/intdiv0.m4 b/m4/intdiv0.m4 new file mode 100644 index 0000000..55dddcf --- /dev/null +++ b/m4/intdiv0.m4 @@ -0,0 +1,72 @@ +# intdiv0.m4 serial 1 (gettext-0.11.3) +dnl Copyright (C) 2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([gt_INTDIV0], +[ + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_CANONICAL_HOST])dnl + + AC_CACHE_CHECK([whether integer division by zero raises SIGFPE], + gt_cv_int_divbyzero_sigfpe, + [ + AC_TRY_RUN([ +#include <stdlib.h> +#include <signal.h> + +static void +#ifdef __cplusplus +sigfpe_handler (int sig) +#else +sigfpe_handler (sig) int sig; +#endif +{ + /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */ + exit (sig != SIGFPE); +} + +int x = 1; +int y = 0; +int z; +int nan; + +int main () +{ + signal (SIGFPE, sigfpe_handler); +/* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */ +#if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP) + signal (SIGTRAP, sigfpe_handler); +#endif +/* Linux/SPARC yields signal SIGILL. */ +#if defined (__sparc__) && defined (__linux__) + signal (SIGILL, sigfpe_handler); +#endif + + z = x / y; + nan = y / y; + exit (1); +} +], gt_cv_int_divbyzero_sigfpe=yes, gt_cv_int_divbyzero_sigfpe=no, + [ + # Guess based on the CPU. + case "$host_cpu" in + alpha* | i[34567]86 | m68k | s390*) + gt_cv_int_divbyzero_sigfpe="guessing yes";; + *) + gt_cv_int_divbyzero_sigfpe="guessing no";; + esac + ]) + ]) + case "$gt_cv_int_divbyzero_sigfpe" in + *yes) value=1;; + *) value=0;; + esac + AC_DEFINE_UNQUOTED(INTDIV0_RAISES_SIGFPE, $value, + [Define if integer division by zero raises signal SIGFPE.]) +]) diff --git a/m4/inttypes-pri.m4 b/m4/inttypes-pri.m4 new file mode 100644 index 0000000..fd007c3 --- /dev/null +++ b/m4/inttypes-pri.m4 @@ -0,0 +1,32 @@ +# inttypes-pri.m4 serial 1 (gettext-0.11.4) +dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +# Define PRI_MACROS_BROKEN if <inttypes.h> exists and defines the PRI* +# macros to non-string values. This is the case on AIX 4.3.3. + +AC_DEFUN([gt_INTTYPES_PRI], +[ + AC_REQUIRE([gt_HEADER_INTTYPES_H]) + if test $gt_cv_header_inttypes_h = yes; then + AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken], + gt_cv_inttypes_pri_broken, + [ + AC_TRY_COMPILE([#include <inttypes.h> +#ifdef PRId32 +char *p = PRId32; +#endif +], [], gt_cv_inttypes_pri_broken=no, gt_cv_inttypes_pri_broken=yes) + ]) + fi + if test "$gt_cv_inttypes_pri_broken" = yes; then + AC_DEFINE_UNQUOTED(PRI_MACROS_BROKEN, 1, + [Define if <inttypes.h> exists and defines unusable PRI* macros.]) + fi +]) diff --git a/m4/inttypes.m4 b/m4/inttypes.m4 new file mode 100644 index 0000000..ab370ff --- /dev/null +++ b/m4/inttypes.m4 @@ -0,0 +1,27 @@ +# inttypes.m4 serial 1 (gettext-0.11.4) +dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +# Define HAVE_INTTYPES_H if <inttypes.h> exists and doesn't clash with +# <sys/types.h>. + +AC_DEFUN([gt_HEADER_INTTYPES_H], +[ + AC_CACHE_CHECK([for inttypes.h], gt_cv_header_inttypes_h, + [ + AC_TRY_COMPILE( + [#include <sys/types.h> +#include <inttypes.h>], + [], gt_cv_header_inttypes_h=yes, gt_cv_header_inttypes_h=no) + ]) + if test $gt_cv_header_inttypes_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H, 1, + [Define if <inttypes.h> exists and doesn't clash with <sys/types.h>.]) + fi +]) diff --git a/m4/inttypes_h.m4 b/m4/inttypes_h.m4 new file mode 100644 index 0000000..400a111 --- /dev/null +++ b/m4/inttypes_h.m4 @@ -0,0 +1,28 @@ +# inttypes_h.m4 serial 4 (gettext-0.11.4) +dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +# Define HAVE_INTTYPES_H_WITH_UINTMAX if <inttypes.h> exists, +# doesn't clash with <sys/types.h>, and declares uintmax_t. + +AC_DEFUN([jm_AC_HEADER_INTTYPES_H], +[ + AC_CACHE_CHECK([for inttypes.h], jm_ac_cv_header_inttypes_h, + [AC_TRY_COMPILE( + [#include <sys/types.h> +#include <inttypes.h>], + [uintmax_t i = (uintmax_t) -1;], + jm_ac_cv_header_inttypes_h=yes, + jm_ac_cv_header_inttypes_h=no)]) + if test $jm_ac_cv_header_inttypes_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1, +[Define if <inttypes.h> exists, doesn't clash with <sys/types.h>, + and declares uintmax_t. ]) + fi +]) diff --git a/m4/isc-posix.m4 b/m4/isc-posix.m4 new file mode 100644 index 0000000..1319dd1 --- /dev/null +++ b/m4/isc-posix.m4 @@ -0,0 +1,26 @@ +# isc-posix.m4 serial 2 (gettext-0.11.2) +dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +# This file is not needed with autoconf-2.53 and newer. Remove it in 2005. + +# This test replaces the one in autoconf. +# Currently this macro should have the same name as the autoconf macro +# because gettext's gettext.m4 (distributed in the automake package) +# still uses it. Otherwise, the use in gettext.m4 makes autoheader +# give these diagnostics: +# configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX +# configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX + +undefine([AC_ISC_POSIX]) + +AC_DEFUN([AC_ISC_POSIX], + [ + dnl This test replaces the obsolescent AC_ISC_POSIX kludge. + AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"]) + ] +) diff --git a/m4/lcmessage.m4 b/m4/lcmessage.m4 new file mode 100644 index 0000000..ffd4008 --- /dev/null +++ b/m4/lcmessage.m4 @@ -0,0 +1,32 @@ +# lcmessage.m4 serial 3 (gettext-0.11.3) +dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper <drepper@cygnus.com>, 1995. + +# Check whether LC_MESSAGES is available in <locale.h>. + +AC_DEFUN([AM_LC_MESSAGES], +[ + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, + [Define if your <locale.h> file defines LC_MESSAGES.]) + fi +]) diff --git a/m4/lib-ld.m4 b/m4/lib-ld.m4 new file mode 100644 index 0000000..ddb5732 --- /dev/null +++ b/m4/lib-ld.m4 @@ -0,0 +1,97 @@ +# lib-ld.m4 serial 1 (gettext-0.11) +dnl Copyright (C) 1996-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl Subroutines of libtool.m4, +dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision +dnl with libtool.m4. + +dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. +AC_DEFUN([AC_LIB_PROG_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then + acl_cv_prog_gnu_ld=yes +else + acl_cv_prog_gnu_ld=no +fi]) +with_gnu_ld=$acl_cv_prog_gnu_ld +]) + +dnl From libtool-1.4. Sets the variable LD. +AC_DEFUN([AC_LIB_PROG_LD], +[AC_ARG_WITH(gnu-ld, +[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], +test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]* | [A-Za-z]:[\\/]*)] + [re_direlt='/[^/][^/]*/\.\./'] + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(acl_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$acl_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_LIB_PROG_LD_GNU +]) diff --git a/m4/lib-link.m4 b/m4/lib-link.m4 new file mode 100644 index 0000000..6b94251 --- /dev/null +++ b/m4/lib-link.m4 @@ -0,0 +1,554 @@ +# lib-link.m4 serial 3 (gettext-0.11.3) +dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and +dnl augments the CPPFLAGS variable. +AC_DEFUN([AC_LIB_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + ac_cv_lib[]Name[]_libs="$LIB[]NAME" + ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" + ac_cv_lib[]Name[]_cppflags="$INC[]NAME" + ]) + LIB[]NAME="$ac_cv_lib[]Name[]_libs" + LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" + INC[]NAME="$ac_cv_lib[]Name[]_cppflags" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the + dnl results of this search when this library appears as a dependency. + HAVE_LIB[]NAME=yes + undefine([Name]) + undefine([NAME]) +]) + +dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) +dnl searches for libname and the libraries corresponding to explicit and +dnl implicit dependencies, together with the specified include files and +dnl the ability to compile and link the specified testcode. If found, it +dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and +dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and +dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs +dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. +AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + + dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + + dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, + dnl because if the user has installed lib[]Name and not disabled its use + dnl via --without-lib[]Name-prefix, he wants to use it. + ac_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + + AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ + ac_save_LIBS="$LIBS" + LIBS="$LIBS $LIB[]NAME" + AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) + LIBS="$ac_save_LIBS" + ]) + if test "$ac_cv_lib[]Name" = yes; then + HAVE_LIB[]NAME=yes + AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) + AC_MSG_CHECKING([how to link with lib[]$1]) + AC_MSG_RESULT([$LIB[]NAME]) + else + HAVE_LIB[]NAME=no + dnl If $LIB[]NAME didn't lead to a usable library, we don't need + dnl $INC[]NAME either. + CPPFLAGS="$ac_save_CPPFLAGS" + LIB[]NAME= + LTLIB[]NAME= + fi + AC_SUBST([HAVE_LIB]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + undefine([Name]) + undefine([NAME]) +]) + +dnl Determine the platform dependent parameters needed to use rpath: +dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, +dnl hardcode_direct, hardcode_minus_L, +dnl sys_lib_search_path_spec, sys_lib_dlsearch_path_spec. +AC_DEFUN([AC_LIB_RPATH], +[ + AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS + AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld + AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host + AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir + AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + ]) + wl="$acl_cv_wl" + libext="$acl_cv_libext" + shlibext="$acl_cv_shlibext" + hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + hardcode_direct="$acl_cv_hardcode_direct" + hardcode_minus_L="$acl_cv_hardcode_minus_L" + sys_lib_search_path_spec="$acl_cv_sys_lib_search_path_spec" + sys_lib_dlsearch_path_spec="$acl_cv_sys_lib_dlsearch_path_spec" + dnl Determine whether the user wants rpath handling at all. + AC_ARG_ENABLE(rpath, + [ --disable-rpath do not hardcode runtime library paths], + :, enable_rpath=yes) +]) + +dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. +AC_DEFUN([AC_LIB_LINKFLAGS_BODY], +[ + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_ARG_WITH([lib$1-prefix], +[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib + --without-lib$1-prefix don't search for lib$1 in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi +]) + dnl Search the library and its dependencies in $additional_libdir and + dnl $LDFLAGS. Using breadth-first-seach. + LIB[]NAME= + LTLIB[]NAME= + INC[]NAME= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='$1 $2' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + dnl See if it was already located by an earlier AC_LIB_LINKFLAGS + dnl or AC_LIB_HAVE_LINKFLAGS call. + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" + else + dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined + dnl that this library doesn't exist. So just drop it. + : + fi + else + dnl Search the library lib$name in $additional_libdir and $LDFLAGS + dnl and the already constructed $LIBNAME/$LTLIBNAME. + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + dnl Found the library. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + dnl Linking with a shared library. We attempt to hardcode its + dnl directory into the executable's runpath, unless it's the + dnl standard /usr/lib. + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then + dnl No hardcoding is needed. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + dnl The hardcoding into $LIBNAME is system dependent. + if test "$hardcode_direct" = yes; then + dnl Using DIR/libNAME.so during linking hardcodes DIR into the + dnl resulting binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + dnl Rely on "-L$found_dir". + dnl But don't add it if it's already contained in the LDFLAGS + dnl or the already constructed $LIBNAME + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH + dnl here, because this doesn't fit in flags passed to the + dnl compiler. So give up. No hardcoding. This affects only + dnl very old systems. + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + dnl Linking with a static library. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" + else + dnl We shouldn't come here, but anyway it's good to have a + dnl fallback. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" + fi + fi + dnl Assume the include files are nearby. + additional_includedir= + case "$found_dir" in + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + dnl Potentially add $additional_includedir to $INCNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's /usr/local/include and we are using GCC on Linux, + dnl 3. if it's already present in $CPPFLAGS or the already + dnl constructed $INCNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INC[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $INCNAME. + INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + dnl Look for dependencies. + if test -n "$found_la"; then + dnl Read the .la file. It defines the variables + dnl dlname, library_names, old_library, dependency_libs, current, + dnl age, revision, installed, dlopen, dlpreopen, libdir. + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + dnl We use only dependency_libs. + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's /usr/local/lib and we are using GCC on Linux, + dnl 3. if it's already present in $LDFLAGS or the already + dnl constructed $LIBNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LIBNAME. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LTLIBNAME. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + dnl Handle this in the next round. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + dnl Handle this in the next round. Throw away the .la's + dnl directory; it is already contained in a preceding -L + dnl option. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + dnl Most likely an immediate library name. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" + ;; + esac + done + fi + else + dnl Didn't find the library; assume it is in the system directories + dnl known to the linker and runtime loader. (All the system + dnl directories known to the linker should also be known to the + dnl runtime loader, otherwise the system is severely misconfigured.) + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user must + dnl pass all path elements in one option. We can arrange that for a + dnl single library, but not when more than one $LIBNAMEs are used. + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + else + dnl The -rpath options are cumulative. + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + dnl When using libtool, the option that works for both libraries and + dnl executables is -R. The -R options are cumulative. + for found_dir in $ltrpathdirs; do + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" + done + fi +]) + +dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, +dnl unless already present in VAR. +dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes +dnl contains two or three consecutive elements that belong together. +AC_DEFUN([AC_LIB_APPENDTOVAR], +[ + for element in [$2]; do + haveit= + for x in $[$1]; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + [$1]="${[$1]}${[$1]:+ }$element" + fi + done +]) diff --git a/m4/lib-prefix.m4 b/m4/lib-prefix.m4 new file mode 100644 index 0000000..b8b79ab --- /dev/null +++ b/m4/lib-prefix.m4 @@ -0,0 +1,148 @@ +# lib-prefix.m4 serial 1 (gettext-0.11) +dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed +dnl to access previously installed libraries. The basic assumption is that +dnl a user will want packages to use other packages he previously installed +dnl with the same --prefix option. +dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate +dnl libraries, but is otherwise very convenient. +AC_DEFUN([AC_LIB_PREFIX], +[ + AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_ARG_WITH([lib-prefix], +[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib + --without-lib-prefix don't search for libraries in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi +]) + if test $use_additional = yes; then + dnl Potentially add $additional_includedir to $CPPFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's already present in $CPPFLAGS, + dnl 3. if it's /usr/local/include and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + for x in $CPPFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $CPPFLAGS. + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" + fi + fi + fi + fi + dnl Potentially add $additional_libdir to $LDFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's already present in $LDFLAGS, + dnl 3. if it's /usr/local/lib and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + for x in $LDFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LDFLAGS. + LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" + fi + fi + fi + fi + fi +]) + +dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, +dnl acl_final_exec_prefix, containing the values to which $prefix and +dnl $exec_prefix will expand at the end of the configure script. +AC_DEFUN([AC_LIB_PREPARE_PREFIX], +[ + dnl Unfortunately, prefix and exec_prefix get only finally determined + dnl at the end of configure. + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the +dnl variables prefix and exec_prefix bound to the values they will have +dnl at the end of the configure script. +AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], +[ + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + $1 + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" +]) diff --git a/m4/libntlm.m4 b/m4/libntlm.m4 new file mode 100644 index 0000000..4fca159 --- /dev/null +++ b/m4/libntlm.m4 @@ -0,0 +1,76 @@ +dnl Autoconf macros for libntlm +dnl Copyright (C) 2002 Free Software Foundation, Inc. +dnl +dnl This file is free software; as a special exception the author gives +dnl unlimited permission to copy and/or distribute it, with or without +dnl modifications, as long as this notice is preserved. +dnl +dnl This file is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +dnl implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + +dnl AM_PATH_LIBNTLM([MINIMUM-VERSION, +dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]]) +dnl Test for liblibntlm and define LIBNTLM_CFLAGS and LIBNTLM_LIBS +dnl +AC_DEFUN(AM_PATH_LIBNTLM, +[ AC_ARG_WITH(libntlm-prefix, + AC_HELP_STRING([--with-libntlm-prefix=PFX], + [prefix where LIBNTLM is installed (optional)]), + libntlm_config_prefix="$withval", libntlm_config_prefix="") + if test x$libntlm_config_prefix != x ; then + libntlm_config_args="$libntlm_config_args --prefix=$libntlm_config_prefix" + if test x${LIBNTLM_CONFIG+set} != xset ; then + LIBNTLM_CONFIG=$libntlm_config_prefix/bin/libntlm-config + fi + fi + + AC_PATH_PROG(LIBNTLM_CONFIG, libntlm-config, no) + min_libntlm_version=ifelse([$1], ,0.3.0,$1) + AC_MSG_CHECKING(for LIBNTLM - version >= $min_libntlm_version) + ok=no + if test "$LIBNTLM_CONFIG" != "no" ; then + req_major=`echo $min_libntlm_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'` + req_minor=`echo $min_libntlm_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'` + req_micro=`echo $min_libntlm_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'` + libntlm_config_version=`$LIBNTLM_CONFIG $libntlm_config_args --version` + major=`echo $libntlm_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'` + minor=`echo $libntlm_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'` + micro=`echo $libntlm_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\3/'` + if test "$major" -gt "$req_major"; then + ok=yes + else + if test "$major" -eq "$req_major"; then + if test "$minor" -gt "$req_minor"; then + ok=yes + else + if test "$minor" -eq "$req_minor"; then + if test "$micro" -ge "$req_micro"; then + ok=yes + fi + fi + fi + fi + fi + fi + if test $ok = yes; then + LIBNTLM_CFLAGS=`$LIBNTLM_CONFIG $libntlm_config_args --cflags` + LIBNTLM_LIBS=`$LIBNTLM_CONFIG $libntlm_config_args --libs` + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + LIBNTLM_CFLAGS="" + LIBNTLM_LIBS="" + AC_MSG_RESULT(no) + ifelse([$3], , :, [$3]) + fi + AC_SUBST(LIBNTLM_CFLAGS) + AC_SUBST(LIBNTLM_LIBS) +]) diff --git a/m4/progtest.m4 b/m4/progtest.m4 new file mode 100644 index 0000000..443c8e3 --- /dev/null +++ b/m4/progtest.m4 @@ -0,0 +1,59 @@ +# progtest.m4 serial 2 (gettext-0.10.40) +dnl Copyright (C) 1996-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper <drepper@cygnus.com>, 1996. + +# Search path for a program which passes the given test. + +dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +AC_DEFUN([AM_PATH_PROG_WITH_TEST], +[# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + /*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in ifelse([$5], , $PATH, [$5]); do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) diff --git a/m4/stdint_h.m4 b/m4/stdint_h.m4 new file mode 100644 index 0000000..4b5a4ac --- /dev/null +++ b/m4/stdint_h.m4 @@ -0,0 +1,28 @@ +# stdint_h.m4 serial 2 (gettext-0.11.4) +dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +# Define HAVE_STDINT_H_WITH_UINTMAX if <stdint.h> exists, +# doesn't clash with <sys/types.h>, and declares uintmax_t. + +AC_DEFUN([jm_AC_HEADER_STDINT_H], +[ + AC_CACHE_CHECK([for stdint.h], jm_ac_cv_header_stdint_h, + [AC_TRY_COMPILE( + [#include <sys/types.h> +#include <stdint.h>], + [uintmax_t i = (uintmax_t) -1;], + jm_ac_cv_header_stdint_h=yes, + jm_ac_cv_header_stdint_h=no)]) + if test $jm_ac_cv_header_stdint_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1, +[Define if <stdint.h> exists, doesn't clash with <sys/types.h>, + and declares uintmax_t. ]) + fi +]) diff --git a/m4/uintmax_t.m4 b/m4/uintmax_t.m4 new file mode 100644 index 0000000..ec3a8b9 --- /dev/null +++ b/m4/uintmax_t.m4 @@ -0,0 +1,29 @@ +# uintmax_t.m4 serial 6 (gettext-0.11) +dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +AC_PREREQ(2.13) + +# Define uintmax_t to `unsigned long' or `unsigned long long' +# if <inttypes.h> does not exist. + +AC_DEFUN([jm_AC_TYPE_UINTMAX_T], +[ + AC_REQUIRE([jm_AC_HEADER_INTTYPES_H]) + AC_REQUIRE([jm_AC_HEADER_STDINT_H]) + if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then + AC_REQUIRE([jm_AC_TYPE_UNSIGNED_LONG_LONG]) + test $ac_cv_type_unsigned_long_long = yes \ + && ac_type='unsigned long long' \ + || ac_type='unsigned long' + AC_DEFINE_UNQUOTED(uintmax_t, $ac_type, + [Define to unsigned long or unsigned long long + if <inttypes.h> and <stdint.h> don't define.]) + fi +]) diff --git a/m4/ulonglong.m4 b/m4/ulonglong.m4 new file mode 100644 index 0000000..c375e47 --- /dev/null +++ b/m4/ulonglong.m4 @@ -0,0 +1,23 @@ +# ulonglong.m4 serial 2 (fileutils-4.0.32, gettext-0.10.40) +dnl Copyright (C) 1999-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +AC_DEFUN([jm_AC_TYPE_UNSIGNED_LONG_LONG], +[ + AC_CACHE_CHECK([for unsigned long long], ac_cv_type_unsigned_long_long, + [AC_TRY_LINK([unsigned long long ull = 1; int i = 63;], + [unsigned long long ullmax = (unsigned long long) -1; + return ull << i | ull >> i | ullmax / ull | ullmax % ull;], + ac_cv_type_unsigned_long_long=yes, + ac_cv_type_unsigned_long_long=no)]) + if test $ac_cv_type_unsigned_long_long = yes; then + AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1, + [Define if you have the unsigned long long type.]) + fi +]) diff --git a/po/ChangeLog b/po/ChangeLog new file mode 100644 index 0000000..380ede0 --- /dev/null +++ b/po/ChangeLog @@ -0,0 +1,11 @@ +2002-10-07 gettextize <bug-gnu-gettext@gnu.org> + + * Makefile.in.in: New file, from gettext-0.11.5. + * Rules-quot: New file, from gettext-0.11.5. + * boldquot.sed: New file, from gettext-0.11.5. + * en@boldquot.header: New file, from gettext-0.11.5. + * en@quot.header: New file, from gettext-0.11.5. + * insert-header.sin: New file, from gettext-0.11.5. + * quot.sed: New file, from gettext-0.11.5. + * remove-potcdate.sin: New file, from gettext-0.11.5. + diff --git a/po/LINGUAS b/po/LINGUAS new file mode 100644 index 0000000..13ff50d --- /dev/null +++ b/po/LINGUAS @@ -0,0 +1,2 @@ +# Set of available languages. +sv diff --git a/po/Makefile.in.in b/po/Makefile.in.in new file mode 100644 index 0000000..ada8bb4 --- /dev/null +++ b/po/Makefile.in.in @@ -0,0 +1,317 @@ +# Makefile for PO directory in any package using GNU gettext. +# Copyright (C) 1995-1997, 2000-2002 by Ulrich Drepper <drepper@gnu.ai.mit.edu> +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU General Public +# License but which still want to provide support for the GNU gettext +# functionality. +# Please note that the actual code of GNU gettext is covered by the GNU +# General Public License and is *not* in the public domain. + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +SHELL = /bin/sh +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datadir = @datadir@ +localedir = $(datadir)/locale +gettextsrcdir = $(datadir)/gettext/po + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +mkinstalldirs = $(SHELL) `case "$(MKINSTALLDIRS)" in /*) echo "$(MKINSTALLDIRS)" ;; *) echo "$(top_builddir)/$(MKINSTALLDIRS)" ;; esac` + +GMSGFMT = @GMSGFMT@ +MSGFMT = @MSGFMT@ +XGETTEXT = @XGETTEXT@ +MSGMERGE = msgmerge +MSGMERGE_UPDATE = @MSGMERGE@ --update +MSGINIT = msginit +MSGCONV = msgconv +MSGFILTER = msgfilter + +POFILES = @POFILES@ +GMOFILES = @GMOFILES@ +UPDATEPOFILES = @UPDATEPOFILES@ +DUMMYPOFILES = @DUMMYPOFILES@ +DISTFILES.common = Makefile.in.in Makevars remove-potcdate.sin \ +$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) +DISTFILES = $(DISTFILES.common) POTFILES.in $(DOMAIN).pot \ +$(POFILES) $(GMOFILES) \ +$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) + +POTFILES = \ + +CATALOGS = @CATALOGS@ + +# Makevars gets inserted here. (Don't remove this line!) + +.SUFFIXES: +.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-update + +.po.mo: + @echo "$(MSGFMT) -c -o $@ $<"; \ + $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ + +.po.gmo: + @lang=`echo $* | sed -e 's,.*/,,'`; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ + cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo + +.sin.sed: + sed -e '/^#/d' $< > t-$@ + mv t-$@ $@ + + +all: all-@USE_NLS@ + +all-yes: $(CATALOGS) +all-no: + +# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', +# otherwise packages like GCC can not be built if only parts of the source +# have been downloaded. + +$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ + --files-from=$(srcdir)/POTFILES.in \ + --copyright-holder='$(COPYRIGHT_HOLDER)' + test ! -f $(DOMAIN).po || { \ + if test -f $(srcdir)/$(DOMAIN).pot; then \ + sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ + sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ + if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ + else \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + else \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + } + +$(srcdir)/$(DOMAIN).pot: + $(MAKE) $(DOMAIN).pot-update + +$(POFILES): $(srcdir)/$(DOMAIN).pot + @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ + cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot + + +install: install-exec install-data +install-exec: +install-data: install-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext"; then \ + $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ + for file in $(DISTFILES.common); do \ + $(INSTALL_DATA) $(srcdir)/$$file \ + $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +install-data-no: all +install-data-yes: all + $(mkinstalldirs) $(DESTDIR)$(datadir) + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkinstalldirs) $(DESTDIR)$$dir; \ + if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ + $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ + echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ + fi; \ + done; \ + done + +install-strip: install + +installdirs: installdirs-exec installdirs-data +installdirs-exec: +installdirs-data: installdirs-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext"; then \ + $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ + else \ + : ; \ + fi +installdirs-data-no: +installdirs-data-yes: + $(mkinstalldirs) $(DESTDIR)$(datadir) + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkinstalldirs) $(DESTDIR)$$dir; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + fi; \ + done; \ + done + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: uninstall-exec uninstall-data +uninstall-exec: +uninstall-data: uninstall-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext"; then \ + for file in $(DISTFILES.common); do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +uninstall-data-no: +uninstall-data-yes: + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + done; \ + done + +check: all + +dvi info tags TAGS ID: + +mostlyclean: + rm -f remove-potcdate.sed + rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po + rm -fr *.o + +clean: mostlyclean + +distclean: clean + rm -f Makefile Makefile.in POTFILES *.mo + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + rm -f $(GMOFILES) + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: + $(MAKE) update-po + @$(MAKE) dist2 +# This is a separate target because 'update-po' must be executed before. +dist2: $(DISTFILES) + dists="$(DISTFILES)"; \ + if test -f $(srcdir)/ChangeLog; then dists="$$dists ChangeLog"; fi; \ + if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ + for file in $$dists; do \ + if test -f $$file; then \ + cp -p $$file $(distdir); \ + else \ + cp -p $(srcdir)/$$file $(distdir); \ + fi; \ + done + +update-po: Makefile + $(MAKE) $(DOMAIN).pot-update + $(MAKE) $(UPDATEPOFILES) + $(MAKE) update-gmo + +# General rule for updating PO files. + +.nop.po-update: + @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ + if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; fi; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ + cd $(srcdir); \ + if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "msgmerge for $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +$(DUMMYPOFILES): + +update-gmo: Makefile $(GMOFILES) + @: + +Makefile: Makefile.in.in $(top_builddir)/config.status POTFILES.in + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \ + $(SHELL) ./config.status + +force: + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/po/Makevars b/po/Makevars new file mode 100644 index 0000000..eb671da --- /dev/null +++ b/po/Makevars @@ -0,0 +1,25 @@ +# Makefile variables for PO directory in any package using GNU gettext. + +# Usually the message domain is the same as the package name. +DOMAIN = $(PACKAGE) + +# These two variables depend on the location of this directory. +subdir = po +top_builddir = .. + +# These options get passed to xgettext. +XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ + +# This is the copyright holder that gets inserted into the header of the +# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding +# package. (Note that the msgstr strings, extracted from the package's +# sources, belong to the copyright holder of the package.) Translators are +# expected to transfer the copyright for their translations to this person +# or entity, or to disclaim their copyright. The empty string stands for +# the public domain; in this case the translators are expected to disclaim +# their copyright. +COPYRIGHT_HOLDER = Simon Josefsson + +# This is the list of locale categories, beyond LC_MESSAGES, for which the +# message catalogs shall be used. It is usually empty. +EXTRA_LOCALE_CATEGORIES = diff --git a/po/Makevars.template b/po/Makevars.template new file mode 100644 index 0000000..8b09f53 --- /dev/null +++ b/po/Makevars.template @@ -0,0 +1,25 @@ +# Makefile variables for PO directory in any package using GNU gettext. + +# Usually the message domain is the same as the package name. +DOMAIN = $(PACKAGE) + +# These two variables depend on the location of this directory. +subdir = po +top_builddir = .. + +# These options get passed to xgettext. +XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ + +# This is the copyright holder that gets inserted into the header of the +# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding +# package. (Note that the msgstr strings, extracted from the package's +# sources, belong to the copyright holder of the package.) Translators are +# expected to transfer the copyright for their translations to this person +# or entity, or to disclaim their copyright. The empty string stands for +# the public domain; in this case the translators are expected to disclaim +# their copyright. +COPYRIGHT_HOLDER = Free Software Foundation, Inc. + +# This is the list of locale categories, beyond LC_MESSAGES, for which the +# message catalogs shall be used. It is usually empty. +EXTRA_LOCALE_CATEGORIES = diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 0000000..ff52eb1 --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,5 @@ +# List of source files containing translatable strings for libgsasl. +# Copyright (c) 2002 by Simon Josefsson + +lib/error.c +lib/hexdump.c diff --git a/po/Rules-quot b/po/Rules-quot new file mode 100644 index 0000000..5f46d23 --- /dev/null +++ b/po/Rules-quot @@ -0,0 +1,42 @@ +# Special Makefile rules for English message catalogs with quotation marks. + +DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot + +.SUFFIXES: .insert-header .po-update-en + +en@quot.po-update: en@quot.po-update-en +en@boldquot.po-update: en@boldquot.po-update-en + +.insert-header.po-update-en: + @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ + if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + ll=`echo $$lang | sed -e 's/@.*//'`; \ + LC_ALL=C; export LC_ALL; \ + cd $(srcdir); \ + if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "creation of $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +en@quot.insert-header: insert-header.sin + sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header + +en@boldquot.insert-header: insert-header.sin + sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header + +mostlyclean: mostlyclean-quot +mostlyclean-quot: + rm -f *.insert-header diff --git a/po/boldquot.sed b/po/boldquot.sed new file mode 100644 index 0000000..4b937aa --- /dev/null +++ b/po/boldquot.sed @@ -0,0 +1,10 @@ +s/"\([^"]*\)"/“\1”/g +s/`\([^`']*\)'/‘\1’/g +s/ '\([^`']*\)' / ‘\1’ /g +s/ '\([^`']*\)'$/ ‘\1’/g +s/^'\([^`']*\)' /‘\1’ /g +s/“”/""/g +s/“/“/g +s/”/”/g +s/‘/‘/g +s/’/’/g diff --git a/po/en@boldquot.header b/po/en@boldquot.header new file mode 100644 index 0000000..fedb6a0 --- /dev/null +++ b/po/en@boldquot.header @@ -0,0 +1,25 @@ +# All this catalog "translates" are quotation characters. +# The msgids must be ASCII and therefore cannot contain real quotation +# characters, only substitutes like grave accent (0x60), apostrophe (0x27) +# and double quote (0x22). These substitutes look strange; see +# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html +# +# This catalog translates grave accent (0x60) and apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019). +# It also translates pairs of apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019) +# and pairs of quotation mark (0x22) to +# left double quotation mark (U+201C) and right double quotation mark (U+201D). +# +# When output to an UTF-8 terminal, the quotation characters appear perfectly. +# When output to an ISO-8859-1 terminal, the single quotation marks are +# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to +# grave/acute accent (by libiconv), and the double quotation marks are +# transliterated to 0x22. +# When output to an ASCII terminal, the single quotation marks are +# transliterated to apostrophes, and the double quotation marks are +# transliterated to 0x22. +# +# This catalog furthermore displays the text between the quotation marks in +# bold face, assuming the VT100/XTerm escape sequences. +# diff --git a/po/en@quot.header b/po/en@quot.header new file mode 100644 index 0000000..a9647fc --- /dev/null +++ b/po/en@quot.header @@ -0,0 +1,22 @@ +# All this catalog "translates" are quotation characters. +# The msgids must be ASCII and therefore cannot contain real quotation +# characters, only substitutes like grave accent (0x60), apostrophe (0x27) +# and double quote (0x22). These substitutes look strange; see +# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html +# +# This catalog translates grave accent (0x60) and apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019). +# It also translates pairs of apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019) +# and pairs of quotation mark (0x22) to +# left double quotation mark (U+201C) and right double quotation mark (U+201D). +# +# When output to an UTF-8 terminal, the quotation characters appear perfectly. +# When output to an ISO-8859-1 terminal, the single quotation marks are +# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to +# grave/acute accent (by libiconv), and the double quotation marks are +# transliterated to 0x22. +# When output to an ASCII terminal, the single quotation marks are +# transliterated to apostrophes, and the double quotation marks are +# transliterated to 0x22. +# diff --git a/po/insert-header.sin b/po/insert-header.sin new file mode 100644 index 0000000..b26de01 --- /dev/null +++ b/po/insert-header.sin @@ -0,0 +1,23 @@ +# Sed script that inserts the file called HEADER before the header entry. +# +# At each occurrence of a line starting with "msgid ", we execute the following +# commands. At the first occurrence, insert the file. At the following +# occurrences, do nothing. The distinction between the first and the following +# occurrences is achieved by looking at the hold space. +/^msgid /{ +x +# Test if the hold space is empty. +s/m/m/ +ta +# Yes it was empty. First occurrence. Read the file. +r HEADER +# Output the file's contents by reading the next line. But don't lose the +# current line while doing this. +g +N +bb +:a +# The hold space was nonempty. Following occurrences. Do nothing. +x +:b +} diff --git a/po/libgsasl.pot b/po/libgsasl.pot new file mode 100644 index 0000000..552f2bb --- /dev/null +++ b/po/libgsasl.pot @@ -0,0 +1,232 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Simon Josefsson +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-10-05 05:58+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/error.c:41 +msgid "Libgsasl success" +msgstr "" + +#: lib/error.c:45 +msgid "SASL mechanisms needs more data (application error)" +msgstr "" + +#: lib/error.c:49 +msgid "Unknown SASL mechanism (application error)" +msgstr "" + +#: lib/error.c:53 +msgid "SASL mechanism called too many times (application error)" +msgstr "" + +#: lib/error.c:57 +msgid "SASL function need larger buffer (application error)" +msgstr "" + +#: lib/error.c:61 +msgid "Could not open file in SASL library" +msgstr "" + +#: lib/error.c:65 +msgid "Could not close file in SASL library" +msgstr "" + +#: lib/error.c:69 +msgid "Memory allocation error in SASL library" +msgstr "" + +#: lib/error.c:73 +msgid "Base 64 coding error in SASL library" +msgstr "" + +#: lib/error.c:77 +msgid "Gcrypt error in SASL library" +msgstr "" + +#: lib/error.c:81 +msgid "" +"GSSAPI library could not deallocate memory in gss_release_buffer() in SASL " +"library. This is a serious internal error." +msgstr "" + +#: lib/error.c:85 +msgid "" +"GSSAPI library could not understand a peer name in gss_import_name() in SASL " +"library. This may be due to incorrect user supplied data." +msgstr "" + +#: lib/error.c:89 +msgid "" +"GSSAPI error in client while negotiating security context in " +"gss_init_sec_context() in SASL library. This is most likely due " +"insufficient credentials or malicious interactions." +msgstr "" + +#: lib/error.c:93 +msgid "" +"GSSAPI error in server while negotiating security context in " +"gss_init_sec_context() in SASL library. This is most likely due " +"insufficient credentials or malicious interactions." +msgstr "" + +#: lib/error.c:97 +msgid "" +"GSSAPI error while decrypting or decoding data in gss_unwrap() in SASL " +"library. This is most likely due to data corruption." +msgstr "" + +#: lib/error.c:101 +msgid "" +"GSSAPI error while encrypting or encoding data in gss_wrap() in SASL library." +msgstr "" + +#: lib/error.c:105 +msgid "" +"GSSAPI error acquiring credentials in gss_acquire_cred() in SASL library. " +"This is most likely due to not having the proper Kerberos key available in /" +"etc/krb5.keytab on the server." +msgstr "" + +#: lib/error.c:109 +msgid "" +"GSSAPI error creating a display name denoting the client in gss_display_name" +"() in SASL library. This is probably because the client suplied bad data." +msgstr "" + +#: lib/error.c:113 +msgid "" +"Other entity requested integrity or confidentiality protection in GSSAPI " +"mechanism but this is currently not implemented." +msgstr "" + +#: lib/error.c:117 +msgid "" +"SASL mechanism needs gsasl_client_callback_anonymous() callback (application " +"error)" +msgstr "" + +#: lib/error.c:121 +msgid "" +"SASL mechanism needs gsasl_client_callback_password() callback (application " +"error)" +msgstr "" + +#: lib/error.c:125 +msgid "" +"SASL mechanism needs gsasl_client_callback_passcode() callback (application " +"error)" +msgstr "" + +#: lib/error.c:129 +msgid "" +"SASL mechanism needs gsasl_client_callback_pin() callback (application error)" +msgstr "" + +#: lib/error.c:133 +msgid "" +"SASL mechanism needs gsasl_client_callback_authorization_id() callback " +"(application error)" +msgstr "" + +#: lib/error.c:137 +msgid "" +"SASL mechanism needs gsasl_client_callback_authentication_id() callback " +"(application error)" +msgstr "" + +#: lib/error.c:141 +msgid "" +"SASL mechanism needs gsasl_client_callback_service() callback (application " +"error)" +msgstr "" + +#: lib/error.c:145 +msgid "" +"SASL mechanism needs gsasl_server_callback_validate() callback (application " +"error)" +msgstr "" + +#: lib/error.c:149 +msgid "" +"SASL mechanism needs gsasl_server_callback_cram_md5() callback (application " +"error)" +msgstr "" + +#: lib/error.c:153 +msgid "" +"SASL mechanism needs gsasl_server_callback_digest_md5() callback " +"(application error)" +msgstr "" + +#: lib/error.c:157 +msgid "" +"SASL mechanism needs gsasl_server_callback_anonymous() callback (application " +"error)" +msgstr "" + +#: lib/error.c:161 +msgid "" +"SASL mechanism needs gsasl_server_callback_external() callback (application " +"error)" +msgstr "" + +#: lib/error.c:165 +msgid "" +"SASL mechanism needs gsasl_server_callback_realm() callback (application " +"error)" +msgstr "" + +#: lib/error.c:169 +msgid "" +"SASL mechanism needs gsasl_server_callback_securid() callback (application " +"error)" +msgstr "" + +#: lib/error.c:173 +msgid "" +"SASL mechanism needs gsasl_server_callback_service() callback (application " +"error)" +msgstr "" + +#: lib/error.c:177 +msgid "" +"SASL mechanism needs gsasl_server_callback_gssapi() callback (application " +"error)" +msgstr "" + +#: lib/error.c:181 +msgid "SASL mechanism could not parse input" +msgstr "" + +#: lib/error.c:185 +msgid "Error authentication user" +msgstr "" + +#: lib/error.c:189 +msgid "Cannot get internal library handle (library error)" +msgstr "" + +#: lib/error.c:193 +msgid "No more realms available (non-fatal)" +msgstr "" + +#: lib/error.c:197 +msgid "Libgsasl unknown error" +msgstr "" + +#: lib/hexdump.c:39 +#, c-format +msgid "%d: hex %02X dec %d ascii %c\n" +msgstr "" diff --git a/po/quot.sed b/po/quot.sed new file mode 100644 index 0000000..0122c46 --- /dev/null +++ b/po/quot.sed @@ -0,0 +1,6 @@ +s/"\([^"]*\)"/“\1”/g +s/`\([^`']*\)'/‘\1’/g +s/ '\([^`']*\)' / ‘\1’ /g +s/ '\([^`']*\)'$/ ‘\1’/g +s/^'\([^`']*\)' /‘\1’ /g +s/“”/""/g diff --git a/po/remove-potcdate.sin b/po/remove-potcdate.sin new file mode 100644 index 0000000..2436c49 --- /dev/null +++ b/po/remove-potcdate.sin @@ -0,0 +1,19 @@ +# Sed script that remove the POT-Creation-Date line in the header entry +# from a POT file. +# +# The distinction between the first and the following occurrences of the +# pattern is achieved by looking at the hold space. +/^"POT-Creation-Date: .*"$/{ +x +# Test if the hold space is empty. +s/P/P/ +ta +# Yes it was empty. First occurrence. Remove the line. +g +d +bb +:a +# The hold space was nonempty. Following occurrences. Do nothing. +x +:b +} diff --git a/po/sv.po b/po/sv.po new file mode 100644 index 0000000..4cd5993 --- /dev/null +++ b/po/sv.po @@ -0,0 +1,266 @@ +# Swedish translations for libgsasl package +# Svenska översättningar för paket libgsasl. +# Copyright (C) 2002 Simon Josefsson. +# Simon Josefsson <simon@josefsson.org>, 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: GNU libgsasl 0.0\n" +"POT-Creation-Date: 2002-10-05 05:58+0200\n" +"PO-Revision-Date: 2002-10-05 19:32+0200\n" +"Last-Translator: Simon Josefsson <simon@josefsson.org>\n" +"Language-Team: Swedish <sv@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: lib/error.c:41 +msgid "Libgsasl success" +msgstr "Libgsasl lyckades" + +#: lib/error.c:45 +msgid "SASL mechanisms needs more data (application error)" +msgstr "SASL mekanismen behöver mer data (applikationsfel)" + +#: lib/error.c:49 +msgid "Unknown SASL mechanism (application error)" +msgstr "Okänd SASL mekanism (applikationsfel)" + +#: lib/error.c:53 +msgid "SASL mechanism called too many times (application error)" +msgstr "SASL mekanism anropad för många gånger (applikationsfel)" + +#: lib/error.c:57 +msgid "SASL function need larger buffer (application error)" +msgstr "SASL funktion behöver större buffer (applikationsfel)" + +#: lib/error.c:61 +#, fuzzy +msgid "Could not open file in SASL library" +msgstr "Minnesallokeringsfel i SASL-biblioteket" + +#: lib/error.c:65 +#, fuzzy +msgid "Could not close file in SASL library" +msgstr "Minnesallokeringsfel i SASL-biblioteket" + +#: lib/error.c:69 +msgid "Memory allocation error in SASL library" +msgstr "Minnesallokeringsfel i SASL-biblioteket" + +#: lib/error.c:73 +msgid "Base 64 coding error in SASL library" +msgstr "Bas 64 kodningsfel i SASL-biblioteket" + +#: lib/error.c:77 +msgid "Gcrypt error in SASL library" +msgstr "Fel från gcrypt i SASL-biblioteket" + +#: lib/error.c:81 +msgid "" +"GSSAPI library could not deallocate memory in gss_release_buffer() in SASL " +"library. This is a serious internal error." +msgstr "" + +#: lib/error.c:85 +msgid "" +"GSSAPI library could not understand a peer name in gss_import_name() in SASL " +"library. This may be due to incorrect user supplied data." +msgstr "" + +#: lib/error.c:89 +msgid "" +"GSSAPI error in client while negotiating security context in " +"gss_init_sec_context() in SASL library. This is most likely due " +"insufficient credentials or malicious interactions." +msgstr "" + +#: lib/error.c:93 +msgid "" +"GSSAPI error in server while negotiating security context in " +"gss_init_sec_context() in SASL library. This is most likely due " +"insufficient credentials or malicious interactions." +msgstr "" + +#: lib/error.c:97 +msgid "" +"GSSAPI error while decrypting or decoding data in gss_unwrap() in SASL " +"library. This is most likely due to data corruption." +msgstr "" + +#: lib/error.c:101 +msgid "" +"GSSAPI error while encrypting or encoding data in gss_wrap() in SASL library." +msgstr "" + +#: lib/error.c:105 +msgid "" +"GSSAPI error acquiring credentials in gss_acquire_cred() in SASL library. " +"This is most likely due to not having the proper Kerberos key available in /" +"etc/krb5.keytab on the server." +msgstr "" + +#: lib/error.c:109 +msgid "" +"GSSAPI error creating a display name denoting the client in gss_display_name" +"() in SASL library. This is probably because the client suplied bad data." +msgstr "" + +#: lib/error.c:113 +msgid "" +"Other entity requested integrity or confidentiality protection in GSSAPI " +"mechanism but this is currently not implemented." +msgstr "" + +#: lib/error.c:117 +#, fuzzy +msgid "" +"SASL mechanism needs gsasl_client_callback_anonymous() callback (application " +"error)" +msgstr "SASL mekanismen behöver mer data (applikationsfel)" + +#: lib/error.c:121 +#, fuzzy +msgid "" +"SASL mechanism needs gsasl_client_callback_password() callback (application " +"error)" +msgstr "SASL mekanismen behöver mer data (applikationsfel)" + +#: lib/error.c:125 +#, fuzzy +msgid "" +"SASL mechanism needs gsasl_client_callback_passcode() callback (application " +"error)" +msgstr "SASL mekanismen behöver mer data (applikationsfel)" + +#: lib/error.c:129 +#, fuzzy +msgid "" +"SASL mechanism needs gsasl_client_callback_pin() callback (application error)" +msgstr "SASL mekanismen behöver mer data (applikationsfel)" + +#: lib/error.c:133 +#, fuzzy +msgid "" +"SASL mechanism needs gsasl_client_callback_authorization_id() callback " +"(application error)" +msgstr "SASL mekanismen behöver mer data (applikationsfel)" + +#: lib/error.c:137 +#, fuzzy +msgid "" +"SASL mechanism needs gsasl_client_callback_authentication_id() callback " +"(application error)" +msgstr "SASL mekanismen behöver mer data (applikationsfel)" + +#: lib/error.c:141 +#, fuzzy +msgid "" +"SASL mechanism needs gsasl_client_callback_service() callback (application " +"error)" +msgstr "SASL mekanismen behöver mer data (applikationsfel)" + +#: lib/error.c:145 +#, fuzzy +msgid "" +"SASL mechanism needs gsasl_server_callback_validate() callback (application " +"error)" +msgstr "SASL mekanismen behöver mer data (applikationsfel)" + +#: lib/error.c:149 +#, fuzzy +msgid "" +"SASL mechanism needs gsasl_server_callback_cram_md5() callback (application " +"error)" +msgstr "SASL mekanismen behöver mer data (applikationsfel)" + +#: lib/error.c:153 +#, fuzzy +msgid "" +"SASL mechanism needs gsasl_server_callback_digest_md5() callback " +"(application error)" +msgstr "SASL mekanismen behöver mer data (applikationsfel)" + +#: lib/error.c:157 +#, fuzzy +msgid "" +"SASL mechanism needs gsasl_server_callback_anonymous() callback (application " +"error)" +msgstr "SASL mekanismen behöver mer data (applikationsfel)" + +#: lib/error.c:161 +#, fuzzy +msgid "" +"SASL mechanism needs gsasl_server_callback_external() callback (application " +"error)" +msgstr "SASL mekanismen behöver mer data (applikationsfel)" + +#: lib/error.c:165 +#, fuzzy +msgid "" +"SASL mechanism needs gsasl_server_callback_realm() callback (application " +"error)" +msgstr "SASL mekanismen behöver mer data (applikationsfel)" + +#: lib/error.c:169 +#, fuzzy +msgid "" +"SASL mechanism needs gsasl_server_callback_securid() callback (application " +"error)" +msgstr "SASL mekanismen behöver mer data (applikationsfel)" + +#: lib/error.c:173 +#, fuzzy +msgid "" +"SASL mechanism needs gsasl_server_callback_service() callback (application " +"error)" +msgstr "SASL mekanismen behöver mer data (applikationsfel)" + +#: lib/error.c:177 +#, fuzzy +msgid "" +"SASL mechanism needs gsasl_server_callback_gssapi() callback (application " +"error)" +msgstr "SASL mekanismen behöver mer data (applikationsfel)" + +#: lib/error.c:181 +msgid "SASL mechanism could not parse input" +msgstr "SASL mekanism kunde inte tolka indata" + +#: lib/error.c:185 +msgid "Error authentication user" +msgstr "Fel vid autentisering av användare" + +#: lib/error.c:189 +msgid "Cannot get internal library handle (library error)" +msgstr "Kan inte hämta internt bibliotekskontext (biblioteksfel)" + +#: lib/error.c:193 +msgid "No more realms available (non-fatal)" +msgstr "" + +#: lib/error.c:197 +msgid "Libgsasl unknown error" +msgstr "Okänt fel i libgsasl" + +#: lib/hexdump.c:39 +#, c-format +msgid "%d: hex %02X dec %d ascii %c\n" +msgstr "" + +#, fuzzy +#~ msgid "Password for authentication." +#~ msgstr "Fel vid autentisering av användare" + +#, fuzzy +#~ msgid "Libgsasl wants to use:\n" +#~ msgstr "Libgsasl lyckades" + +#, fuzzy +#~ msgid "Libgsasl error (%d): %s\n" +#~ msgstr "Okänt fel i libgsasl" + +#, fuzzy +#~ msgid "GSSAPI error in SASL library" +#~ msgstr "Fel från gcrypt i SASL-biblioteket" diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..a4f1338 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,34 @@ +## Process this file with automake to produce Makefile.in +# Copyright (C) 2002 Simon Josefsson. +# +# This file is part of Libgsasl. +# +# Libgsasl is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of +# the License, or (at your option) any later version. +# +# Libgsasl 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 program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +SUBDIRS=libcharset + +EXTRA_DIST = libgsasl-config.in libgsasl.m4 + +INCLUDES = -I../lib -I../argp -I../intl + +bin_SCRIPTS = libgsasl-config + +m4datadir = $(datadir)/aclocal +m4data_DATA = libgsasl.m4 + +bin_PROGRAMS = gsasl + +gsasl_SOURCES = gsasl.c callbacks.h callbacks.c gettext.h +gsasl_LDADD = ../lib/libgsasl.la @LIBARGP@ libcharset/libcharset.la diff --git a/src/callbacks.c b/src/callbacks.c new file mode 100644 index 0000000..ffd5281 --- /dev/null +++ b/src/callbacks.c @@ -0,0 +1,525 @@ +/* callbacks.c implementation of gsasl callbacks + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Libgsasl 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include <stdio.h> +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#ifdef HAVE_NETDB_H +#include <netdb.h> +#endif +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif +#ifdef HAVE_LOCALE_H +#include <locale.h> +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include <memory.h> +# endif +# include <string.h> +#endif +#if HAVE_STRINGS_H +# include <strings.h> +#endif +#include <argp.h> +#include <gsasl.h> + +#ifdef HAVE_ICONV_H +#include <iconv.h> +#endif + +#include "libcharset/libcharset.h" + +#define MAX_LINE_LENGTH BUFSIZ + +extern int silent; +extern int verbose; +extern char *anonymous_token; +extern char *authentication_id; +extern char *authorization_id; +extern char *password; +extern char *passcode; +extern char *mechanism; +extern char *service; +extern char *hostname; +extern char *servicename; +extern char **realms; +extern size_t nrealms; +extern int maxbuf; + +static char * +readline (const char *prompt) +{ + static char line[MAX_LINE_LENGTH]; + + printf("%s", prompt); + + line[0] = '\0'; + fgets(line, MAX_LINE_LENGTH, stdin); + line[strlen(line)-1] = '\0'; + + return line; +} + +static int +utf8cpy (char *dst, size_t *dstlen, char *src, size_t srclen) +{ + int nonasciiflag = 0; + int i; +#ifdef HAVE_ICONV + const char *charset; + iconv_t cd; + + charset = _gsasl_locale_charset(); + if (charset && strcmp(charset, "UTF-8") == 0) + { + if (dst && *dstlen < srclen) + return GSASL_TOO_SMALL_BUFFER; + + *dstlen = srclen; + if (dst) + memcpy(dst, src, srclen); + return GSASL_OK; + } + + cd = iconv_open ("UTF-8", charset); + if (cd != (iconv_t) -1) + { + size_t n; + + n = iconv(cd, &src, &srclen, &dst, dstlen); + if (n != (size_t) -1) + { + iconv_close(cd); + return GSASL_OK; + } + fprintf(stderr, " ** iconv() failed to convert data from %s to UTF-8\n", + charset); + fprintf(stderr, " ** check the system locale configuration\n"); + } + else + { + fprintf(stderr, " ** iconv_open() failed to find wanted conversion\n"); + } + fprintf(stderr, " ** trating input as ASCII\n"); +#else + fprintf(stderr, " ** iconv() not present, non-ASCII not supported\n"); + fprintf(stderr, " ** http://www.gnu.org/software/libiconv/\n"); +#endif + + if (dst && *dstlen < srclen) + return GSASL_TOO_SMALL_BUFFER; + + *dstlen = srclen; + for (i = 0; i < srclen; i++) + { + if (src[i] & 0x80) + nonasciiflag = 1; + dst[i] = src[i] & 0x7F; + } + + if (nonasciiflag) + { + fprintf(stderr, " ** bit 8 stripped from string\n"); + fprintf(stderr, " ** original string: `%s'\n", src); + fprintf(stderr, " ** stripped string: `%s'\n", dst); + } + + return GSASL_OK; +} + +/* Client callbacks */ + +int +client_callback_anonymous (Gsasl_session_ctx *ctx, + char *out, + size_t *outlen) +{ + int rc; + + if (anonymous_token == NULL) + anonymous_token = + strdup(readline("Enter anonymous token (e.g., email address): ")); + + if (anonymous_token == NULL) + return GSASL_AUTHENTICATION_ERROR; + + rc = utf8cpy(out, outlen, anonymous_token, strlen(anonymous_token)); + if (rc != GSASL_OK) + return rc; + + return GSASL_OK; +} + +int +client_callback_authorization_id (Gsasl_session_ctx *ctx, + char *out, + size_t *outlen) +{ + int rc; + + if (authorization_id == NULL) + authorization_id = strdup(readline("Enter authorization ID: ")); + + if (authorization_id == NULL) + return GSASL_AUTHENTICATION_ERROR; + + rc = utf8cpy(out, outlen, authorization_id, strlen(authorization_id)); + if (rc != GSASL_OK) + return rc; + + return GSASL_OK; +} + +int +client_callback_authentication_id (Gsasl_session_ctx *ctx, + char *out, + size_t *outlen) +{ + int rc; + + if (authentication_id == NULL) + authentication_id = strdup(readline("Enter authentication ID: ")); + + if (authentication_id == NULL) + return GSASL_AUTHENTICATION_ERROR; + + rc = utf8cpy(out, outlen, authentication_id, strlen(authentication_id)); + if (rc != GSASL_OK) + return rc; + + return GSASL_OK; +} + +int +client_callback_password (Gsasl_session_ctx *ctx, + char *out, + size_t *outlen) +{ + int rc; + + if (password == NULL) + password = strdup(readline("Enter password: ")); + + if (password == NULL) + return GSASL_AUTHENTICATION_ERROR; + + rc = utf8cpy(out, outlen, password, strlen(password)); + if (rc != GSASL_OK) + return rc; + + return GSASL_OK; +} + +int +client_callback_service (Gsasl_session_ctx *ctx, + char *srv, + size_t *srvlen, + char *host, + size_t *hostlen, + char *srvname, + size_t *srvnamelen) +{ + int rc; + + if (service == NULL) + service = strdup(readline("Enter GSSAPI service name (e.g. \"imap\"): ")); + + if (hostname == NULL) + hostname = strdup(readline("Enter hostname of server: ")); + + if (srvnamelen && servicename == NULL) + servicename = strdup(readline("Enter generic server name (optional): ")); + + if (service == NULL) + return GSASL_AUTHENTICATION_ERROR; + + if (hostname == NULL) + return GSASL_AUTHENTICATION_ERROR; + + if (srvnamelen && servicename == NULL) + return GSASL_AUTHENTICATION_ERROR; + + rc = utf8cpy(srv, srvlen, service, strlen(service)); + if (rc != GSASL_OK) + return rc; + + rc = utf8cpy(host, hostlen, hostname, strlen(hostname)); + if (rc != GSASL_OK) + return rc; + + if (srvnamelen) + { + rc = utf8cpy(srvname, srvnamelen, servicename, strlen(servicename)); + if (rc != GSASL_OK) + return rc; + } + + return GSASL_OK; +} + +int +client_callback_passcode (Gsasl_session_ctx *ctx, + char *out, + size_t *outlen) +{ + int rc; + + if (passcode == NULL) + passcode = strdup(readline("Enter passcode: ")); + + if (passcode == NULL) + return GSASL_AUTHENTICATION_ERROR; + + rc = utf8cpy(out, outlen, passcode, strlen(passcode)); + if (rc != GSASL_OK) + return rc; + + return GSASL_OK; +} + +Gsasl_qop +client_callback_qop (Gsasl_session_ctx *ctx, + Gsasl_qop serverqops) +{ + return GSASL_QOP_AUTH; +} + +int +client_callback_maxbuf (Gsasl_session_ctx *ctx, + int servermaxbuf) +{ + return maxbuf; +} + +/* Server callbacks */ + +int +server_callback_cram_md5 (Gsasl_session_ctx *ctx, + char *username, + char *challenge, + char *response) +{ + char *data; + + printf("User: `%s'\nChallenge: `%s'\nResponse: `%s'\n", + username, challenge, response); + + data = readline("Admit user? (y/n) "); + + if (*data == 'y' || *data == 'Y') + return GSASL_OK; + else + return GSASL_AUTHENTICATION_ERROR; +} + +int +server_callback_anonymous (Gsasl_session_ctx *ctx, + const char *message) +{ + char *data; + + printf("Anonymous user: `%s'\n", message); + + data = readline("Admit user? (y/n) "); + + if (*data == 'y' || *data == 'Y') + return GSASL_OK; + else + return GSASL_AUTHENTICATION_ERROR; +} + +Gsasl_qop +server_callback_qop (Gsasl_session_ctx *ctx) +{ + return GSASL_QOP_AUTH | GSASL_QOP_AUTH_INT | GSASL_QOP_AUTH_CONF; +} + +int +server_callback_maxbuf (Gsasl_session_ctx *ctx) +{ + return maxbuf; +} + +int +server_callback_realm (Gsasl_session_ctx *ctx, + char *out, + size_t *outlen, + size_t nth) +{ + int rc; + + if (nrealms == 0) + { + struct hostent *he; + char hostname[BUFSIZ]; + + rc = gethostname(hostname, BUFSIZ); + hostname[BUFSIZ - 1] = '\0'; + if (rc != 0) + return GSASL_NO_MORE_REALMS; + + he = gethostbyname(hostname); + if (he && strlen(he->h_name) < BUFSIZ) + strcpy(hostname, he->h_name); + + realms = malloc(sizeof(*realms)); + if (realms == NULL) + return GSASL_MALLOC_ERROR; + realms[nrealms++] = strdup(hostname); + } + + if (nth >= nrealms) + return GSASL_NO_MORE_REALMS; + + rc = utf8cpy(out, outlen, realms[nth], strlen(realms[nth])); + if (rc != GSASL_OK) + return rc; + + return GSASL_OK; +} + +int +server_callback_external (Gsasl_session_ctx *ctx) +{ + char *data; + + printf("Validation information provided out of band (e.g., TLS)\n"); + + data = readline("Admit user? (y/n) "); + + if (*data == 'y' || *data == 'Y') + return GSASL_OK; + else + return GSASL_AUTHENTICATION_ERROR; +} + +int +server_callback_validate (Gsasl_session_ctx *ctx, + char *authorization_id, + char *authentication_id, + char *password) +{ + char *data; + + if (authorization_id && strlen(authorization_id) > 0) + printf("Authorization ID: %s\n", authorization_id); + else + printf("No authorization ID\n"); + + if (authentication_id && strlen(authentication_id) > 0) + printf("Authentication ID: %s\n", authentication_id); + else + printf("No authentication ID\n"); + + if (password && strlen(password) > 0) + printf("Password: %s\n", password); + else + printf("No password\n"); + + data = readline("Admit user? (y/n) "); + + if (*data == 'y' || *data == 'Y') + return GSASL_OK; + else + return GSASL_AUTHENTICATION_ERROR; +} + +int +server_callback_retrieve (Gsasl_session_ctx *ctx, + char *authentication_id, + char *authorization_id, + char *realm, + char *key, + size_t *keylen) +{ + int rc; + + if (password == NULL) + password = strdup(readline("Enter password: ")); + + if (password == NULL) + return GSASL_AUTHENTICATION_ERROR; + + rc = utf8cpy(key, keylen, password, strlen(password)); + if (rc != GSASL_OK) + return rc; + + return GSASL_OK; +} + +int +server_callback_service (Gsasl_session_ctx *ctx, + char *srv, + size_t *srvlen, + char *host, + size_t *hostlen) +{ + int rc; + + if (service == NULL) + service = strdup(readline("Enter GSSAPI service name (e.g. \"imap\"): ")); + + if (hostname == NULL) + hostname = strdup(readline("Enter hostname of server: ")); + + if (service == NULL) + return GSASL_AUTHENTICATION_ERROR; + + if (hostname == NULL) + return GSASL_AUTHENTICATION_ERROR; + + rc = utf8cpy(srv, srvlen, service, strlen(service)); + if (rc != GSASL_OK) + return rc; + + rc = utf8cpy(host, hostlen, hostname, strlen(hostname)); + if (rc != GSASL_OK) + return rc; + + return GSASL_OK; +} + +int +server_callback_gssapi (Gsasl_session_ctx *ctx, + char *client_name, + char *authentication_id) +{ + char *data; + + if (client_name) + printf("GSSAPI user: %s\n", client_name); + + if (authentication_id) + printf("Authentication ID: %s\n", authentication_id); + + data = readline("Admit user? (y/n) "); + + if (*data == 'y' || *data == 'Y') + return GSASL_OK; + else + return GSASL_AUTHENTICATION_ERROR; +} diff --git a/src/callbacks.h b/src/callbacks.h new file mode 100644 index 0000000..c680e1b --- /dev/null +++ b/src/callbacks.h @@ -0,0 +1,121 @@ +/* callbacks.h function prototypes for gsasl callbacks + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Libgsasl 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _CALLBACKS_H +#define _CALLBACKS_H + +#include <gsasl.h> + +extern int +client_callback_anonymous (Gsasl_session_ctx *ctx, + char *out, + size_t *outlen); + +extern int +client_callback_authorization_id (Gsasl_session_ctx *ctx, + char *out, + size_t *outlen); + +extern int +client_callback_authentication_id (Gsasl_session_ctx *ctx, + char *out, + size_t *outlen); + +extern int +client_callback_password (Gsasl_session_ctx *ctx, + char *out, + size_t *outlen); + +extern int +client_callback_service (Gsasl_session_ctx *ctx, + char *srv, + size_t *srvlen, + char *host, + size_t *hostlen, + char *srvname, + size_t *srvnamelen); + +extern int +client_callback_passcode (Gsasl_session_ctx *ctx, + char *out, + size_t *outlen); + +extern Gsasl_qop +client_callback_qop (Gsasl_session_ctx *ctx, + Gsasl_qop serverqops); + +extern int +client_callback_maxbuf (Gsasl_session_ctx *ctx, + int servermaxbuf); +/* Server callbacks */ + +extern int +server_callback_cram_md5 (Gsasl_session_ctx *ctx, + char *username, + char *challenge, + char *response); + +extern int +server_callback_anonymous (Gsasl_session_ctx *ctx, + const char *message); + +extern Gsasl_qop +server_callback_qop (Gsasl_session_ctx *ctx); + +extern int +server_callback_maxbuf (Gsasl_session_ctx *ctx); + +extern int +server_callback_realm (Gsasl_session_ctx *ctx, + char *out, + size_t *outlen, + size_t nth); + +extern int +server_callback_external (Gsasl_session_ctx *ctx); + +extern int +server_callback_validate (Gsasl_session_ctx *ctx, + char *authorization_id, + char *authentication_id, + char *password); + +extern int +server_callback_retrieve (Gsasl_session_ctx *ctx, + char *authentication_id, + char *authorization_id, + char *realm, + char *key, + size_t *keylen); + +extern int +server_callback_service (Gsasl_session_ctx *ctx, + char *srv, + size_t *srvlen, + char *host, + size_t *hostlen); + +int +server_callback_gssapi (Gsasl_session_ctx *ctx, + char *clientname, + char *authentication_id); + +#endif /* _CALLBACKS_H */ diff --git a/src/gettext.h b/src/gettext.h new file mode 100644 index 0000000..8b262f4 --- /dev/null +++ b/src/gettext.h @@ -0,0 +1,69 @@ +/* Convenience header for conditional use of GNU <libintl.h>. + Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _LIBGETTEXT_H +#define _LIBGETTEXT_H 1 + +/* NLS can be disabled through the configure --disable-nls option. */ +#if ENABLE_NLS + +/* Get declarations of GNU message catalog functions. */ +# include <libintl.h> + +#else + +/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which + chokes if dcgettext is defined as a macro. So include it now, to make + later inclusions of <locale.h> a NOP. We don't include <libintl.h> + as well because people using "gettext.h" will not include <libintl.h>, + and also including <libintl.h> would fail on SunOS 4, whereas <locale.h> + is OK. */ +#if defined(__sun) +# include <locale.h> +#endif + +/* Disabled NLS. + The casts to 'const char *' serve the purpose of producing warnings + for invalid uses of the value returned from these functions. + On pre-ANSI systems without 'const', the config.h file is supposed to + contain "#define const". */ +# define gettext(Msgid) ((const char *) (Msgid)) +# define dgettext(Domainname, Msgid) ((const char *) (Msgid)) +# define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid)) +# define ngettext(Msgid1, Msgid2, N) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define dngettext(Domainname, Msgid1, Msgid2, N) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define textdomain(Domainname) ((const char *) (Domainname)) +# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) +# define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset)) + +#endif + +/* A pseudo function call that serves as a marker for the automated + extraction of messages, but does not call gettext(). The run-time + translation is done at a different place in the code. + The argument, String, should be a literal string. Concatenated strings + and other string expressions won't work. + The macro's expansion is not parenthesized, so that it is suitable as + initializer for static 'char[]' or 'const char[]' variables. */ +#define gettext_noop(String) String + +#endif /* _LIBGETTEXT_H */ diff --git a/src/gsasl.c b/src/gsasl.c new file mode 100644 index 0000000..8367166 --- /dev/null +++ b/src/gsasl.c @@ -0,0 +1,446 @@ +/* gsasl.c command line interface to libgsasl + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Libgsasl 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include <stdio.h> +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#ifdef HAVE_NETDB_H +#include <netdb.h> +#endif +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif +#ifdef HAVE_LOCALE_H +#include <locale.h> +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include <memory.h> +# endif +# include <string.h> +#endif +#if HAVE_STRINGS_H +# include <strings.h> +#endif +#include <argp.h> +#include <gsasl.h> + +#include "callbacks.h" + +#include "gettext.h" +#ifdef ENABLE_NLS +extern char *_gsasl_gettext (const char *str); +#define _(String) _gsasl_gettext (String) +#define gettext_noop(String) String +#define N_(String) gettext_noop (String) +#endif + +#define MAX_LINE_LENGTH BUFSIZ + +enum { + OPTION_CLIENT_MECHANISMS = 300, + OPTION_SERVER_MECHANISMS, + OPTION_PASSCODE, + OPTION_SERVICE, + OPTION_HOSTNAME, + OPTION_SERVICENAME, + OPTION_ENABLE_CRAM_MD5_VALIDATE, + OPTION_DISABLE_CLEARTEXT_VALIDATE +}; + +const char *argp_program_version = "gsasl (" PACKAGE_STRING ")"; +const char *argp_program_bug_address = PACKAGE_BUGREPORT; + +int mode; +int listmode; + +int silent; +int verbose; +char *anonymous_token; +char *authentication_id; +char *authorization_id; +char *password; +char *passcode; +char *mechanism; +char *service; +char *hostname; +char *servicename; +char **realms; +size_t nrealms; +int enable_cram_md5_validate; +int disable_cleartext_validate; +int maxbuf; + +static error_t +parse_opt (int key, char *arg, struct argp_state *state) +{ + switch (key) + { + case 'q': + silent = 1; + break; + + case 'v': + verbose = 1; + break; + + case 'a': + authentication_id = strdup(arg); + break; + + case 'z': + authorization_id = strdup(arg); + break; + + case 'p': + password = strdup(arg); + break; + + case 'n': + anonymous_token = strdup(arg); + break; + + case 'm': + mechanism = strdup(arg); + break; + + case 'r': + if (nrealms == 0) + realms = malloc(sizeof(*realms)); + else + realms = realloc(realms, sizeof(*realms)*(nrealms+1)); + if (realms == NULL) + argp_error (state, gsasl_strerror (GSASL_MALLOC_ERROR)); + realms[nrealms++] = strdup(arg); + break; + + case 'x': + maxbuf = strtoul(arg, NULL, 0); + break; + + case OPTION_PASSCODE: + passcode = strdup(arg); + break; + + case OPTION_SERVICE: + service = strdup(arg); + break; + + case OPTION_HOSTNAME: + hostname = strdup(arg); + break; + + case OPTION_SERVICENAME: + servicename = strdup(arg); + break; + + case OPTION_ENABLE_CRAM_MD5_VALIDATE: + enable_cram_md5_validate = 1; + break; + + case OPTION_DISABLE_CLEARTEXT_VALIDATE: + disable_cleartext_validate = 1; + break; + + case 'c': + case 's': + mode = key; + break; + + case OPTION_CLIENT_MECHANISMS: + case OPTION_SERVER_MECHANISMS: + listmode = key; + break; + + case ARGP_KEY_ARG: + argp_error (state, "too many arguments: `%s'", arg); + break; + + case ARGP_KEY_END: + if (mode == 0 && listmode == 0) + { + argp_state_help (state, stdout, ARGP_HELP_STD_HELP); + exit(0); + } + break; + + default: + return ARGP_ERR_UNKNOWN; + } + + return 0; +} + +static struct argp_option options[] = { + + {0, 0, 0, 0, "Commands:"}, + + {"client", 'c', 0, 0, "Act as client."}, + + {"server", 's', 0, 0, "Act as server."}, + + {"client-mechanisms", OPTION_CLIENT_MECHANISMS, 0, 0, + "Write name of supported client mechanisms separated by space to stdout."}, + + {"server-mechanisms", OPTION_SERVER_MECHANISMS, 0, 0, + "Write name of supported server mechanisms separated by space to stdout."}, + + {0, 0, 0, 0, "SASL options (prompted for if unspecified):", 500}, + + {"anonymous-token", 'n', "STRING", 0, + "Token for anonymous authentication (usually mail address)."}, + + {"authentication-id", 'a', "STRING", 0, + "Identity of credential owner."}, + + {"authorization-id", 'z', "STRING", 0, + "Identity to request service for."}, + + {"password", 'p', "STRING", 0, + "Password for authentication."}, + + {"mechanism", 'm', "STRING", 0, + "Mechanism to use."}, + + {"realm", 'r', "STRING", 0, + "Realm (may be given more than once iff server). Defaults to hostname."}, + + {"maxbuf", 'x', "NUMBER", 0, + "Indicate maximum buffer size (DIGEST-MD5 only)."}, + + {"passcode", OPTION_PASSCODE, "NUMBER", 0, + "Passcode for authentication (SECURID only)."}, + + {"service", OPTION_SERVICE, "STRING", 0, + "Set the requested service name (should be a registered GSSAPI host " + "based service name)."}, + + {"hostname", OPTION_HOSTNAME, "STRING", 0, + "Set the name of the server with the requested service."}, + + {"service-name", OPTION_SERVICENAME, "STRING", 0, + "Set the generic server name in case of a replicated server " + "(DIGEST-MD5 only)."}, + + {"enable-cram-md5-validate", OPTION_ENABLE_CRAM_MD5_VALIDATE, 0, 0, + "Validate CRAM-MD5 challenge and response interactively."}, + + {"disable-cleartext-validate", OPTION_DISABLE_CLEARTEXT_VALIDATE, 0, 0, + "Disable cleartext validate hook, forcing server to prompt for password."}, + + {0, 0, 0, 0, "Other options:", 1000}, + + {"verbose", 'v', 0, 0, "Produce verbose output."}, + + {"quiet", 'q', 0, 0, "Don't produce any diagnostic output."}, + + {"silent", 0, 0, OPTION_ALIAS}, + + {0} +}; + +static struct argp argp = { + options, + parse_opt, + 0, + "GSASL -- Command line interface to libgsasl" +}; + +int +main (int argc, char *argv[]) +{ + Gsasl_ctx *ctx = NULL; + int res; + + setlocale (LC_ALL, ""); + + argp_parse (&argp, argc, argv, 0, 0, NULL); + + res = gsasl_init (&ctx); + if (res != GSASL_OK) + { + fprintf(stderr, _("GSASL error (%d): %s\n"), res, gsasl_strerror(res)); + return 1; + } + + if (maxbuf != 0) + gsasl_client_callback_maxbuf_set (ctx, client_callback_maxbuf); + gsasl_client_callback_qop_set (ctx, client_callback_qop); + gsasl_client_callback_anonymous_set (ctx, client_callback_anonymous); + gsasl_client_callback_authentication_id_set (ctx, + client_callback_authentication_id); + gsasl_client_callback_authorization_id_set (ctx, + client_callback_authorization_id); + gsasl_client_callback_password_set (ctx, client_callback_password); + gsasl_client_callback_passcode_set (ctx, client_callback_passcode); + gsasl_client_callback_service_set (ctx, client_callback_service); + + gsasl_server_callback_realm_set (ctx, server_callback_realm); + gsasl_server_callback_qop_set (ctx, server_callback_qop); + if (maxbuf != 0) + gsasl_server_callback_maxbuf_set (ctx, server_callback_maxbuf); + if (enable_cram_md5_validate) + gsasl_server_callback_cram_md5_set (ctx, server_callback_cram_md5); + if (!disable_cleartext_validate) + gsasl_server_callback_validate_set (ctx, server_callback_validate); + gsasl_server_callback_retrieve_set (ctx, server_callback_retrieve); + gsasl_server_callback_anonymous_set (ctx, server_callback_anonymous); + gsasl_server_callback_external_set (ctx, server_callback_external); + gsasl_server_callback_service_set (ctx, server_callback_service); + gsasl_server_callback_gssapi_set (ctx, server_callback_gssapi); + + if (listmode == OPTION_CLIENT_MECHANISMS || + listmode == OPTION_SERVER_MECHANISMS) + { + char mechs[MAX_LINE_LENGTH]; + size_t mechslen; + + mechslen = sizeof(mechs); + if (listmode == OPTION_CLIENT_MECHANISMS) + res = gsasl_client_listmech (ctx, mechs, &mechslen); + else + res = gsasl_server_listmech (ctx, mechs, &mechslen); + + if (res != GSASL_OK) + { + fprintf(stderr, _("GSASL error (%d): %s\n"), res, gsasl_strerror(res)); + return 1; + } + + if (!silent) + fprintf(stderr, _("This %s supports the following mechanisms:\n"), + listmode == OPTION_CLIENT_MECHANISMS ? + _("client") : _("server")); + fprintf(stdout, "%s\n", mechs); + } + + if (mode == 'c' || mode == 's') + { + char input[MAX_LINE_LENGTH]; + char output[MAX_LINE_LENGTH]; + size_t output_len; + const char *mech; + Gsasl_session_ctx *xctx = NULL; + int res; + + if (mechanism) + { + mech = mechanism; + } + else if (mode == 'c') + { + if (!silent) + fprintf(stderr, _("Input SASL mechanism supported by server:\n")); + input[0] = '\0'; + fgets(input, MAX_LINE_LENGTH, stdin); + + mech = gsasl_client_suggest_mechanism (ctx, input); + if (mech == NULL) + { + fprintf(stderr, _("Cannot find mechanism...\n")); + return 1; + } + + if (!silent) + fprintf(stderr, _("Libgsasl wants to use:\n")); + fprintf(stdout, "%s\n", mech); + } + else + { + if (!silent) + fprintf(stderr, _("Chose SASL mechanisms:\n")); + input[0] = '\0'; + fgets(input, MAX_LINE_LENGTH, stdin); + input[strlen(input)-1] = '\0'; + + if (!silent) + fprintf(stderr, _("Chosed mechanism `%s'\n"), input); + mech = input; + } + + if (mode == 'c') + res = gsasl_client_start (ctx, mech, &xctx); + else + res = gsasl_server_start (ctx, mech, &xctx); + if (res != GSASL_OK) + { + fprintf(stderr, _("Libgsasl error (%d): %s\n"), + res, gsasl_strerror(res)); + return 1; + } + + input[0] = '\0'; + output[0] = '\0'; + output_len = sizeof(output); + do + { + if (mode == 'c') + res = gsasl_client_step_base64 (xctx, input, output, output_len); + else + res = gsasl_server_step_base64 (xctx, input, output, output_len); + + if (res != GSASL_NEEDS_MORE) + break; + + if (!silent) + fprintf(stderr, _("Output from %s:\n"), + mode == 'c' ? _("client") : _("server")); + fprintf(stdout, "%s\n", output); + + if (!silent) + fprintf(stderr, + _("Enter base64 data from %s (press RET if none):\n"), + mode == 'c' ? _("server") : _("client")); + + input[0] = '\0'; + fgets(input, MAX_LINE_LENGTH, stdin); + } + while (res == GSASL_NEEDS_MORE); + + if (res != GSASL_OK) + { + fprintf(stderr, _("Libgsasl error (%d): %s\n"), + res, gsasl_strerror(res)); + return 1; + } + + if (!silent) + { + if (mode == 'c') + fprintf(stderr, _("Client finished (server trusted)...\n")); + else + fprintf(stderr, _("Server finished (client trusted)...\n")); + } + + if (mode == 'c') + gsasl_client_finish (xctx); + else + gsasl_server_finish (xctx); + } + + gsasl_done(ctx); + + return 0; +} diff --git a/src/libcharset/Makefile.am b/src/libcharset/Makefile.am new file mode 100644 index 0000000..4e7a072 --- /dev/null +++ b/src/libcharset/Makefile.am @@ -0,0 +1,61 @@ +## Process this file with automake to produce Makefile.in + +INCLUDES = \ + -DLIBDIR=\"$(libdir)\" + +noinst_LTLIBRARIES = libcharset.la + +libcharset_la_SOURCES = \ + libcharset.h \ + localcharset.c + +EXTRA_DIST = \ + README \ + config.charset \ + ref-add.sed \ + ref-del.sed \ + ref-add.sin \ + ref-del.sin \ + update.sh \ + make-patch.sh + +charset_alias = $(DESTDIR)$(libdir)/charset.alias +charset_tmp = $(DESTDIR)$(libdir)/charset.tmp +install-exec-local: all-local + $(mkinstalldirs) $(DESTDIR)$(libdir) + if test -f $(charset_alias); then \ + sed -f ref-add.sed $(charset_alias) > $(charset_tmp) ; \ + $(INSTALL_DATA) $(charset_tmp) $(charset_alias) ; \ + rm -f $(charset_tmp) ; \ + else \ + if test @GLIBC21@ = no; then \ + sed -f ref-add.sed charset.alias > $(charset_tmp) ; \ + $(INSTALL_DATA) $(charset_tmp) $(charset_alias) ; \ + rm -f $(charset_tmp) ; \ + fi ; \ + fi + +uninstall-local: all-local + if test -f $(charset_alias); then \ + sed -f ref-del.sed $(charset_alias) > $(charset_tmp); \ + if grep '^# Packages using this file: $$' $(charset_tmp) \ + > /dev/null; then \ + rm -f $(charset_alias); \ + else \ + $(INSTALL_DATA) $(charset_tmp) $(charset_alias); \ + fi; \ + rm -f $(charset_tmp); \ + fi + +charset.alias: config.charset + $(SHELL) $(srcdir)/config.charset '@host@' > t-$@ + mv t-$@ $@ + +all-local: ref-add.sed ref-del.sed charset.alias + +SUFFIXES = .sed .sin +.sin.sed: + sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $< > t-$@ + mv t-$@ $@ + +CLEANFILES = charset.alias ref-add.sed ref-del.sed diff --git a/src/libcharset/README b/src/libcharset/README new file mode 100644 index 0000000..8e2e1e1 --- /dev/null +++ b/src/libcharset/README @@ -0,0 +1,46 @@ +The glib/libcharset/ directory from GLIB stolen and adapted for +libgsasl by Simon Josefsson. + +=== + +The sources are derived from Bruno Haible's libcharset library included +with libiconv: + + http//www.gnu.org/software/libiconv + +The 'update.sh' script in this directory, when pointed at +the original sources updates the files in this directory +(and elsewhere in the GLib distribution) to the new version + +The 'make-patch.sh' script in this directory regenerates +the patch files included in this directory from a copy +of the pristine sources and the files in this directory. + +The license on the portions from libiconv portions is reproduced +below. + +Owen Taylor +26 September 2001 + +==== + +/* Determine a canonical name for the current locale's character encoding. + + Copyright (C) 2000-2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Written by Bruno Haible <haible@clisp.cons.org>. */ diff --git a/src/libcharset/config.charset b/src/libcharset/config.charset new file mode 100755 index 0000000..4f98b5b --- /dev/null +++ b/src/libcharset/config.charset @@ -0,0 +1,466 @@ +#! /bin/sh +# Output a system dependent table of character encoding aliases. +# +# Copyright (C) 2000-2002 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. +# +# The table consists of lines of the form +# ALIAS CANONICAL +# +# ALIAS is the (system dependent) result of "nl_langinfo (CODESET)". +# ALIAS is compared in a case sensitive way. +# +# CANONICAL is the GNU canonical name for this character encoding. +# It must be an encoding supported by libiconv. Support by GNU libc is +# also desirable. CANONICAL is case insensitive. Usually an upper case +# MIME charset name is preferred. +# The current list of GNU canonical charset names is as follows. +# +# name used by which systems a MIME name? +# ASCII, ANSI_X3.4-1968 glibc solaris freebsd +# ISO-8859-1 glibc aix hpux irix osf solaris freebsd yes +# ISO-8859-2 glibc aix hpux irix osf solaris freebsd yes +# ISO-8859-3 glibc solaris yes +# ISO-8859-4 osf solaris freebsd yes +# ISO-8859-5 glibc aix hpux irix osf solaris freebsd yes +# ISO-8859-6 glibc aix hpux solaris yes +# ISO-8859-7 glibc aix hpux irix osf solaris yes +# ISO-8859-8 glibc aix hpux osf solaris yes +# ISO-8859-9 glibc aix hpux irix osf solaris yes +# ISO-8859-13 glibc +# ISO-8859-14 glibc +# ISO-8859-15 glibc aix osf solaris freebsd +# KOI8-R glibc solaris freebsd yes +# KOI8-U glibc freebsd yes +# KOI8-T glibc +# CP437 dos +# CP775 dos +# CP850 aix osf dos +# CP852 dos +# CP855 dos +# CP856 aix +# CP857 dos +# CP861 dos +# CP862 dos +# CP864 dos +# CP865 dos +# CP866 freebsd dos +# CP869 dos +# CP874 woe32 dos +# CP922 aix +# CP932 aix woe32 dos +# CP943 aix +# CP949 osf woe32 dos +# CP950 woe32 dos +# CP1046 aix +# CP1124 aix +# CP1125 dos +# CP1129 aix +# CP1250 woe32 +# CP1251 glibc woe32 +# CP1252 aix woe32 +# CP1253 woe32 +# CP1254 woe32 +# CP1255 glibc woe32 +# CP1256 woe32 +# CP1257 woe32 +# GB2312 glibc aix hpux irix solaris freebsd yes +# EUC-JP glibc aix hpux irix osf solaris freebsd yes +# EUC-KR glibc aix hpux irix osf solaris freebsd yes +# EUC-TW glibc aix hpux irix osf solaris +# BIG5 glibc aix hpux osf solaris freebsd yes +# BIG5-HKSCS glibc solaris +# GBK glibc aix osf solaris woe32 dos +# GB18030 glibc solaris +# SHIFT_JIS hpux osf solaris freebsd yes +# JOHAB glibc solaris woe32 +# TIS-620 glibc aix hpux osf solaris +# VISCII glibc yes +# TCVN5712-1 glibc +# GEORGIAN-PS glibc +# HP-ROMAN8 hpux +# HP-ARABIC8 hpux +# HP-GREEK8 hpux +# HP-HEBREW8 hpux +# HP-TURKISH8 hpux +# HP-KANA8 hpux +# DEC-KANJI osf +# DEC-HANYU osf +# UTF-8 glibc aix hpux osf solaris yes +# +# Note: Names which are not marked as being a MIME name should not be used in +# Internet protocols for information interchange (mail, news, etc.). +# +# Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications +# must understand both names and treat them as equivalent. +# +# The first argument passed to this file is the canonical host specification, +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM + +host="$1" +os=`echo "$host" | sed -e 's/^[^-]*-[^-]*-\(.*\)$/\1/'` +echo "# This file contains a table of character encoding aliases," +echo "# suitable for operating system '${os}'." +echo "# It was automatically generated from config.charset." +# List of references, updated during installation: +echo "# Packages using this file: " +case "$os" in + linux* | *-gnu*) + # With glibc-2.1 or newer, we don't need any canonicalization, + # because glibc has iconv and both glibc and libiconv support all + # GNU canonical names directly. Therefore, the Makefile does not + # need to install the alias file at all. + # The following applies only to glibc-2.0.x and older libcs. + echo "ISO_646.IRV:1983 ASCII" + ;; + aix*) + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-6 ISO-8859-6" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-8 ISO-8859-8" + echo "ISO8859-9 ISO-8859-9" + echo "ISO8859-15 ISO-8859-15" + echo "IBM-850 CP850" + echo "IBM-856 CP856" + echo "IBM-921 ISO-8859-13" + echo "IBM-922 CP922" + echo "IBM-932 CP932" + echo "IBM-943 CP943" + echo "IBM-1046 CP1046" + echo "IBM-1124 CP1124" + echo "IBM-1129 CP1129" + echo "IBM-1252 CP1252" + echo "IBM-eucCN GB2312" + echo "IBM-eucJP EUC-JP" + echo "IBM-eucKR EUC-KR" + echo "IBM-eucTW EUC-TW" + echo "big5 BIG5" + echo "GBK GBK" + echo "TIS-620 TIS-620" + echo "UTF-8 UTF-8" + ;; + hpux*) + echo "iso88591 ISO-8859-1" + echo "iso88592 ISO-8859-2" + echo "iso88595 ISO-8859-5" + echo "iso88596 ISO-8859-6" + echo "iso88597 ISO-8859-7" + echo "iso88598 ISO-8859-8" + echo "iso88599 ISO-8859-9" + echo "iso885915 ISO-8859-15" + echo "roman8 HP-ROMAN8" + echo "arabic8 HP-ARABIC8" + echo "greek8 HP-GREEK8" + echo "hebrew8 HP-HEBREW8" + echo "turkish8 HP-TURKISH8" + echo "kana8 HP-KANA8" + echo "tis620 TIS-620" + echo "big5 BIG5" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + echo "hp15CN GB2312" + #echo "ccdc ?" # what is this? + echo "SJIS SHIFT_JIS" + echo "utf8 UTF-8" + ;; + irix*) + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-9 ISO-8859-9" + echo "eucCN GB2312" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + ;; + osf*) + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-4 ISO-8859-4" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-8 ISO-8859-8" + echo "ISO8859-9 ISO-8859-9" + echo "ISO8859-15 ISO-8859-15" + echo "cp850 CP850" + echo "big5 BIG5" + echo "dechanyu DEC-HANYU" + echo "dechanzi GB2312" + echo "deckanji DEC-KANJI" + echo "deckorean EUC-KR" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + echo "GBK GBK" + echo "KSC5601 CP949" + echo "sdeckanji EUC-JP" + echo "SJIS SHIFT_JIS" + echo "TACTIS TIS-620" + echo "UTF-8 UTF-8" + ;; + solaris*) + echo "646 ASCII" + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-3 ISO-8859-3" + echo "ISO8859-4 ISO-8859-4" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-6 ISO-8859-6" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-8 ISO-8859-8" + echo "ISO8859-9 ISO-8859-9" + echo "ISO8859-15 ISO-8859-15" + echo "koi8-r KOI8-R" + echo "BIG5 BIG5" + echo "Big5-HKSCS BIG5-HKSCS" + echo "gb2312 GB2312" + echo "GBK GBK" + echo "GB18030 GB18030" + echo "cns11643 EUC-TW" + echo "5601 EUC-KR" + echo "ko_KR.johap92 JOHAB" + echo "eucJP EUC-JP" + echo "PCK SHIFT_JIS" + echo "TIS620.2533 TIS-620" + #echo "sun_eu_greek ?" # what is this? + echo "UTF-8 UTF-8" + ;; + freebsd* | os2*) + # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore + # localcharset.c falls back to using the full locale name + # from the environment variables. + # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just + # reuse FreeBSD's locale data for OS/2. + echo "C ASCII" + echo "US-ASCII ASCII" + for l in la_LN lt_LN; do + echo "$l.ASCII ASCII" + done + for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ + fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \ + lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do + echo "$l.ISO_8859-1 ISO-8859-1" + echo "$l.DIS_8859-15 ISO-8859-15" + done + for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do + echo "$l.ISO_8859-2 ISO-8859-2" + done + for l in la_LN lt_LT; do + echo "$l.ISO_8859-4 ISO-8859-4" + done + for l in ru_RU ru_SU; do + echo "$l.KOI8-R KOI8-R" + echo "$l.ISO_8859-5 ISO-8859-5" + echo "$l.CP866 CP866" + done + echo "uk_UA.KOI8-U KOI8-U" + echo "zh_TW.BIG5 BIG5" + echo "zh_TW.Big5 BIG5" + echo "zh_CN.EUC GB2312" + echo "ja_JP.EUC EUC-JP" + echo "ja_JP.SJIS SHIFT_JIS" + echo "ja_JP.Shift_JIS SHIFT_JIS" + echo "ko_KR.EUC EUC-KR" + ;; + netbsd*) + echo "646 ASCII" + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-4 ISO-8859-4" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-15 ISO-8859-15" + echo "eucCN GB2312" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + echo "BIG5 BIG5" + echo "SJIS SHIFT_JIS" + ;; + beos*) + # BeOS has a single locale, and it has UTF-8 encoding. + echo "* UTF-8" + ;; + msdosdjgpp*) + # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore + # localcharset.c falls back to using the full locale name + # from the environment variables. + echo "#" + echo "# The encodings given here may not all be correct." + echo "# If you find that the encoding given for your language and" + echo "# country is not the one your DOS machine actually uses, just" + echo "# correct it in this file, and send a mail to" + echo "# Juan Manuel Guerrero <st001906@hrz1.hrz.tu-darmstadt.de>" + echo "# and Bruno Haible <bruno@clisp.org>." + echo "#" + echo "C ASCII" + # ISO-8859-1 languages + echo "ca CP850" + echo "ca_ES CP850" + echo "da CP865" # not CP850 ?? + echo "da_DK CP865" # not CP850 ?? + echo "de CP850" + echo "de_AT CP850" + echo "de_CH CP850" + echo "de_DE CP850" + echo "en CP850" + echo "en_AU CP850" # not CP437 ?? + echo "en_CA CP850" + echo "en_GB CP850" + echo "en_NZ CP437" + echo "en_US CP437" + echo "en_ZA CP850" # not CP437 ?? + echo "es CP850" + echo "es_AR CP850" + echo "es_BO CP850" + echo "es_CL CP850" + echo "es_CO CP850" + echo "es_CR CP850" + echo "es_CU CP850" + echo "es_DO CP850" + echo "es_EC CP850" + echo "es_ES CP850" + echo "es_GT CP850" + echo "es_HN CP850" + echo "es_MX CP850" + echo "es_NI CP850" + echo "es_PA CP850" + echo "es_PY CP850" + echo "es_PE CP850" + echo "es_SV CP850" + echo "es_UY CP850" + echo "es_VE CP850" + echo "et CP850" + echo "et_EE CP850" + echo "eu CP850" + echo "eu_ES CP850" + echo "fi CP850" + echo "fi_FI CP850" + echo "fr CP850" + echo "fr_BE CP850" + echo "fr_CA CP850" + echo "fr_CH CP850" + echo "fr_FR CP850" + echo "ga CP850" + echo "ga_IE CP850" + echo "gd CP850" + echo "gd_GB CP850" + echo "gl CP850" + echo "gl_ES CP850" + echo "id CP850" # not CP437 ?? + echo "id_ID CP850" # not CP437 ?? + echo "is CP861" # not CP850 ?? + echo "is_IS CP861" # not CP850 ?? + echo "it CP850" + echo "it_CH CP850" + echo "it_IT CP850" + echo "lt CP775" + echo "lt_LT CP775" + echo "lv CP775" + echo "lv_LV CP775" + echo "nb CP865" # not CP850 ?? + echo "nb_NO CP865" # not CP850 ?? + echo "nl CP850" + echo "nl_BE CP850" + echo "nl_NL CP850" + echo "nn CP865" # not CP850 ?? + echo "nn_NO CP865" # not CP850 ?? + echo "no CP865" # not CP850 ?? + echo "no_NO CP865" # not CP850 ?? + echo "pt CP850" + echo "pt_BR CP850" + echo "pt_PT CP850" + echo "sv CP850" + echo "sv_SE CP850" + # ISO-8859-2 languages + echo "cs CP852" + echo "cs_CZ CP852" + echo "hr CP852" + echo "hr_HR CP852" + echo "hu CP852" + echo "hu_HU CP852" + echo "pl CP852" + echo "pl_PL CP852" + echo "ro CP852" + echo "ro_RO CP852" + echo "sk CP852" + echo "sk_SK CP852" + echo "sl CP852" + echo "sl_SI CP852" + echo "sq CP852" + echo "sq_AL CP852" + echo "sr CP852" # CP852 or CP866 or CP855 ?? + echo "sr_YU CP852" # CP852 or CP866 or CP855 ?? + # ISO-8859-3 languages + echo "mt CP850" + echo "mt_MT CP850" + # ISO-8859-5 languages + echo "be CP866" + echo "be_BE CP866" + echo "bg CP866" # not CP855 ?? + echo "bg_BG CP866" # not CP855 ?? + echo "mk CP866" # not CP855 ?? + echo "mk_MK CP866" # not CP855 ?? + echo "ru CP866" + echo "ru_RU CP866" + echo "uk CP1125" + echo "uk_UA CP1125" + # ISO-8859-6 languages + echo "ar CP864" + echo "ar_AE CP864" + echo "ar_DZ CP864" + echo "ar_EG CP864" + echo "ar_IQ CP864" + echo "ar_IR CP864" + echo "ar_JO CP864" + echo "ar_KW CP864" + echo "ar_MA CP864" + echo "ar_OM CP864" + echo "ar_QA CP864" + echo "ar_SA CP864" + echo "ar_SY CP864" + # ISO-8859-7 languages + echo "el CP869" + echo "el_GR CP869" + # ISO-8859-8 languages + echo "he CP862" + echo "he_IL CP862" + # ISO-8859-9 languages + echo "tr CP857" + echo "tr_TR CP857" + # Japanese + echo "ja CP932" + echo "ja_JP CP932" + # Chinese + echo "zh_CN GBK" + echo "zh_TW CP950" # not CP938 ?? + # Korean + echo "kr CP949" # not CP934 ?? + echo "kr_KR CP949" # not CP934 ?? + # Thai + echo "th CP874" + echo "th_TH CP874" + # Other + echo "eo CP850" + echo "eo_EO CP850" + ;; +esac diff --git a/src/libcharset/libcharset-gsasl.patch b/src/libcharset/libcharset-gsasl.patch new file mode 100644 index 0000000..2ec1f7b --- /dev/null +++ b/src/libcharset/libcharset-gsasl.patch @@ -0,0 +1,45 @@ +# Patch against libcharset version 1.1 +--- /home/jas/src/libiconv/libcharset//lib/localcharset.c 2002-05-10 12:40:10.000000000 +0200 ++++ localcharset.c 2002-10-07 00:15:05.000000000 +0200 +@@ -102,8 +102,8 @@ + static const char * volatile charset_aliases; + + /* Return a pointer to the contents of the charset.alias file. */ +-static const char * +-get_charset_aliases () ++const char * ++_gsasl_locale_get_charset_aliases () + { + const char *cp; + +@@ -239,7 +239,7 @@ + STATIC + #endif + const char * +-locale_charset () ++_gsasl_locale_charset () + { + const char *codeset; + const char *aliases; +@@ -349,7 +349,7 @@ + codeset = ""; + + /* Resolve alias. */ +- for (aliases = get_charset_aliases (); ++ for (aliases = _gsasl_locale_get_charset_aliases (); + *aliases != '\0'; + aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) + if (strcmp (codeset, aliases) == 0 +--- /home/jas/src/libiconv/libcharset//include/libcharset.h.in 2001-03-27 15:35:32.000000000 +0200 ++++ libcharset.h 2002-10-07 00:15:05.000000000 +0200 +@@ -30,8 +30,8 @@ + The result must not be freed; it is statically allocated. + If the canonical name cannot be determined, the result is a non-canonical + name. */ +-extern const char * locale_charset (void); +- ++extern const char * _gsasl_locale_charset (void); ++extern const char * _gsasl_locale_get_charset_aliases (void); + + #ifdef __cplusplus + } diff --git a/src/libcharset/libcharset.h b/src/libcharset/libcharset.h new file mode 100644 index 0000000..21569e5 --- /dev/null +++ b/src/libcharset/libcharset.h @@ -0,0 +1,41 @@ +/* Copyright (C) 2000-2001 Free Software Foundation, Inc. + This file is part of the GNU CHARSET Library. + + The GNU CHARSET Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU CHARSET 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with the GNU CHARSET Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _LIBCHARSET_H +#define _LIBCHARSET_H + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Determine the current locale's character encoding, and canonicalize it + into one of the canonical names listed in config.charset. + The result must not be freed; it is statically allocated. + If the canonical name cannot be determined, the result is a non-canonical + name. */ +extern const char * _gsasl_locale_charset (void); +extern const char * _gsasl_locale_get_charset_aliases (void); + +#ifdef __cplusplus +} +#endif + + +#endif /* _LIBCHARSET_H */ diff --git a/src/libcharset/localcharset.c b/src/libcharset/localcharset.c new file mode 100644 index 0000000..e24d33e --- /dev/null +++ b/src/libcharset/localcharset.c @@ -0,0 +1,369 @@ +/* Determine a canonical name for the current locale's character encoding. + + Copyright (C) 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Written by Bruno Haible <bruno@clisp.org>. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#if HAVE_STDDEF_H +# include <stddef.h> +#endif + +#include <stdio.h> +#if HAVE_STRING_H +# include <string.h> +#else +# include <strings.h> +#endif +#if HAVE_STDLIB_H +# include <stdlib.h> +#endif + +#if defined _WIN32 || defined __WIN32__ +# undef WIN32 /* avoid warning on mingw32 */ +# define WIN32 +#endif + +#if defined __EMX__ +/* Assume EMX program runs on OS/2, even if compiled under DOS. */ +# define OS2 +#endif + +#if !defined WIN32 +# if HAVE_LANGINFO_CODESET +# include <langinfo.h> +# else +# if HAVE_SETLOCALE +# include <locale.h> +# endif +# endif +#elif defined WIN32 +# define WIN32_LEAN_AND_MEAN +# include <windows.h> +#endif +#if defined OS2 +# define INCL_DOS +# include <os2.h> +#endif + +#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ + /* Win32, OS/2, DOS */ +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +#endif + +#ifndef DIRECTORY_SEPARATOR +# define DIRECTORY_SEPARATOR '/' +#endif + +#ifndef ISSLASH +# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) +#endif + +#ifdef HAVE_GETC_UNLOCKED +# undef getc +# define getc getc_unlocked +#endif + +#ifdef __cplusplus +/* When compiling with "gcc -x c++", produce a function with C linkage. */ +extern "C" const char * locale_charset (void); +#endif + +/* The following static variable is declared 'volatile' to avoid a + possible multithread problem in the function get_charset_aliases. If we + are running in a threaded environment, and if two threads initialize + 'charset_aliases' simultaneously, both will produce the same value, + and everything will be ok if the two assignments to 'charset_aliases' + are atomic. But I don't know what will happen if the two assignments mix. */ +#if __STDC__ != 1 +# define volatile /* empty */ +#endif +/* Pointer to the contents of the charset.alias file, if it has already been + read, else NULL. Its format is: + ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */ +static const char * volatile charset_aliases; + +/* Return a pointer to the contents of the charset.alias file. */ +const char * +_gsasl_locale_get_charset_aliases () +{ + const char *cp; + + cp = charset_aliases; + if (cp == NULL) + { +#if !defined WIN32 + FILE *fp; + const char *dir = LIBDIR; + const char *base = "charset.alias"; + char *file_name; + + /* Concatenate dir and base into freshly allocated file_name. */ + { + size_t dir_len = strlen (dir); + size_t base_len = strlen (base); + int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1])); + file_name = (char *) malloc (dir_len + add_slash + base_len + 1); + if (file_name != NULL) + { + memcpy (file_name, dir, dir_len); + if (add_slash) + file_name[dir_len] = DIRECTORY_SEPARATOR; + memcpy (file_name + dir_len + add_slash, base, base_len + 1); + } + } + + if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL) + /* Out of memory or file not found, treat it as empty. */ + cp = ""; + else + { + /* Parse the file's contents. */ + int c; + char buf1[50+1]; + char buf2[50+1]; + char *res_ptr = NULL; + size_t res_size = 0; + size_t l1, l2; + + for (;;) + { + c = getc (fp); + if (c == EOF) + break; + if (c == '\n' || c == ' ' || c == '\t') + continue; + if (c == '#') + { + /* Skip comment, to end of line. */ + do + c = getc (fp); + while (!(c == EOF || c == '\n')); + if (c == EOF) + break; + continue; + } + ungetc (c, fp); + if (fscanf (fp, "%50s %50s", buf1, buf2) < 2) + break; + l1 = strlen (buf1); + l2 = strlen (buf2); + if (res_size == 0) + { + res_size = l1 + 1 + l2 + 1; + res_ptr = (char *) malloc (res_size + 1); + } + else + { + res_size += l1 + 1 + l2 + 1; + res_ptr = (char *) realloc (res_ptr, res_size + 1); + } + if (res_ptr == NULL) + { + /* Out of memory. */ + res_size = 0; + break; + } + strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1); + strcpy (res_ptr + res_size - (l2 + 1), buf2); + } + fclose (fp); + if (res_size == 0) + cp = ""; + else + { + *(res_ptr + res_size) = '\0'; + cp = res_ptr; + } + } + + if (file_name != NULL) + free (file_name); + +#else + + /* To avoid the troubles of installing a separate file in the same + directory as the DLL and of retrieving the DLL's directory at + runtime, simply inline the aliases here. */ + +# if defined WIN32 + cp = "CP936" "\0" "GBK" "\0" + "CP1361" "\0" "JOHAB" "\0" + "CP20127" "\0" "ASCII" "\0" + "CP20866" "\0" "KOI8-R" "\0" + "CP21866" "\0" "KOI8-RU" "\0" + "CP28591" "\0" "ISO-8859-1" "\0" + "CP28592" "\0" "ISO-8859-2" "\0" + "CP28593" "\0" "ISO-8859-3" "\0" + "CP28594" "\0" "ISO-8859-4" "\0" + "CP28595" "\0" "ISO-8859-5" "\0" + "CP28596" "\0" "ISO-8859-6" "\0" + "CP28597" "\0" "ISO-8859-7" "\0" + "CP28598" "\0" "ISO-8859-8" "\0" + "CP28599" "\0" "ISO-8859-9" "\0" + "CP28605" "\0" "ISO-8859-15" "\0"; +# endif +#endif + + charset_aliases = cp; + } + + return cp; +} + +/* Determine the current locale's character encoding, and canonicalize it + into one of the canonical names listed in config.charset. + The result must not be freed; it is statically allocated. + If the canonical name cannot be determined, the result is a non-canonical + name. */ + +#ifdef STATIC +STATIC +#endif +const char * +_gsasl_locale_charset () +{ + const char *codeset; + const char *aliases; + +#if !(defined WIN32 || defined OS2) + +# if HAVE_LANGINFO_CODESET + + /* Most systems support nl_langinfo (CODESET) nowadays. */ + codeset = nl_langinfo (CODESET); + +# else + + /* On old systems which lack it, use setlocale or getenv. */ + const char *locale = NULL; + + /* But most old systems don't have a complete set of locales. Some + (like SunOS 4 or DJGPP) have only the C locale. Therefore we don't + use setlocale here; it would return "C" when it doesn't support the + locale name the user has set. */ +# if HAVE_SETLOCALE && 0 + locale = setlocale (LC_CTYPE, NULL); +# endif + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_ALL"); + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_CTYPE"); + if (locale == NULL || locale[0] == '\0') + locale = getenv ("LANG"); + } + } + + /* On some old systems, one used to set locale = "iso8859_1". On others, + you set it to "language_COUNTRY.charset". In any case, we resolve it + through the charset.alias file. */ + codeset = locale; + +# endif + +#elif defined WIN32 + + static char buf[2 + 10 + 1]; + + /* Woe32 has a function returning the locale's codepage as a number. */ + sprintf (buf, "CP%u", GetACP ()); + codeset = buf; + +#elif defined OS2 + + const char *locale; + static char buf[2 + 10 + 1]; + ULONG cp[3]; + ULONG cplen; + + /* Allow user to override the codeset, as set in the operating system, + with standard language environment variables. */ + locale = getenv ("LC_ALL"); + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_CTYPE"); + if (locale == NULL || locale[0] == '\0') + locale = getenv ("LANG"); + } + if (locale != NULL && locale[0] != '\0') + { + /* If the locale name contains an encoding after the dot, return it. */ + const char *dot = strchr (locale, '.'); + + if (dot != NULL) + { + const char *modifier; + + dot++; + /* Look for the possible @... trailer and remove it, if any. */ + modifier = strchr (dot, '@'); + if (modifier == NULL) + return dot; + if (modifier - dot < sizeof (buf)) + { + memcpy (buf, dot, modifier - dot); + buf [modifier - dot] = '\0'; + return buf; + } + } + + /* Resolve through the charset.alias file. */ + codeset = locale; + } + else + { + /* OS/2 has a function returning the locale's codepage as a number. */ + if (DosQueryCp (sizeof (cp), cp, &cplen)) + codeset = ""; + else + { + sprintf (buf, "CP%u", cp[0]); + codeset = buf; + } + } + +#endif + + if (codeset == NULL) + /* The canonical name cannot be determined. */ + codeset = ""; + + /* Resolve alias. */ + for (aliases = _gsasl_locale_get_charset_aliases (); + *aliases != '\0'; + aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) + if (strcmp (codeset, aliases) == 0 + || (aliases[0] == '*' && aliases[1] == '\0')) + { + codeset = aliases + strlen (aliases) + 1; + break; + } + + /* Don't return an empty string. GNU libc and GNU libiconv interpret + the empty string as denoting "the locale's character encoding", + thus GNU libiconv would call this function a second time. */ + if (codeset[0] == '\0') + codeset = "ASCII"; + + return codeset; +} diff --git a/src/libcharset/localcharset.c.orig b/src/libcharset/localcharset.c.orig new file mode 100644 index 0000000..2b1564e --- /dev/null +++ b/src/libcharset/localcharset.c.orig @@ -0,0 +1,369 @@ +/* Determine a canonical name for the current locale's character encoding. + + Copyright (C) 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Written by Bruno Haible <bruno@clisp.org>. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#if HAVE_STDDEF_H +# include <stddef.h> +#endif + +#include <stdio.h> +#if HAVE_STRING_H +# include <string.h> +#else +# include <strings.h> +#endif +#if HAVE_STDLIB_H +# include <stdlib.h> +#endif + +#if defined _WIN32 || defined __WIN32__ +# undef WIN32 /* avoid warning on mingw32 */ +# define WIN32 +#endif + +#if defined __EMX__ +/* Assume EMX program runs on OS/2, even if compiled under DOS. */ +# define OS2 +#endif + +#if !defined WIN32 +# if HAVE_LANGINFO_CODESET +# include <langinfo.h> +# else +# if HAVE_SETLOCALE +# include <locale.h> +# endif +# endif +#elif defined WIN32 +# define WIN32_LEAN_AND_MEAN +# include <windows.h> +#endif +#if defined OS2 +# define INCL_DOS +# include <os2.h> +#endif + +#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ + /* Win32, OS/2, DOS */ +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +#endif + +#ifndef DIRECTORY_SEPARATOR +# define DIRECTORY_SEPARATOR '/' +#endif + +#ifndef ISSLASH +# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) +#endif + +#ifdef HAVE_GETC_UNLOCKED +# undef getc +# define getc getc_unlocked +#endif + +#ifdef __cplusplus +/* When compiling with "gcc -x c++", produce a function with C linkage. */ +extern "C" const char * locale_charset (void); +#endif + +/* The following static variable is declared 'volatile' to avoid a + possible multithread problem in the function get_charset_aliases. If we + are running in a threaded environment, and if two threads initialize + 'charset_aliases' simultaneously, both will produce the same value, + and everything will be ok if the two assignments to 'charset_aliases' + are atomic. But I don't know what will happen if the two assignments mix. */ +#if __STDC__ != 1 +# define volatile /* empty */ +#endif +/* Pointer to the contents of the charset.alias file, if it has already been + read, else NULL. Its format is: + ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */ +static const char * volatile charset_aliases; + +/* Return a pointer to the contents of the charset.alias file. */ +static const char * +get_charset_aliases () +{ + const char *cp; + + cp = charset_aliases; + if (cp == NULL) + { +#if !defined WIN32 + FILE *fp; + const char *dir = LIBDIR; + const char *base = "charset.alias"; + char *file_name; + + /* Concatenate dir and base into freshly allocated file_name. */ + { + size_t dir_len = strlen (dir); + size_t base_len = strlen (base); + int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1])); + file_name = (char *) malloc (dir_len + add_slash + base_len + 1); + if (file_name != NULL) + { + memcpy (file_name, dir, dir_len); + if (add_slash) + file_name[dir_len] = DIRECTORY_SEPARATOR; + memcpy (file_name + dir_len + add_slash, base, base_len + 1); + } + } + + if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL) + /* Out of memory or file not found, treat it as empty. */ + cp = ""; + else + { + /* Parse the file's contents. */ + int c; + char buf1[50+1]; + char buf2[50+1]; + char *res_ptr = NULL; + size_t res_size = 0; + size_t l1, l2; + + for (;;) + { + c = getc (fp); + if (c == EOF) + break; + if (c == '\n' || c == ' ' || c == '\t') + continue; + if (c == '#') + { + /* Skip comment, to end of line. */ + do + c = getc (fp); + while (!(c == EOF || c == '\n')); + if (c == EOF) + break; + continue; + } + ungetc (c, fp); + if (fscanf (fp, "%50s %50s", buf1, buf2) < 2) + break; + l1 = strlen (buf1); + l2 = strlen (buf2); + if (res_size == 0) + { + res_size = l1 + 1 + l2 + 1; + res_ptr = (char *) malloc (res_size + 1); + } + else + { + res_size += l1 + 1 + l2 + 1; + res_ptr = (char *) realloc (res_ptr, res_size + 1); + } + if (res_ptr == NULL) + { + /* Out of memory. */ + res_size = 0; + break; + } + strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1); + strcpy (res_ptr + res_size - (l2 + 1), buf2); + } + fclose (fp); + if (res_size == 0) + cp = ""; + else + { + *(res_ptr + res_size) = '\0'; + cp = res_ptr; + } + } + + if (file_name != NULL) + free (file_name); + +#else + + /* To avoid the troubles of installing a separate file in the same + directory as the DLL and of retrieving the DLL's directory at + runtime, simply inline the aliases here. */ + +# if defined WIN32 + cp = "CP936" "\0" "GBK" "\0" + "CP1361" "\0" "JOHAB" "\0" + "CP20127" "\0" "ASCII" "\0" + "CP20866" "\0" "KOI8-R" "\0" + "CP21866" "\0" "KOI8-RU" "\0" + "CP28591" "\0" "ISO-8859-1" "\0" + "CP28592" "\0" "ISO-8859-2" "\0" + "CP28593" "\0" "ISO-8859-3" "\0" + "CP28594" "\0" "ISO-8859-4" "\0" + "CP28595" "\0" "ISO-8859-5" "\0" + "CP28596" "\0" "ISO-8859-6" "\0" + "CP28597" "\0" "ISO-8859-7" "\0" + "CP28598" "\0" "ISO-8859-8" "\0" + "CP28599" "\0" "ISO-8859-9" "\0" + "CP28605" "\0" "ISO-8859-15" "\0"; +# endif +#endif + + charset_aliases = cp; + } + + return cp; +} + +/* Determine the current locale's character encoding, and canonicalize it + into one of the canonical names listed in config.charset. + The result must not be freed; it is statically allocated. + If the canonical name cannot be determined, the result is a non-canonical + name. */ + +#ifdef STATIC +STATIC +#endif +const char * +locale_charset () +{ + const char *codeset; + const char *aliases; + +#if !(defined WIN32 || defined OS2) + +# if HAVE_LANGINFO_CODESET + + /* Most systems support nl_langinfo (CODESET) nowadays. */ + codeset = nl_langinfo (CODESET); + +# else + + /* On old systems which lack it, use setlocale or getenv. */ + const char *locale = NULL; + + /* But most old systems don't have a complete set of locales. Some + (like SunOS 4 or DJGPP) have only the C locale. Therefore we don't + use setlocale here; it would return "C" when it doesn't support the + locale name the user has set. */ +# if HAVE_SETLOCALE && 0 + locale = setlocale (LC_CTYPE, NULL); +# endif + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_ALL"); + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_CTYPE"); + if (locale == NULL || locale[0] == '\0') + locale = getenv ("LANG"); + } + } + + /* On some old systems, one used to set locale = "iso8859_1". On others, + you set it to "language_COUNTRY.charset". In any case, we resolve it + through the charset.alias file. */ + codeset = locale; + +# endif + +#elif defined WIN32 + + static char buf[2 + 10 + 1]; + + /* Woe32 has a function returning the locale's codepage as a number. */ + sprintf (buf, "CP%u", GetACP ()); + codeset = buf; + +#elif defined OS2 + + const char *locale; + static char buf[2 + 10 + 1]; + ULONG cp[3]; + ULONG cplen; + + /* Allow user to override the codeset, as set in the operating system, + with standard language environment variables. */ + locale = getenv ("LC_ALL"); + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_CTYPE"); + if (locale == NULL || locale[0] == '\0') + locale = getenv ("LANG"); + } + if (locale != NULL && locale[0] != '\0') + { + /* If the locale name contains an encoding after the dot, return it. */ + const char *dot = strchr (locale, '.'); + + if (dot != NULL) + { + const char *modifier; + + dot++; + /* Look for the possible @... trailer and remove it, if any. */ + modifier = strchr (dot, '@'); + if (modifier == NULL) + return dot; + if (modifier - dot < sizeof (buf)) + { + memcpy (buf, dot, modifier - dot); + buf [modifier - dot] = '\0'; + return buf; + } + } + + /* Resolve through the charset.alias file. */ + codeset = locale; + } + else + { + /* OS/2 has a function returning the locale's codepage as a number. */ + if (DosQueryCp (sizeof (cp), cp, &cplen)) + codeset = ""; + else + { + sprintf (buf, "CP%u", cp[0]); + codeset = buf; + } + } + +#endif + + if (codeset == NULL) + /* The canonical name cannot be determined. */ + codeset = ""; + + /* Resolve alias. */ + for (aliases = get_charset_aliases (); + *aliases != '\0'; + aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) + if (strcmp (codeset, aliases) == 0 + || (aliases[0] == '*' && aliases[1] == '\0')) + { + codeset = aliases + strlen (aliases) + 1; + break; + } + + /* Don't return an empty string. GNU libc and GNU libiconv interpret + the empty string as denoting "the locale's character encoding", + thus GNU libiconv would call this function a second time. */ + if (codeset[0] == '\0') + codeset = "ASCII"; + + return codeset; +} diff --git a/src/libcharset/make-patch.sh b/src/libcharset/make-patch.sh new file mode 100755 index 0000000..80ea507 --- /dev/null +++ b/src/libcharset/make-patch.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +if test $# = 1 ; then + ORIGINAL=$1 +else + echo "Usage: make-patch.sh /path/to/libcharset" 1>&2 + exit 1 +fi + +if test -f $ORIGINAL/lib/localcharset.c ; then : ; else + echo "Usage: make-patch.sh /path/to/libcharset" 1>&2 + exit 1 +fi + +VERSION=`grep VERSION= $ORIGINAL/configure.in | sed s/VERSION=//` + +echo "# Patch against libcharset version $VERSION" > libcharset-gsasl.patch + +for i in localcharset.c ref-add.sin ref-del.sin ; do + diff -u $ORIGINAL/lib/$i $i >> libcharset-gsasl.patch +done + +diff -u $ORIGINAL/include/libcharset.h.in libcharset.h >> libcharset-gsasl.patch diff --git a/src/libcharset/ref-add.sin b/src/libcharset/ref-add.sin new file mode 100644 index 0000000..8986029 --- /dev/null +++ b/src/libcharset/ref-add.sin @@ -0,0 +1,31 @@ +# Add this package to a list of references stored in a text file. +# +# Copyright (C) 2000 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. +# +# Written by Bruno Haible <bruno@clisp.org>. +# +/^# Packages using this file: / { + s/# Packages using this file:// + ta + :a + s/ @PACKAGE@ / @PACKAGE@ / + tb + s/ $/ @PACKAGE@ / + :b + s/^/# Packages using this file:/ +} diff --git a/src/libcharset/ref-del.sin b/src/libcharset/ref-del.sin new file mode 100644 index 0000000..3a55797 --- /dev/null +++ b/src/libcharset/ref-del.sin @@ -0,0 +1,26 @@ +# Remove this package from a list of references stored in a text file. +# +# Copyright (C) 2000 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. +# +# Written by Bruno Haible <bruno@clisp.org>. +# +/^# Packages using this file: / { + s/# Packages using this file:// + s/ @PACKAGE@ / / + s/^/# Packages using this file:/ +} diff --git a/src/libcharset/update.sh b/src/libcharset/update.sh new file mode 100755 index 0000000..8860dcd --- /dev/null +++ b/src/libcharset/update.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +if test $# = 1 ; then + ORIGINAL=$1 +else + echo "Usage: update.sh /path/to/libcharset" 1>&2 + exit 1 +fi + +if test -f $ORIGINAL/lib/localcharset.c ; then : ; else + echo "Usage: update.sh /path/to/libcharset" 1>&2 + exit 1 +fi + +VERSION=`grep VERSION= $ORIGINAL/configure.in | sed s/VERSION=//` + +for i in localcharset.c ref-add.sin ref-del.sin config.charset ; do + cp $ORIGINAL/lib/$i . +done + +cp $ORIGINAL/include/libcharset.h.in ./libcharset.h + +patch -p0 < libcharset-gsasl.patch diff --git a/src/libgsasl-config.in b/src/libgsasl-config.in new file mode 100644 index 0000000..ec4b54e --- /dev/null +++ b/src/libgsasl-config.in @@ -0,0 +1,100 @@ +#!/bin/sh +# Copyright (C) 2002 Simon Josefsson +# +# This file is free software; as a special exception the author gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. +# +# This file is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +exec_prefix_set=no + +libgsasl_libs="@LIBGSASL_LIBS@" +libgsasl_cflags="@LIBGSASL_CFLAGS@" + + +usage() +{ + cat <<EOF +Usage: libgsasl-config [OPTIONS] +Options: + [--prefix[=DIR]] + [--exec-prefix[=DIR]] + [--version] + [--libs] + [--cflags] +EOF + exit $1 +} + +if test $# -eq 0; then + usage 1 1>&2 +fi + +while test $# -gt 0; do + case "$1" in + -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + case $1 in + --prefix=*) + prefix=$optarg + if test $exec_prefix_set = no ; then + exec_prefix=$optarg + fi + ;; + --prefix) + echo_prefix=yes + ;; + --exec-prefix=*) + exec_prefix=$optarg + exec_prefix_set=yes + ;; + --exec-prefix) + echo_exec_prefix=yes + ;; + --version) + echo "@VERSION@" + exit 0 + ;; + --cflags) + echo_cflags=yes + ;; + --libs) + echo_libs=yes + ;; + *) + usage 1 1>&2 + ;; + esac + shift +done + +if test "$echo_prefix" = "yes"; then + echo $prefix +fi + +if test "$echo_exec_prefix" = "yes"; then + echo $exec_prefix +fi + +if test "$echo_cflags" = "yes"; then + if test "@includedir@" != "/usr/include" ; then + includes="-I@includedir@" + for i in $libgsasl_cflags ; do + if test "$i" = "-I@includedir@" ; then + includes="" + fi + done + fi + echo $includes $libgsasl_cflags +fi + +if test "$echo_libs" = "yes"; then + echo ${libgsasl_libs} +fi diff --git a/src/libgsasl.m4 b/src/libgsasl.m4 new file mode 100644 index 0000000..e00e3ea --- /dev/null +++ b/src/libgsasl.m4 @@ -0,0 +1,76 @@ +dnl Autoconf macros for libgsasl +dnl Copyright (C) 2002 Free Software Foundation, Inc. +dnl +dnl This file is free software; as a special exception the author gives +dnl unlimited permission to copy and/or distribute it, with or without +dnl modifications, as long as this notice is preserved. +dnl +dnl This file is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +dnl implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + +dnl AM_PATH_LIBGSASL([MINIMUM-VERSION, +dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]]) +dnl Test for liblibgsasl and define LIBGSASL_CFLAGS and LIBGSASL_LIBS +dnl +AC_DEFUN(AM_PATH_LIBGSASL, +[ AC_ARG_WITH(libgsasl-prefix, + AC_HELP_STRING([--with-libgsasl-prefix=PFX], + [prefix where LIBGSASL is installed (optional)]), + libgsasl_config_prefix="$withval", libgsasl_config_prefix="") + if test x$libgsasl_config_prefix != x ; then + libgsasl_config_args="$libgsasl_config_args --prefix=$libgsasl_config_prefix" + if test x${LIBGSASL_CONFIG+set} != xset ; then + LIBGSASL_CONFIG=$libgsasl_config_prefix/bin/libgsasl-config + fi + fi + + AC_PATH_PROG(LIBGSASL_CONFIG, libgsasl-config, no) + min_libgsasl_version=ifelse([$1], ,0.4.4,$1) + AC_MSG_CHECKING(for LIBGSASL - version >= $min_libgsasl_version) + ok=no + if test "$LIBGSASL_CONFIG" != "no" ; then + req_major=`echo $min_libgsasl_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'` + req_minor=`echo $min_libgsasl_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'` + req_micro=`echo $min_libgsasl_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'` + libgsasl_config_version=`$LIBGSASL_CONFIG $libgsasl_config_args --version` + major=`echo $libgsasl_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'` + minor=`echo $libgsasl_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'` + micro=`echo $libgsasl_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\3/'` + if test "$major" -gt "$req_major"; then + ok=yes + else + if test "$major" -eq "$req_major"; then + if test "$minor" -gt "$req_minor"; then + ok=yes + else + if test "$minor" -eq "$req_minor"; then + if test "$micro" -ge "$req_micro"; then + ok=yes + fi + fi + fi + fi + fi + fi + if test $ok = yes; then + LIBGSASL_CFLAGS=`$LIBGSASL_CONFIG $libgsasl_config_args --cflags` + LIBGSASL_LIBS=`$LIBGSASL_CONFIG $libgsasl_config_args --libs` + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + LIBGSASL_CFLAGS="" + LIBGSASL_LIBS="" + AC_MSG_RESULT(no) + ifelse([$3], , :, [$3]) + fi + AC_SUBST(LIBGSASL_CFLAGS) + AC_SUBST(LIBGSASL_LIBS) +]) diff --git a/tests/Makefile.am b/tests/Makefile.am new file mode 100644 index 0000000..77486ab --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1,32 @@ +## Process this file with automake to produce Makefile.in +# Copyright (C) 2002 Simon Josefsson. +# +# This file is part of Libgsasl. +# +# Libgsasl is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of +# the License, or (at your option) any later version. +# +# Libgsasl 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 Libgsasl; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +test_scripts = plain-client.sh +test_programs = unicode + +EXTRA_DIST = $(test_scripts) + +check_PROGRAMS = $(test_programs) + +TESTS = $(test_programs) $(test_scripts) + +INCLUDES = -I$(top_srcdir)/lib +LDADD = ../lib/libgsasl.la + +noinst_PROGRAMS = $(test_programs) diff --git a/tests/plain-client.sh b/tests/plain-client.sh new file mode 100755 index 0000000..1ffa4a9 --- /dev/null +++ b/tests/plain-client.sh @@ -0,0 +1,63 @@ +#! /bin/sh +# -*- coding: utf-8 -*- +# This script contains UTF-8 characters, tell shell about it. +# Maybe this isn't portable... +export LC_CTYPE=en_US.UTF-8 + +# simple test + +B64OUT=`echo | ../src/gsasl --client --mechanism PLAIN --authentication-id=foo --authorization-id=bar --password=baz --silent` + +if test "$B64OUT" != "YmFyAGZvbwBiYXo="; then + exit 1; +fi + +# NFKC on authentication ID + +B64OUT1=`echo | ../src/gsasl --client --mechanism PLAIN --authentication-id=a --authorization-id=bar --password=baz --silent` +B64OUT2=`echo | ../src/gsasl --client --mechanism PLAIN --authentication-id=ª --authorization-id=bar --password=baz --silent` + +if test "$B64OUT1" != "$B64OUT2"; then + exit 1; +fi + +B64OUT1=`echo | ../src/gsasl --client --mechanism PLAIN --authentication-id=ª --authorization-id=bar --password=baz --silent` +B64OUT2=`echo | ../src/gsasl --client --mechanism PLAIN --authentication-id=a --authorization-id=bar --password=baz --silent` + +if test "$B64OUT1" != "$B64OUT2"; then + exit 1; +fi + +# NFKC on authorization ID + +B64OUT1=`echo | ../src/gsasl --client --mechanism PLAIN --authentication-id=foo --authorization-id=ª --password=baz --silent` +B64OUT2=`echo | ../src/gsasl --client --mechanism PLAIN --authentication-id=foo --authorization-id=a --password=baz --silent` + +if test "$B64OUT1" != "$B64OUT2"; then + exit 1; +fi + +B64OUT1=`echo | ../src/gsasl --client --mechanism PLAIN --authentication-id=foo --authorization-id=a --password=baz --silent` +B64OUT2=`echo | ../src/gsasl --client --mechanism PLAIN --authentication-id=foo --authorization-id=ª --password=baz --silent` + +if test "$B64OUT1" != "$B64OUT2"; then + exit 1; +fi + +# NFKC on password + +B64OUT1=`echo | ../src/gsasl --client --mechanism PLAIN --authentication-id=foo --authorization-id=bar --password=ª --silent` +B64OUT2=`echo | ../src/gsasl --client --mechanism PLAIN --authentication-id=foo --authorization-id=bar --password=a --silent` + +if test "$B64OUT1" != "$B64OUT2"; then + exit 1; +fi + +B64OUT1=`echo | ../src/gsasl --client --mechanism PLAIN --authentication-id=foo --authorization-id=bar --password=a --silent` +B64OUT2=`echo | ../src/gsasl --client --mechanism PLAIN --authentication-id=foo --authorization-id=bar --password=ª --silent` + +if test "$B64OUT1" != "$B64OUT2"; then + exit 1; +fi + +exit 0 diff --git a/tests/unicode.c b/tests/unicode.c new file mode 100644 index 0000000..d452381 --- /dev/null +++ b/tests/unicode.c @@ -0,0 +1,182 @@ +/* unicode.c libgsasl self tests for unicode related functions + * Copyright (C) 2002 Simon Josefsson + * + * This file is part of libgsasl. + * + * Libgsasl is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Libgsasl 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with libgsasl; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include <stdio.h> +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif +#include <gsasl.h> + +#include <stdarg.h> + +static int debug = 0; +static int error_count = 0; +static int break_on_error = 0; + +static void +fail ( const char *format, ... ) +{ + va_list arg_ptr ; + + va_start( arg_ptr, format ) ; + vfprintf (stderr, format, arg_ptr ); + va_end(arg_ptr); + error_count++; + if (break_on_error) + exit(1); +} + +static void +escapeprint (char *str, + int len) +{ + int i; + + printf("\t ;; `"); + for (i = 0; i < len; i++) + if ((str[i] >= 'A' && str[i] <= 'Z') || + (str[i] >= 'a' && str[i] <= 'z') || + (str[i] >= '0' && str[i] <= '9') || + str[i] == '.') + printf("%c", str[i]); + else + printf("\\x%02x", str[i]); + printf("' (length %d bytes)\n", len); +} + +static void +hexprint ( char *str, + int len) +{ + int i; + + printf("\t ;; "); + for (i = 0; i < len; i++) + { + printf("%02x ", str[i]); + if ((i+1)%8 == 0) printf(" "); + if ((i+1)%16 == 0 && i+1 < len) printf("\n\t ;; "); + } +} + +static void +binprint ( char *str, + int len) +{ + int i; + + printf("\t ;; "); + for (i = 0; i < len; i++) + { + printf("%d%d%d%d%d%d%d%d ", + str[i] & 0x80 ? 1 : 0, + str[i] & 0x40 ? 1 : 0, + str[i] & 0x20 ? 1 : 0, + str[i] & 0x10 ? 1 : 0, + str[i] & 0x08 ? 1 : 0, + str[i] & 0x04 ? 1 : 0, + str[i] & 0x02 ? 1 : 0, + str[i] & 0x01 ? 1 : 0); + if ((i+1)%3 == 0) printf(" "); + if ((i+1)%6 == 0 && i+1 < len) printf("\n\t ;; "); + } +} + +struct nfkc { + char *in; + char *out; +} nfkc[] = { + { "\xC2\xB5", "\xCE\xBC" }, + { "\xC2\xAA", "\x61" } +}; + +int +main (int argc, char *argv[]) +{ + char *out; + int i; + + do + if (strcmp (argv[argc-1], "-v") == 0 || + strcmp (argv[argc-1], "--verbose") == 0) + debug = 1; + else if (strcmp (argv[argc-1], "-b") == 0 || + strcmp (argv[argc-1], "--break-on-error") == 0) + break_on_error = 1; + else if (strcmp (argv[argc-1], "-h") == 0 || + strcmp (argv[argc-1], "-?") == 0 || + strcmp (argv[argc-1], "--help") == 0) + { + printf("Usage: %s [-vbh?] [--verbose] [--break-on-error] [--help]\n", + argv[0]); + return 1; + } + while (argc-- > 1); + + for (i = 0; i < sizeof(nfkc) / sizeof(nfkc[0]); i++) + { + if (debug) + printf("NFKC entry %d\n", i); + + out = gsasl_utf8_nfkc_normalize (nfkc[i].in, strlen(nfkc[i].in)); + if (out == NULL) + { + fail("gsasl_utf8_nfkc_normalize() entry %d failed fatally\n", i); + continue; + } + + if (debug) + { + printf("in:\n"); + escapeprint(nfkc[i].in, strlen(nfkc[i].in)); + hexprint(nfkc[i].in, strlen(nfkc[i].in)); puts(""); + binprint(nfkc[i].in, strlen(nfkc[i].in)); puts(""); + + printf("out:\n"); + escapeprint(out, strlen(out)); + hexprint(out, strlen(out)); puts(""); + binprint(out, strlen(out)); puts(""); + + printf("expected out:\n"); + escapeprint(nfkc[i].out, strlen(nfkc[i].out)); + hexprint(nfkc[i].out, strlen(nfkc[i].out)); puts(""); + binprint(nfkc[i].out, strlen(nfkc[i].out)); puts(""); + } + + if (strlen(nfkc[i].out) != strlen(out) || + memcmp (nfkc[i].out, out, strlen(out)) != 0) + { + fail("gsasl_utf8_nfkc_normalize() entry %d failed\n", i); + if (debug) + printf("ERROR\n"); + } + else if (debug) + printf("OK\n"); + } + + if (debug) + printf("Libgsasl unicode self tests done with %d errors\n", error_count); + + return error_count ? 1 : 0; +} -- 2.11.4.GIT